累加器(ACC)是 CPU 的主要工作寄存器。 除了那些对存储器和寄存器的直接操作外,所有的 ALU 操作结果最终都要送入 ACC。ACC 支持单周期的数据传送操作、 加法运算、减法运算以及来自数据存储器的宽度为 32 位的比较运算, 它也可以接受 32 位乘法操作的运算结果。
ACC 有一个非常重要的特点就是它既可以被作为一个 32 位的寄存器使用,也可以被拆解成两个 16 位的寄存器 AH(高 16 位)和 AL(低 16 位), 它们可以被单独访问,甚至 AH 和 AL 的高 8 位和低 8 位也可以通过专用字节传送指令进行独立访问,这使得有效字节捆绑和解捆绑操作成为可能。
累加器还影响以下一些相关状态位:
溢出模式位(OVM)符号扩展模式位(SXM)测试/控制标志位(TC)进位标志位(C)零标志位(Z)负标志位(N) 溢出标志位(V)溢出计数位(OVC)下表显示了移位 AH,AL 或 ACC 内容的方法。
累加器中值的可用操作C28x CPU的硬件乘法器可以进行一个 16 位×16 位或者 32 位×32位的定点乘法运算。在进行 32 位×32 位乘法操作之前, XT 寄存器存放 32 位乘数。
XT 可被分为两个独立的16 位寄存器 T 和 TL, 在进行一个 16 位 × 16 位的乘法运算时, T 寄存器存放 16 位的乘数。 TL 寄存器可以被装载一个 16 位的有符号数, 这个数会被自动进行符号扩展以填充 32 位的 XT 寄存器。
乘积寄存器(P寄存器)通常用于存放乘法运算的 32 位结果。 它也可以直接被装入一个 16 位常数, 或者从一个 16 位/32 位的数据存储器、 16 位/32 位的可寻址 CPU 寄存器以及 32 位累加器中读取数据。
当某些指令访问 P,PH 或 PL 时,乘积寄存器 32 位都将被复制到 ALU 移位器块,其中桶形移位器可以执行左移,右移或不执行任何移位。 这些指令的移位器动作由状态寄存器 ST0 中的乘积移位模式(PM)位决定。
下表显示了可能的 PM 值和相应的乘积模式。 当执行左移时,低位用 0 填充。 当执行右移时,P 寄存器的值将被符号扩展。 使用 PH 或 PL 作为操作数的指令将忽略乘积移位模式。
在直接寻址模式,数据存储器以 64 个字的块(称为数据页)进行寻址,每 64 个字构成一个数据页,数据存储器的低 4M 字包含 65536 个数据页,标记为 0 至 65535 。
数据存储器的数据页在直接寻址方式下,16位数据页指针寄存器(DP)保存的是当前数据页的页编号。可以通过向 DP 加载新编号来更改数据页面。
使用DP不能访问4M字以上的数据存储器。
在 C2xLP 源兼容模式下工作时,将使用 7 位偏移,并且 DP 寄存器的最低有效位将被忽略。
堆栈指针(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 并不要求排成奇数或偶数地址, 排列由存储器或外设接口逻辑完成。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 的一个辅助寄存器。
PC 是 22 位的寄存器,其存放 CPU 正在操作指令的地址。
当流水线已满时,22位程序计数器(PC)始终指向当前正在处理的指令–刚到达流水线的解码2阶段的指令。 指令到达流水线的一旦指令到达了流水线的这一阶段,就无法通过中断将其从流水线中清除,而是会一直执行完才会响应中断。
当使用 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 寄存器。
IFR 的每个位代表一个中断源的中断请求, 当该位被置位时, 将向 CPU 申请中断, 而 IER 的各位则用于屏蔽或使能对应的中断请求, DBGIER 与 IER 功能类似, 但它只在 DSP 工作于实时仿真模式时被使用。 如果用户正在通过仿真器对应用程序进行调试并且 CPU 被暂停,此时那些在 DBGIER 中被使能的中断请求仍然能够被 CPU 响应, 这些在 DBGIER 中被使能的中断称为时间敏感中断(Time Critical)。 在使用 DBGIER 使能时间敏感中断时, IER 内对应的位也必须同时使能。 如果在实时仿真模式下, CPU 处于运行状态, 则标准的中断响应和处理机制被使用, 而 DBGIER 的内容被忽略。
