
2.4 ’C54x的中央处理器
中央处理器CPU是DSP器件的核心部件,它的性能直接关系到DSP器件的性能。对于所有的’C54x器件,中央处理器CPU是通用的。为了满足处理速度的要求,’C54x的CPU采用了流水线指令执行结构和相应的并行结构设计,使其能在一个指令周期内,高速地完成多项算术运算。CPU的基本组成如下:
● 40位算术逻辑运算单元(ALU);
● 2个40位累加器(ACCA、ACCB);
● 1个支持-16~31位移位的桶形移位寄存器;
● 乘法器-加法器单元(MAC);
● 比较、选择和存储单元(CSSU);
● 指数编码器;
● CPU状态和控制寄存器。
2.4.1 算术逻辑运算单元(ALU)
’C54x使用40位的算术逻辑运算单元和2个40位累加器,可完成宽范围的算术逻辑运算,对于大多数运算都能在单周期内完成。ALU的功能框图如图2.4.1所示。
’C54x 的大多数算术逻辑运算指令都是单周期指令,其运算结果通常自动送入目的累加器A或B。但在执行存储器到存储器的算术逻辑运算指令时(如ADDM、ANDM、ORM和XORM),其运算结果则存入指令指定的目的存储器。
1.ALU的输入和输出
根据输入源的不同,ALU采用不同的输入方式。
(1)ALU的X输入源
① 来自桶形移位寄存器输出的操作数。
② 来自数据总线DB中的操作数,通常为数据存储器的数值。
(2)ALU的Y输入源
① 来自累加器A或B中的数据;
② 来自数据总线CB中的操作数,通常为数据存储器的数值;
③ 来自T暂存器中的操作数。

图2.4.1 ALU的功能框图
(3)ALU输入数据的预处理
当16位数据存储器操作数通过数据总线DB或CB输入时,ALU将采用以下两种方式对操作数进行预处理。
① 若数据存储器操作数在低16位时,则:
当SXM=0时,高24位(39~16位)用0填充;
当SXM=1时,高24位(39~16位)扩展为符号。
② 若数据存储器操作数在高16位时,则:
当SXM=0时,39~32位和15~0位用0填充;
当SXM=1时,39~32位扩展为符号,15~0位用0填充。
SXM为符号位扩展方式控制位,位于状态寄存器ST1的8位。
(4)ALU的输出
ALU的输出为40位运算结果,通常被送至累加器A或B。
2.溢出处理
ALU的饱和逻辑可以对运算结果进行溢出处理。当发生溢出时,将运算结果调整为最大正数(正向溢出)或最小负数(负向溢出)。这种功能对滤波器计算非常有用。
当运算结果发生溢出时:
① 若OVM=0,则对ALU的运算结果不进行任何调整,直接送入累加器。
② 若OVM=1,则需对ALU的运行结果进行调整。
当正向溢出时,将32位最大正数007FFFFFFFH装入累加器;
当负向溢出时,将32位最小负数FF80000000H装入累加器。
③ 状态寄存器ST0中与目标累加器相关的溢出标志OVA/OVB被置1。
用户可以用SAT指令对累加器进行饱和处理,而不必考虑OVM值。溢出发生后,溢出标志位OVA/OVB被置1,直到复位或执行溢出条件指令。
3.进位位C
ALU有一个与运算结果有关的进位位C,位于ST0的11位。和其他微处理器一样,进位位C受大多数ALU操作指令的影响,包括算术操作、循环操作和移位操作。
进位位C的功能:
① 用来指明是否有进位发生;
② 用来支持扩展精度的算术运算;
③ 可作为分支转移、调用、返回和条件操作的执行条件。
进位位C不受装载累加器操作、逻辑操作、非算术运算和控制指令的影响,仅用于算术操作的溢出管理。可通过寄存器操作指令RSBX和SSBX,对进位位C进行置1或清0。当DSP芯片硬件复位后,进位位C置1。
4.双16位算术运算
若要将ST1中的C16置位,则ALU进行双16位算术运算,即在一个机器周期内完成两个16位数的算术运算,进行两次16位加法或两次16位减法运算。
双16位算术运算对于Viterbi加法/比较/选择操作特别有用。
5.其他控制位
除SXM、OVM、C、C16、OVA、OVB外,ALU还有两个控制位。
● TC——测试/控制标志,位于ST0的12位;
● ZA/ZB——累加器结果为0标志位。
2.4.2 累加器A和B
’C54x芯片有两个独立的40位累加器A和B,可以作为ALU或MAC的目标寄存器,存放运算结果,也可以作为ALU或MAC的一个输入。
在执行并行指令(LD||MAC)和一些特殊指令(MIN 和 MAX)时,两个累加器中的一个用于装载数据,而另一个用于完成运算。
累加器A和B之间的唯一区别是累加器A的31~16位(即高阶位AH)能被用作乘法-累加单元中的乘法器输入,而累加器B则不能。
累加器A和B都可以分为3部分,如图2.4.2所示。

