DSP TMS320C28x CPU 和指令设置参考【CPU】

一、CPU结构

二、CPU寄存器

1、累加器 Accumulator (ACC, AH, AL)

累加器(ACC)是 CPU 的主要工作寄存器。 除了那些对存储器和寄存器的直接操作外,所有的 ALU 操作结果最终都要送入 ACC。ACC 支持单周期的数据传送操作、 加法运算、减法运算以及来自数据存储器的宽度为 32 位的比较运算, 它也可以接受 32 位乘法操作的运算结果。

ACC 有一个非常重要的特点就是它既可以被作为一个 32 位的寄存器使用,也可以被拆解成两个 16 位的寄存器 AH(高 16 位)和 AL(低 16 位), 它们可以被单独访问,甚至 AH 和 AL 的高 8 位和低 8 位也可以通过专用字节传送指令进行独立访问,这使得有效字节捆绑和解捆绑操作成为可能。

累加器还影响以下一些相关状态位:

  1.  溢出模式位(OVM)
  2. 符号扩展模式位(SXM)
  3. 测试/控制标志位(TC)
  4. 进位标志位(C)
  5. 零标志位(Z)
  6. 负标志位(N)
  7.  溢出标志位(V)
  8. 溢出计数位(OVC)

下表显示了移位 AH,AL 或 ACC 内容的方法。

累加器中值的可用操作

2、乘数寄存器 Multiplicand Register (XT,T,TL)

C28x CPU的硬件乘法器可以进行一个 16 位×16 位或者 32 位×32位的定点乘法运算。在进行 32 位×32 位乘法操作之前, XT 寄存器存放 32 位乘数。

XT 可被分为两个独立的16 位寄存器 T 和 TL, 在进行一个 16 位 × 16 位的乘法运算时, T 寄存器存放 16 位的乘数。 TL 寄存器可以被装载一个 16 位的有符号数, 这个数会被自动进行符号扩展以填充 32 位的 XT 寄存器。 

3、乘积寄存器 Product Register (P, PH, PL)

乘积寄存器(P寄存器)通常用于存放乘法运算的 32 位结果。 它也可以直接被装入一个 16 位常数, 或者从一个 16 位/32 位的数据存储器、 16 位/32 位的可寻址 CPU 寄存器以及 32 位累加器中读取数据。 

当某些指令访问 P,PH 或 PL 时,乘积寄存器 32 位都将被复制到 ALU 移位器块,其中桶形移位器可以执行左移,右移或不执行任何移位。 这些指令的移位器动作由状态寄存器 ST0 中的乘积移位模式(PM)位决定

下表显示了可能的 PM 值和相应的乘积模式。 当执行左移时,低位用 0 填充。 当执行右移时,P 寄存器的值将被符号扩展。 使用 PH 或 PL 作为操作数的指令将忽略乘积移位模式。

4、数据页指针寄存器 Data Page Pointer (DP)

在直接寻址模式,数据存储器以 64 个字的块(称为数据页)进行寻址,每 64 个字构成一个数据页,数据存储器的低 4M 字包含 65536 个数据页,标记为 0 至 65535 。

数据存储器的数据页

在直接寻址方式下,16位数据页指针寄存器(DP)保存的是当前数据页的页编号。可以通过向 DP 加载新编号来更改数据页面。

使用DP不能访问4M字以上的数据存储器。

在 C2xLP 源兼容模式下工作时,将使用 7 位偏移,并且 DP 寄存器的最低有效位将被忽略。

5、堆栈指针 Stack Pointer (SP)

堆栈指针(SP)允许在数据存储器中使用软件堆栈。 堆栈指针为 16 位, 可以对数据空间的低 64K 字(数据存储器 0000H~FFFFH)进行寻址。使用 SP 时,将 32 位地址的高 6 位强制为 0。复位后,SP指向地址 0x00000400。

 堆栈操作说明如下:

  • 堆栈从低地址向高地址增长。
  • SP 总是指向堆栈中的下一个空单元。
  • 复位时, SP 被初始化指向地址 0400H
  • 将 32 位数值存入堆栈时, 先存入低 16 位, 然后将高 16 位存入下一个高地址中【小端格式
  • 当进行 32 位的操作读写 32 位的数值时, C28x CPU 期望存储器或外设接口逻辑把读写排成偶数地址。 例如, 如果 SP 包含一个奇数地址 0083H, 那么进行一个 32 位的读操作时, 将从地址 0082H 和 0083H 中读取数值。
  • 如果增加 SP 的值, 使它超过 FFFFH, 或者减少 SP 的值, 使它低于 0000H, 则表明 SP 已经溢出。 如果增加 SP 的值使它超过了 FFFFH, 它就会从 0000H 开始计数。 例如,如果 SP=FFFEH 而一个指令又使得 SP 加 2, 则结果就是 0000H。 当减少 SP 的值使它到达 0000H, 它就会重新从 FFFFH 计数。 例如, 如果 SP=0002H, 而一个指令又使 SP 减 4,则结果就是 FFFEH。
  • 当数值存入堆栈时, SP 并不要求排成奇数或偶数地址, 排列由存储器或外设接口逻辑完成。

