TMS320C55x DSP并行处理技术分析与应用
扫描二维码
随时随地手机看文章
TMS320C55x DSP是一种高性能的数字信号处理器,其强大的并行处理能力能够进一步提高其运算能力。本文介绍了C55xDSP的内核结构以及用户自定义并行指令时必须遵守如下3条并行处理基本规则,并介绍了6种典型的并行处理应用。利用本文介绍的方法使用并行处理能力将有效提高程序执行效率,同时降低系统功耗。
德州仪器公司(TI)的TMS320C55x(简称C55x)DSP内核是在TMS320C54x(简称C54x)基础上开发出来的,并可以兼容C54x的源代码。C55x的内核电压降到了1V,功耗降到0.05mW/MIPS,是C54x的1/6。C55x的运行时钟可以达到 200MHz,是C54x的两倍,再加上C55x在C54x结构上作了相当大的扩展,程序执行时可以大量采用并行处理,这样使得C55x的实际运算能力可以达到300MIPS以上。
C55x DSP已越来越多地应用于各种手持便携终端当中。以下我们将通过详细介绍C55x的CPU内核结构,讨论其并行处理技术的应用。
C55x DSP内核结构
C55x DSP是一款采用改良型哈佛结构,高度模块化的数字信号处理器拥有比普通DSP更为丰富的硬件资源,能够有效提高运算能力。其内核结构如图1所示.
整个处理器内部分为5个大的功能单元:存储器缓冲单元(M单元)、指令缓冲单元(I单元)、程序控制单元(P单元)、地址生成单元(A单元)和数据计算单元(D 单元),各个功能单元之间通过总线连接。C55x DSP中有1条32位程序数据总线(P总线),1条24位程序地址总线(PA总线),5条16位的数据总线(B、C、D、E、F总线)和5条24位的数据地址总线(BA、CA、DA、EA、FA总线)。这种高度模块化的多总线结构使得C55x DSP拥有超强的并行处理能力。[next]
M单元主要管理数据区(包括I/O数据区)与中央处理器(CPU)之间的数据传送,使得高速CPU与外部相对低速的存储器之间在吞吐量上的瓶颈可以得到一定程度的缓解。
I单元从程序数据总线接收程序代码,并将其放入指令缓冲队列(IBQ)中,然后利用指令译码器将指令缓冲队列中的程序代码进行译码,最后再将译码后的指令送给P单元、A单元、D单元进行处理。
图2
P单元主要是通过判断是否满足条件执行指令的条件来控制程序地址的产生,达到控制程序流程的目的。程序控制单元中还含有程序控制寄存器、循环控制寄存器、中断寄存器和状态寄存器等硬件寄存器。通过循环控制寄存器的设置,可以直接控制程序中的循环次数等,而不必像在普通DSP中一样在外部对循环条件进行判断,从而可以有效提高运行效率。
A单元的功能是产生读写数据空间的地址。地址生成单元由数据地址产生电路(DAGEN)、16位的算术逻辑单元(ALU)和一组寄存器构成。C55x DSP地址产生与其他功能模块分开,保证不会因为地址产生的原因使得单条指令需要在多个时钟周期内完成,提高了DSP的运行效率。A单元中的寄存器包括数据页寄存器、辅助寄存器、堆栈指针寄存器、循环寻址寄存器和临时寄存器等。
D单元是C55x DSP中主要的数据执行部件,完成大部分数据的算术运算工作。它由移位器、40位ALU、两个17位的乘累加器(MAC)和若干寄存器构成。数据计算单元的两个乘累加器能够并行使用,可以有效提高DSP运行效率。D单元中的寄存器包括累加器和两个用于维特比译码的专用指令寄存器。[next]
并行处理基本准则
如图1所示C55x DSP内核结构可知,整个处理器的地址及数据运算由P单元、A单元和D单元完成。这三个单元相对独立,各自通过总线与数据区及程序区相连。这种相互独立的模块化结构,在硬件特性上确保这三个单元在同一时钟周期内能够进行并行处理,完成各自不同的运算操作。
在C55x DSP指令集中有一些固定搭配的并行执行指令(主要是利用D单元双MAC结构的并行指令),这些被固定使用的并行指令之间使用“::”符号连接。除了这些固有的并行指令外,用户也可以根据CPU结构特征自行定义并行指令,并行的两条指令之间需使用“||”符号连接,以区分指令集中的并行指令。
用户自定义并行指令时,必须遵守如下3条并行处理基本规则:
规则1: 保证不产生硬件冲突,包括操作数、寄存器、总线及各运算模块的冲突。在对C55x DSP的所有操作中,对P、A、D三个单元进行操作的指令类型有14类,这14类操作指令之间有很大一部分可以相互并行运行。经过我们对C55x DSP硬件电路结构的分析,在只考虑硬件模块冲突的情况下,我们得出如图2所示的C55xDSP并行处理能力分析图。图中将14类操作指令组成了一个14 ×14的矩阵,列出了每一类指令与其自身及其他13类指令并行执行的能力。图中画有(符号的空格代表不能并行执行,相反没有任何符号的空格代表可以并行执行。
在考虑并行处理的硬件冲突时,还需要考虑总线资源的冲突。总线资源的冲突通常发生在数据总线和常量总线,C55x DSP中含有5条数据总线和2条常量总线,各条总线与各运算模块的连接如图3所示。
数据总线中,C、D总线是读数据总线,通过这两条总线进行数据读取;E、F总线是写数据总线,通过这两条总线进行数据写操作;另外还有一条特殊的B总线,这条总线可以进行读或写操作,但是它只能被CDP寄存器使用,而其它辅助寄存器无法使用B总线。
两条常量总线分别是KA、KD总线。KA常量总线用于产生地址数据。P单元的KA常量总线负责产生程序地址,例如跳转指令B #RouTIne2中,常量#Routine2就是通过KA常量总线被送到P单元的。A单元的KA常量总线负责产生数据存储区地址,例如在指令 Mov*SP(#7),Brc0中,偏移量#7就是通过KA常量总线被送到A单元的。KD总线用于传送参与运算的常量数据,例如指令ADD #123,AC0中,常量123就是通过KD总线传送的。
规则2:受指令缓冲队列(IBQ)的限制,并行语句的总长度不能超过6个字节。 I单元中的译码器只能将IBQ中的1~6个字节的程序进行译码。如果一条并行语句的长度超过6个字节,则需要在两个时钟周期内对其进行两次译码。因此必须将两条并行语句的总长度限制在6个字节。
规则3:当需要寻址两个及以上数据存储区数据时,必须使用双重AR间接寻址方式。
图3
采用双重AR间接寻址方式,可以通过使用2个不同的辅助寄存器(AR0~AR7)同时访问数据存储区中两个不同的数据。在这种寻址方式下,我们可以通过两条不同的数据总线,在同一时钟周期内寻址两个不同数据,并将其输入不同的运算模块进行计算。
常用并行处理应用
在编程实现过程中,对每一个并行处理都进行仔细分析将能达到事半功倍的效果。下面是我们总结出的几种典型并行处理应用:
1. D单元双MAC结构的并行处理
在C55x DSP的D单元中采用了双MAC的结构,其结构如图4所示。这里有3条数据总线(B、C、D数据总线)与两个MAC模块相连。在同一时钟周期里,可以同时通过3条数据总线将三个不同地址的数据传入两个MAC模块中进行并行计算。[next]
通常情况下,两个MAC模块的运算总共需要4个数据,而这里的总线数却只有3条,所以在并行使用双MAC结构时,两个MAC模块必须共用一组数据,而另外两组数据分别分配给两个MAC模块。这使得双MAC结构的并行应用受到一定的限制。
C55x的双MAC结构比较典型的应用如不同数据的相同算法处理和同一数据的不同算法处理。下面是对不同数据进行相同FIR滤波的实例:
MAC *AR0+,*CDP+,AC0
::MAC *AR1+,*CDP+,AC1
其中AR0和AR1寄存器分别指向输入的两组数据,CDP寄存器指向FIR滤波器的抽头系数。C55x DSP的指令集中还含有其它与双MAC模块并行处理的专用指令,在此就不再仔细分析。
2. 存储区数据装载指令与存储指令的并行
A单元、P单元和D单元均可以对存储器中数据实现装载及存储。数据的装载与存储使用的是不同总线,不会发生硬件冲突,易于实现并行处理。以下是在D单元内实现两个数据装载与存储的实例:
MOV AC0,*AR1
||MOV *AR2,AC1
此例是在D单元内对AC0进行存储并装载数据到AC1。程序执行时,将数据通过D总线读入AC1寄存器,同时将AC0数据通过E总线写入存储器,这样就避免了硬件冲突,满足并行规则1。两条指令总长度为4字节,小于IBQ6个字节的限制,满足了并行规则2。两条指令均采用双重间接寻址,满足了并行规则3。通过上机调试,这条并行指令确实能够正确编译并执行。
3. A单元中ALU运算与D单元中ALU、MAC和移位运算的并行
下面我们以一个实例来进行说明:
ADD T0,AR1
||MOV HI(AC0<<#18),*AR2
图4
这是一个A单元ALU模块与D单元移位操作模块的并行处理实例。它在A单元完成16位加法运算,并将结果存放于AR1,同时在D单元完成对寄存器AC0的移位存储操作。这两条指令之间不存在硬件冲突,满足并行规则1。两条指令总共长度为5个字节,小于IBQ6个字节的限制,满足了并行规则 2。这里只使用了一个储器中的数据,不需要满足并行规则3的规定。通过上机调试,这条并行指令能够正确编译并执行。
4. 累加器的移位、饱和及存储操作与D单元ALU或MAC的并行处理
下面我们以一个实例来进行说明:
MOV HI(AC0<<#18),*AR2
||ADD AC0,AC1
这是一个D单元移位操作模块与D单元ALU模块的并行处理实例。它在移位操作模块中完成寄存器AC0的移位,然后将移位后的值通过E总线存储到存储器中,同时在ALU模块中完成寄存器AC0与AC1的加法运算,然后将结果存放于AC1。这两条指令不存在硬件冲突,满足并行规则1。两条指令总长度为5个字节,小于IBQ6字节的限制,满足并行规则2。这里只需使用一个存储器中的数据,不需满足并行规则3。通过上机调试,这条并行指令能够正确编译并执行。
5. 程序控制操作与运算操作的并行
P单元程序控制模块与其他的算术运算模块相对较独立,不易发生硬件冲突,便于进行并行处理。下面是一个程序控制指令与算术运算指令的并行:
ADD *AR2,AC0
||RPTBLOCAL JUMP1 这是一个D单元ALU模块与P单元程序控制模块的并行实例。它在D单元ALU中将D总线送来的数据与AC0相加并存入AC0,同时完成程序循环控制。程序执行中不存在硬件模块和总线的冲突,满足并行规则1;两条指令总长度为5字节,满足并行规则2;此例只使用一个存储器中的数据,不需要满足并行规则3。通过上机调试,这条并行指令能够正确编译并执行。
6. 使用常量对存储器进行初始化
D单元拥有两条写总线(E、F总线),在通常情况下我们只使用了其中的一条写总线造成资源浪费。假如我们需要对某块数据存储区清零,通常的做法如下:
RPT #9
MOV #0,*AR1+
这段程序对存储区数据逐一清零,每次只使用了D单元的E总线,总共需要10个时钟周期才能完成。在这种情况下,如果我们充分利用E、F总线,将有效地降低这段程序的运算量。具体实现如下:
MOV #0,AC0
||RPT #4
MOV AC0,DBL(*AR1+)
这段程序与上一段的最大不同点在于,一个时钟周期内通过E、F总线将两个初始数据同时传送到指定的数据区,同时初始化两个字的存储空间。这段程序只需要5个时钟周期就可以完成10个字的初始化,比普通做法节约一半的运算量,提高了使用效率。