图2.4.2 累加器A和B的结构
保护位(AG、BG)用作算术计算时的数据位余量,以防止迭代运算中的溢出,如自动校正时的某些溢出。
累加器的各部分 AG、BG、AH、BH、AL、BL 都是存储器映像寄存器,可以使用寄存器寻址的方式对其进行操作。
使用STH、STL、STLM和SACCD等指令或并行存储指令,可将累加器的内容存放到数据存储器中。在存储过程中,有时需要对累加器的内容进行移位操作。若右移时,AG 和 BG中的各数据位分别移至AH和BH;左移时,AL和BL中的各数据分别移至AH和BH,而AL和BL的低位添0。
注意:上述移位操作是在将累加器的内容存入存储器的过程中完成的。由于移位操作是在移位寄存器中进行,所以操作后累加器中的内容保持不变。
【例2.4.1】 假设累加器A=FF 0123 4567H,分别执行带移位的STH和STL指令后,数据存储单元T中的结果如下:
STH A,8,T ;A内容左移8位后,AH存入T中,T=2345H,A的内容不变 STH A,-8,T ;A内容右移8位后,AH存入T中,T=FF01H,A的内容不变 STL A,8,T ;A内容左移8位后,AL存入T中,T=6700H,A的内容不变 STL A,-8,T ;A内容右移8位后,AL存入T中,T=2345H,A的内容不变
2.4.3 桶形移位寄存器
TMS320C54x的40位桶形移位寄存器主要用于累加器或数据区操作数的定标。它能将输入数据进行0~31位的左移和0~16位的右移,即支持-16~31位的移位。所移动的位数可由ST1中的ASM或被指定的暂存器T决定。
桶形移位寄存器由多路选择器MUX、符号控制SC、移位寄存器和写选择电路MSW/LSW等构成,其功能框图如图2.4.3所示。

图2.4.3 桶形移位寄存器功能框图
1.桶形移位寄存器的输入
从图2.4.3可以看出,40位桶形移位寄存器的输入数据为以下数据中的任何一个:
① 取自DB数据总线的16位输入数据;
② 取自DB和CB扩展数据总线的32位输入数据;
③ 来自累加器A或B的40位输入数据。
2.桶形移位寄存器的输出
桶形移位寄存器的输出接至:
① 算术逻辑运算单元ALU的一个输入端;
② 经写选择电路(MSW/LSW)输出至EB总线。
3. 桶形移位寄存器的功能
桶形移位寄存器主要是为输入的数据定标,其功能:
① 在进行ALU运算之前,对输入数据进行数据定标;
② 对累加器中的内容进行算术或逻辑移位;
③ 对累加器进行归一化处理;
④ 在累加器的内容存入数据存储器之前,对存储数据进行定标。
4.桶形移位寄存器的操作
(1)完成操作数的符号位扩展
根据SXM位控制操作数进行带符号位/不带符号位扩展。当SXM=1时,完成符号位扩展,否则,禁止符号位扩展。有些指令,如LDU、ADDS和SUBS,其操作数为无符号数,不执行符号位的扩展,也不必考虑SXM位。
(2)完成操作数的移位
根据指令中的移位数控制操作数的移位。移位数全部用二进制补码表示,正值时完成左移,负值时完成右移。移位数有3种形式。
① 立即数,取值范围:-16~15。
② 状态寄存器ST1中的移位方式位ASM,共计5位,取值范围:-16~15。
③ 数据暂存器T中的低6位数值,取值范围:-16~31。
这种移位操作能使CPU完成数据的定标、位提取、扩展算术和溢出保护等操作。
【例2.4.2】 对累加器A执行不同的移位操作。
ADD A,-4,B ;累加器A右移4位后加到累加器B中 ADD A,ASM,B ;累加器A按ASM规定的移位数移位后加到累加器B NORM A ;按T暂存器中的数值对累加器归一化
桶形移位寄存器和指数译码器可以将累加器中的数值在一个周期内进行归一化处理。
例如,40位累加器A中的定点数为FF FFFF F001。先用EXP A指令,求得它的指数为13H,存放在T暂存器中。然后再执行NORM A指令,可在单个周期内将原来的定点数分成尾数FF 8008 0000和指数13H两个部分。
2.4.4 乘法-累加单元(MAC)
’C54x的乘法-累加单元MAC是由乘法器、加法器、符号控制、小数控制、零检测器、舍入器、饱和逻辑和暂存器几部分组成的,其功能框图如图2.4.4所示。

