2.1 CPU的结构
TMS320C67xx CPU的结构框图如图2-1所示,其中CPU部分包括:
图 2-14 NORM指令举例
● 程序取指、指令分配和译码机构:包括程序取指单元、指令分配单元和指令译码单元,程序取指单元由程序总线与片内程序存储器相连。
● 程序执行机构:包括两个对称数据通道(A和B)、两个对称的通用寄存器组、两组对称的功能单元(每组4个)、控制寄存器、控制逻辑及中断逻辑等。每侧数据通道由数据总线与片内数据存储器相连。
● 芯片测试、仿真端口及其控制逻辑。
图2-1 TMS320C67xx的结构框图
C67xx系列CPU采用哈佛结构,其程序总线与数据总线分开,可并行读取与执行指令。片内程序存储器保存指令代码,程序总线连接程序存储器与CPU。C67xx系列芯片的程序总线宽度为256位,每次取8条指令,称为一个取指包。
执行时,每条指令占用一个功能单元。取指、分配和译码单元都具备单周期读取并传递8条32位指令的能力。在两个数据通道(A和B)的功能单元内执行这些指令。控制寄存器控制操作方式。从程序存储器读取1 个取指包时起,VLIW处理流程开始。1 个取指包可能分成几个执行包,详细处理过程见2.4节。
C67xx系列DSP片内的程序总线与数据总线分开,程序存储器与数据存储器分开,但片外的存储器及总线都不分,二者是统一的。全部存储空间(包括程序存储器和数据存储器,片内和片外)以字节为单位统一编址。无论是从片外读取指令或与片外交换数据,都要通过EDMA与EMIF,相关操作将在后续章节介绍。在片内,仅在取指令时用到程序总线。
TI公司的数据手册常把在指令执行过程中使用的物理资源统称为数据通道,其中包括执行指令的8个功能单元、通用寄存器组及片内数据存储器交换信息所使用的数据总线等。
C67xx系列CPU有两个类似的可进行数据处理的数据通道A和B,每个通道有4个功能单元(.L、.S、.M和.D)以及1组包括16个32位寄存器的通用寄存器组。功能单元执行指令指定的操作。除读取(Load)、存储(Store)类指令及程序转移类指令外,其他所有算术逻辑运算指令均以通用寄存器为源操作数和目的操作数,使程序能够高速运行。读取和存储类指令用于在通用寄存器与片内数据存储器之间交换数据,此时两个数据寻址单元(.D1和.D2)负责产生数据存储器地址。每个数据通道的4个功能单元有单独的数据总线连接到CPU另一侧的寄存器上(见图2-2),使得两组寄存器组可以交换数据。
图2-2 TMS320C67xx CPU的数据通道
C67xx CPU的数据通道如图2-2所示,由图可见,数据通道包括下述物理资源:
● 两个通用寄存器组(A和B),分别包括16个寄存器;
● 8个功能单元(.L1、.L2、.S1、.S2、.M1、.M2、.D1、.D2);
● 两个数据读取通路(LD1和LD2),每侧有两个32位读取总线;
● 两个数据存储通路(ST1和ST2),每侧有一个32位存储总线;
● 两个寄存器组交叉通路(1×和2×);
● 两个数据寻址通路(DA1和DA2)。
1.通用寄存器组
在C67xx CPU数据通道中有两个通用寄存器组(A和B),每个寄存器组包括16个32位寄存器,通用寄存器的作用是:
① 存放数据,作为指令的源操作数和目的操作数。图2-2中src1、src2、long src、dst和long dst表示通用寄存器与功能单元之间的数据联系、传送方向和数据字长。
表 2-16 浮点辅助配置寄存器字段功能描述
② 作为间接寻址的地址指针,寄存器A4~A7和B4~B7还能够以循环寻址方式工作。
③ A1、A2、B0、B1和B2可用作条件寄存器。
C67xx所有芯片都支持32位和40位定点运算。32位数据可放在任一通用寄存器内,40位数据需存放在一个寄存器对内。一个寄存器对由一个偶寄存器及序号比它大1的奇寄存器组成,书写时奇寄存器在前面,两个寄存器之间加比号,C67xx有效的寄存器对见表2-1。数据的低32位放在偶寄存器,数据的高8位放在奇寄存器的低8位。C67xx DSP芯片也以上述方式用寄存器对存放64位双精度数。
表2-1 40位/64位寄存器对
图2-3给出了40位长型数据在寄存器对中的存储方式。对长型数据进行读操作时,忽略掉行寄存器中的高24位;进行写操作时,用0填充奇寄存器的高24位。在指令操作码中指定所用的偶寄存器编码,就指定了所用的寄存器对。
图2-3 40位长型数据在寄存器对中的存储方式
2. 功能单元
C67xx每个数据通道有4个功能单元。两个数据通道具有功能基本相同的功能单元。.M单元主要完成乘法运算,.D单元是唯一能产生地址的功能单元,.L与.S单元是主要的算术逻辑运算单元(ALU)。表2-2描述了各功能单元的功能。
表2-2 功能单元及其能执行的操作
CPU内的数据总线支持32 位操作数,有些支持长型(40 位)操作数。双精度操作数则分成最高位(MSB)、最低位(LSB)两组32 位总线。图2-2 中每个功能单元都有各自到通用寄存器的读/写端口。其中A组的功能单元(以1结尾)写到寄存器组A中,B组的功能单元(以2结尾)写到寄存器组B中。每个功能单元都有两个32位源操作数src1和src2的读入口。为了实现长型(40位)操作数的读/写,4个功能单元(.L1、.L2、.S1和.S2)分别配有额外的8位写端口和读端口。由于每个功能单元都有自己的32位写端口,所以在每个周期8个功能单元可以并行使用。
3. 寄存器组交叉通路
每个功能单元可以直接与所处数据通道的寄存器组进行读/写操作,即.L1、.S1、.D1和.M1可以直接读/写寄存器组A,而.L2、.S2、.D2和.M2可以直接读/写寄存器组B。两个寄存器组通过1×和2×交叉通路也可以与另一侧的功能单元相连。1×交叉通路允许数据通道A的功能单元从寄存器组B读它的源操作数,2×交叉通路则允许数据通道B的功能单元从寄存器组A读它的源操作数。
从图2-2中可以看出,.D单元与交叉通路不连,只有其余6个单元可以访问另一侧的寄存器组。其中,M1、.M2、.S1和.S2单元的源操作数src2在交叉通路和自身通路的寄存器组之间可选,.L1和.L2的两个源操作数src1和src2都可在交叉通路和自身通路的寄存器组之间选择。
在C67xx的CPU中仅有两个交叉通路1×和2×,在1个周期内只能从另一侧寄存器组读取1 次源操作数,即在1 个周期内总共只能进行两个交叉通路的源操作数读入,每个执行包的每个数据通道仅有1个功能单元可从对侧获得源操作数。
4. 数据存储器及读取存储通路
在C67xx的CPU中,有两个32位通路(每侧1个)把数据从存储器读取到寄存器(Load指令)中,读入到寄存器组A中的通路为LD1,读入到寄存器组B中的通路为LD2。C67xx除此之外,还有第2个32位读取通路,图2-2中标注为LD1 32 MSB和LD2 32 MSB。C67xx的LDDW指令一次可读取64位数据到A侧寄存器或到B侧寄存器中。C67xx有两个32位写数据通道ST1和ST2,可分别将各组寄存器的数据存储到数据存储器(Store指令)中。
5. 数据地址通路
数据地址通路DA1和DA2来自数据通道的.D功能单元,地址通路与两侧数据通道都相连,这使得一个寄存器组产生的数据地址能够支持任意一侧寄存器组对数据存储器的读/写操作。
在汇编语句内,数据通道(读数据线LD、写数据线ST)以.T1、.T2表示。在Load和Store指令的汇编语句里.T1、.T2与.D1、.D2一起出现在功能单元区,用以说明产生地址的功能单元和读/写操作所用的数据通道。例如,下面的Load指令使用.D1产生地址,用LD2数据通道读入数据到B1寄存器中:
LDW.D1T2 *A0[3],B1
6. 控制寄存器组
用户可以通过控制寄存器组编程来选用CPU的部分功能。编程时应注意,仅功能单元.S2可通过搬移指令MVC访问控制寄存器,从而对控制寄存器进行读/写操作。流水线E1节拍程序计数器(PCE1),保留当前处于E1节拍取指包的32位地址。中断管理的7个寄存器将在2.5节中介绍。C67xx CPU除上述控制寄存器外,为支持浮点运算,还另外配置了3个寄存器控制浮点运算。表2-3列出了C67xx的控制寄存器组,并对每个控制寄存器做了简单描述。
表2-3 C67xx DSP的控制寄存器组
控制状态寄存器(CSR)包括控制位和状态位,如图2-4所示。控制状态寄存器各字段功能列于表2-4中。对于EN,PWRD,PCC和DCC字段,要查看有关数据手册来确定所用的芯片是否支持这些字段控制选择。
表2-4 控制状态寄存器字段描述
图2-4 控制状态寄存器
图2-4中TI公司文献图表符号说明:R代表可读,对控制寄存器须用MVC指令才能读;W代表可写,对控制寄存器须用MVC指令才可写;x代表复位后数值不定;0代表复位后数值为0(若为1,则代表复位后数值为1);c代表可清零,对控制寄存器须用MVC指令清零。