6、通用/辅助寄存器 Auxiliary Registers (XAR0-XAR7, AR0-AR7)

CPU 提供了 8 个 32 位寄存器,可用作内存的指针或通用寄存器。 在间接寻址方式中, 它们存放指向数据存储器的指令操作数的地址指针, XAR0~XAR7 也可以作为通用目的寄存器来使用。

AR0 - AR7 可用作通用寄存器,用于循环控制和高效的 16 位比较。

当访问 AR0~AR7 时, 寄存器的高 16 位(AR0H~AR7H) 可能改变或不改变,这主要取决于所应用的指令。 

 AR0H~AR7H 只能作为 XAR0~XAR7 的一部分来读取, 不能单独进行访问。为了进行累加器操作,所有的 32 位都是有效的(@XARn)。 为了进行 16 位操作,可以使用低 16 位, 而高 16 位则被忽略(@ARn)。 也可以根据指令使 XAR0~XAR7 指向
程序存储器的任何值。

 许多指令允许用户访问 XAR0-XAR7 的 16 个最低有效位(LSB)。 如图所示,XAR0-XAR7 的16个LSB 被称为 AR0-AR7 的一个辅助寄存器。

7、程序计数器 Program Counter (PC)

PC 是 22 位的寄存器,其存放 CPU 正在操作指令的地址

当流水线已满时,22位程序计数器(PC)始终指向当前正在处理的指令–刚到达流水线的解码2阶段的指令。 指令到达流水线的一旦指令到达了流水线的这一阶段,就无法通过中断将其从流水线中清除,而是会一直执行完才会响应中断。

8、返回 PC 指针寄存器 Return Program Counter (RPC)

当使用 LCR 指令执行调用操作时,返回地址将保存在 RPC 寄存器中,而 RPC 中的旧值将保存在堆栈中(以16位方式分两次操作) ,22 位的函数入口地址将被装载到 PC 计数器, 从而使流程转入函数体中运行。当使用 LRETR 指令执行返回操作时,将从 RPC 寄存器中读取返回地址装载到 PC 计数器中,并将堆栈上的值写入 RPC 寄存器中(以16位方式分两次操作)。其他调用指令不使用RPC寄存器。 

C28x CPU 有两对用于子程序长调用的指令: LC 和 LRET, LCR 和 LRETR。 所谓长调用即调用指令直接使用 22 位的函数入口地址, 即可以在 0x00 0000~0x3F FFFF 的程序空间内进行操作。 这两对长调用指令中,LCR 和 LRETR 比 LC 和 LRET 的执行效率更高,而 LCR 和 LRETR 指令将使用 RPC 寄存器, 其他调用指令不使用 RPC 寄存器。

9、状态寄存器 Status Registers (ST0, ST1)

10、中断控制寄存器 Interrupt-Control Registers (IFR, IER, DBGIER)

 IFR 的每个位代表一个中断源的中断请求, 当该位被置位时, 将向 CPU 申请中断, 而 IER 的各位则用于屏蔽或使能对应的中断请求, DBGIER 与 IER 功能类似, 但它只在 DSP 工作于实时仿真模式时被使用。 如果用户正在通过仿真器对应用程序进行调试并且 CPU 被暂停,此时那些在 DBGIER 中被使能的中断请求仍然能够被 CPU 响应, 这些在 DBGIER 中被使能的中断称为时间敏感中断(Time Critical)。 在使用 DBGIER 使能时间敏感中断时, IER 内对应的位也必须同时使能。 如果在实时仿真模式下, CPU 处于运行状态, 则标准的中断响应和处理机制被使用, 而 DBGIER 的内容被忽略。

三、状态寄存器 ST0、ST1

四、程序流程

五、乘法操作

六、移位操作

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值