图2.4.4 乘法-累加单元功能框图
MAC单元具有强大的乘法-累加运算功能,可在一个流水线周期内完成1次乘法运算和1次加法运算。在数字滤波(FIR和IIR滤波)及自相关等运算中,使用乘法-累加运算指令可以大大提高系统的运算速度。
MAC单元包含一个17×17位硬件乘法器,可完成有符号数和无符号数的乘法运算。
乘法器的XM输入数据来自T寄存器、累加器A的32~16位以及由DB总线提供的数据存储器操作数;而YM输入的数据可以取自累加器A的32~16位、由DB总线和CB总线提供的数据存储器操作数以及由 PB 总线传送过来的程序存储器操作数。乘法器的输出经小数控制电路接至加法器的XA输入端。
MAC单元的乘法器能进行有符号数、无符号数以及有符号数与无符号数的乘法运算。根据操作数的不同情况需进行以下处理:
① 若是两个有符号数相乘,则在进行乘法运算之前,先对两个16位乘数进行符号位扩展,形成17位有符号数后再进行相乘。扩展的方法是:在每个乘数的最高位前增加一个符号位,其值由乘数的最高位决定。
② 若是两个无符号数相乘,则在两个16位乘数的最高位前面添加“0”,扩展为17位乘数后再进行乘运算。
③ 若是有符号数与无符号数相乘,则有符号数在最高位前添加1个符号位,其值由最高位决定,而无符号数在最高位前面添加“0”,然后两个操作数相乘。
由于乘法器在进行两个16位二进制补码相乘时会产生两个符号位,为提高运算精度,在状态寄存器ST1中设置了小数方式控制位FRCT。当FRCT=1时,乘法结果左移一位,消去多余的符号位,相应的定标值加1。
在乘法-累加单元中,加法器的XA输入取自乘法器的输出,而YA的输入数据来自累加器A或B。加法器的运算结果输出到目标累加器A或B。此外,加法器还包含有零检测器、舍入器和溢出/饱和逻辑电路。其中,舍入器用来对运算结果进行舍入处理,即将目标累加器中的内容加上 215,然后将累加器的低 16 位清零。有些乘法指令,如 MAC(乘法-累加指令)、MAS (乘法-减法指令)和 MPY(乘法指令)等,若带有后缀 R,则表示该指令要对运算结果进行舍入处理。
2.4.5 比较、选择和存储单元(CSSU)
’C54x的比较、选择和存储单元(CSSU)是一个特殊用途的硬件电路,专门用来完成Viterbi算法中的加法/比较/选择(ACS)操作。CSSU 单元由比较电路 COMP、状态转移寄存器 TRN和状态比较寄存器TC组成,其功能框图如图2.4.5所示。
CSSU 单元主要完成累加器的高阶位与低阶位之间最大值的比较,即选择累加器中较大的字,并存储在数据存储器中。其工作过程如下:
① 比较电路COMP将累加器A或B的高阶位与低阶位进行比较;
② 比较结果分别送入状态转移寄存器TRN和状态寄存器的TC位中,记录比较结果以便程序调试;
③ 比较结果送入写选择电路,选择较大的数据;
④ 将选择的数据通过总线EB存入指定的存储单元。
例如,CMPS 指令可以对累加器的高阶位和低阶位进行比较,并选择较大的数存放在指令所指定的存储单元中。指令格式如下:
CMPS A,*AR1
功能:对累加器A的高16位字(AH)和低16位字(AL)进行比较。
若AH>AL,则AH→*AR1,TRN左移1位,0→TRN(0),0→TC;
若AH<AL,则AL→*AR1,TRN左移1位,1→TRN(0),1→TC。

图2.4.5 比较、选择和存储单元功能框图
在CMPS指令执行的过程中,状态移位寄存器TRN将自动记录比较的结果,这在Viterbi算法中非常有用。
CSSU与ALU配合操作,可以实现数据通信与模式识别领域常用的快速加法/比较/选择的ACS运算,如支持均衡器和通道译码器所用的各种Viterbi算法。
2.4.6 指数编码器(EXP)
在数字信号处理中,为了提高计算精度,常采用数值的浮点表示法,即把一个数值分为指数部分和位数部分。指数部分为数值的阶次,位数部分为数值的有效值。例如,十进制数值12345,其浮点数为 0.12345×105。为了满足这种运算要求,在’C54x 中提供了指数编码器和指数指令。
指数编码器如图2.4.6所示。它是一个用于支持指数运算指令的专用硬件,可以在单周期内执行EXP指令,求累加器中数的指数值。该指数值是以二进制补码的形式存入 T 暂存器中,范围为8~31位。实际上,累加器中数值的指数值等于前面的多余位数减去 8,即为消去多余符号位而将累加器中的数值移动的位数。当累加器中的数值超过32位时,该指数为负数。

图2.4.6 指数编码器
有了指数编码器,可以使用EXP和NORM指令对累加器的数值进行归一化处理。NORM指令可以根据T暂存器中的内容,在单周期内对累加器的数值进行移位。如果T暂存器中的内容为负值,则使累加器中的数值产生右移,并且归一化累加器中32位范围内的任何数值。下面的例子可以说明对累加器A进行归一化处理的过程。
【例2.4.3】 完成对累加器A的归一化处理
EXP A ;多余符号位-8)→T暂存器
ST T,EXPONENT ;将保存在T暂存器中的指数存入指定的数据存储器中 NORM A ;对累加器A进行归一化处理,即A按T中的内容移位
2.4.7 CPU状态和控制寄存器
’C54x提供3个16位寄存器来作为CPU状态和控制寄存器,它们分别为:状态寄存器0 (ST0)、状态寄存器1(ST1)和处理器工作方式状态寄存器(PMST)。
ST0和ST1中包含各种工作条件和工作方式的状态,PMST中包含存储器的设置状态和其他控制信息。由于这些寄存器都是存储器映像寄存器,因此可以很方便地对它们进行如下数据操作:
● 将它们快速地存放到数据存储器;
● 由数据存储器对它们进行加载;
● 用子程序或中断服务程序保存和恢复处理器的状态。
1.状态寄存器0(ST0)
ST0(Status 0)主要用于反映处理器的寻址要求和计算的中间运行状态,其结构如图2.4.7所示。

图2.4.7 状态寄存器0
状态寄存器ST0各状态位的功能见表2.4.1。
表2.4.1 状态寄存器ST0各状态位的功能

2.状态寄存器1(ST1)
ST1(Status 1)主要用于反映处理器的寻址要求、设置计算的初始状态、I/O及中断控制,其各位的定义如图2.4.8所示。

图2.4.8 状态寄存器1
状态寄存器ST1各状态位的功能见表2.4.2。
表2.4.2 状态寄存器ST1各状态位的功能

3.处理器工作方式状态寄存器(PMST)
PMST(Processor Mode Status)主要用来设置和控制处理器的工作方式,反映处理器的工作状态,其结构如图2.4.9所示。

图2.4.9 处理器工作方式状态寄存器PMST
PMST寄存器各状态位的功能见表2.4.3。
表2.4.3 处理器工作方式状态寄存器PMST各状态位的功能
