![DSP技术与应用实例](https://wfqqreader-1252317822.image.myqcloud.com/cover/693/679693/b_679693.jpg)
3.2 指令系统
TMS320C54x可以使用助记符方式和表达式方式两套指令系统。TMS320C54x指令系统可以分成算术指令、逻辑指令、程序控制指令、装入和存储指令4种基本类型。
3.2.1 符号与意义
表3-9中列出TMS320C54x指令系统的符号和意义。
表3-9 TMS320C54x指令系统的符号与意义
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0039_0002.jpg?sign=1739322929-AWZO8s0nWSRVeZegy4JFDhRJlZjfI5xQ-0-997ddf57ed2ff29a63c719ac797dad81)
续表
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0040_0001.jpg?sign=1739322929-wNHcliOqWMN6o2pr3JUsosQTcCBwuj89-0-350a342cfa060ed95a43961e72cab4d8)
续表
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0041_0001.jpg?sign=1739322929-rXCglLQyzjs59Lhs6dtFVC9VB8fo4gll-0-b47b20f9e51ef2e23f1e137ee782edc2)
3.2.2 TMS320C54x的指令系统
TMS320C54x指令一共有129条,按功能分为算术运算指令、逻辑指令、程序控制指令、存储和装入指令、单个循环指令5类。
1.算术运算指令
算术运算指令包括加法指令(ADD)、减法指令(SUB)、乘法指令(MPY)、乘加指令(MAC)、乘减指令(MAS)、双数/双精度指令(DADD,DSUB)和特殊操作指令(ABDST,SQDST)。其中大部分指令都只需一个指令周期,只有个别指令需要2~3个指令周期。
(1)加法指令
加法指令共有13条,如表3-10所示。
表3-10 加法指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0041_0002.jpg?sign=1739322929-VxLQI7dw7ZbzZ1aUKwE2sxUtEdUNmo25-0-3e881a120584d168c23c34c59756875e)
DSP表示整数时,包括有符号数和无符号数两种格式。作为有符号数表示时,其最高位表示符号,最高位为0表示其为正数,为1表示其为负数,最低位表示1,次低位表示2的1次方,次高位表示2的14次方。作为无符号数表示时,最高位仍然作为数值位计算。例如,有符号数所能够表示的最大的正数为07FFFH,等于十进制数32767,而0FFFFH表示最大的负数-1;无符号数不能表示负数,它能够表示的最大的数为0FFFFH,等于十进制数的65535。
DSP表示小数时,其符号和上面整数的表示一样,但是必须注意如何安排小数点的位置。原则上,小数点的位置可以根据程序员的爱好安排,为了便于数据处理,一般安排在最高位后(以下仅以小数点在最高位后的情况进行讨论),最高位表示符号位,次高位表示0.5,然后是0.25,依次减少一半。例如,4000H表示小数0.5,1000H表示小数0.25,而0001H表示16位定点DSP表示的最小的小数(有符号)0.000030517578125。
TMS320C54x中提供了多条用于加法的指令,如ADD、ADDC、ADDM和ADDS。其中,ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算(如32位扩展精度加法),而ADDM专用于立即数的加法运算。
使用ADD指令完成加法运算:
LD TEMP1,A ;将变量TEMP1装入累加器A中 ADD TEMP2,A ;将变量TEMP2与累加器A相加,结果放入A中 STL A,TEMP3 ;将结果(低16位)存入变量TEMP3中
注意,这里完成计算TEMP3=TEMP1+TEMP2,没有特意考虑TEMP1和TEMP2是整数还是小数,在加法和下面的减法运算中,整数运算和定点的小数运算都是一样的。
利用ADDS指令实现32位数据装入: LD #0,DP ;设置数据页指针 LD 60H,16,A ;将60H的内容装入A的高16位 ADDS 61H,A ;将61H的内容加到A的低16位 DLD 60H,B ;直接装入32位到B累加器
(2)减法指令
减法指令共有13条,如表3-11所示。
表3-11 减法指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0043_0001.jpg?sign=1739322929-fwhztWcQUazpTvhtwZyUST2MnoYWhGYd-0-7eb88487a8e2fe7a9944f831b4abf099)
TMS320C54x中提供了多条用于减法的指令,如SUB、SUBB、SUBC和SUBS。其中,SUBS用于无符号数的减法运算,SUBB用于带借位的减法运算(如32位扩展精度的减法),而SUBC为移位减,DSP中的除法就是用该指令来实现的。SUB指令与ADD指令一样,有多种寻址方式。例如:
STM #60H,AR3 ;将变量TEMP1的地址装入AR3寄存器中 STM #61H,AR2 ;将变量TEMP3的地址装入AR2寄存器中 SUB *AR2+,*AR3,B ;将变量TEMP3左移16位,同时变量TEMP2也左移16位 ;然后相减,结果放入累加器B(高16位)中,同时AR2加1 STH B,63H ;将相减的结果(高16位)存入变量63H
在TMS320C54x中没有提供专门的除法指令。一般有两种方法可以完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。另一种方法是使用SUBC指令,重复若干次减法完成除法运算。
下面这几条指令就是利用SUBC来完成整数除法(TEMP1/TEMP2)的:
LD TEMP1,B ;将被除数TEMP1装入B累加器的低16位 RPT #15 ;重复SUBC指令16次 SUBC TEMP,B ;使用SUBC指令完成除法 STL B,TEMP3 ;将商(B累加器的低16位)存入变量TEMP3中 STH B,TEMP4 ;将余数(B累加器的高16位)存入变量TEMP4中
在TMS320C54x中实现16位的小数除法与前面的整数除法基本一样,也是使用SUBC指令来完成的。但有两点需要注意:第一,小数除法的结果一定是小数(小于1),所以被除数一定小于除数,在执行SUBC指令前,应将被除数装入A或B累加器的高16位,而不是低16位,其结果的格式与整数除法一样;第二,应当考虑符号位对结果小数点的影响,所以应将商右移一位,得到正确的有符号数。
(3)乘法指令
乘法指令共有10条,如表3-12所示。
表3-12 乘法指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0044_0001.jpg?sign=1739322929-hziBoYn9VoCTllV3DxymTcspqjnw5NxS-0-7298ce76ac9414f1aae0a8f983d4b832)
在TMS320C54x中提供大量的乘法运算指令,其结果都是32位的,放在A或B累加器中。乘数在TMS320C54x的乘法指令中很灵活,可以是T寄存器、立即数、存储单元和A或B累加器的高16位。若是无符号数乘法,则使用MPYU指令。这是一条专用于无符号数乘法运算的指令,而其他指令都是有符号数的乘法。
实现整数乘法举例:
SSBX FRCT ;清FRCT标志,准备整数乘 LD TEMP1,T ;将变量TEMP1装入T寄存器 MPY TEMP2,A ;完成TEMP2*TEMP1,结果放入A累加器(32位)
实现小数乘法举例:
SSBX FRCT ;FRCT=1,准备小数乘法 LD TEMP1,16,A ;将变量TEMP1装入累加器A的高16位 MPYA TEMP2 ;完成TEMP2乘累加器A的高16位,结果在B中, ;同时将TEMP2装入T寄存器 STH B,TEMP3 ;将乘积结果的高16位存入变量TEMP3
在TMS320C54x中,小数的乘法与整数乘法基本相同,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。TMS320C54x中提供一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移1位。两个小数(16位)相乘后结果为32位,如果精度允许的话,可以只存高16位,将低16位丢弃,这样仍可得到16位的结果。
(4)乘加和乘减指令
乘加和乘减指令共有22条,如表3-13所示。
(5)双操作数指令
双操作数指令共有6条,如表3-14所示。
(6)特殊应用指令
特殊应用指令共有15条,如表3-15所示。
表3-13 乘加和乘减指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0045_0001.jpg?sign=1739322929-Jya8PjoUZHvgPJBHfokULyQw3sDydg55-0-431c291d4d3e369b6432a0dfe651f2bc)
表3-14 双操作数指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0046_0001.jpg?sign=1739322929-bLVa7VYKoEd3ug44BrUZWVq1O2P0Vsft-0-536341f14ec57a779239859e0d6383d3)
表3-15 特殊应用指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0046_0002.jpg?sign=1739322929-VaqMcQ7aKinoqkwAR1qmOlj3LwXTLeFX-0-0ea9db7ac5aa76af5e148a492e363c3e)
续表
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0047_0001.jpg?sign=1739322929-usqknfEs4gr3Cd9h6QS9MUeb28r0Rv04-0-3063f7342d228a5205acfdff9ccc7568)
2.逻辑指令
逻辑指令包括与指令(AND)、或指令(OR)、异或指令(XOR)、移位指令(ROL)和测试指令(位F)。根据操作数的不同,这些指令需要1~2个指令周期。
(1)与指令
与指令共有5条,如表3-16所示。
表3-16 与指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0047_0002.jpg?sign=1739322929-wuUBEvb5mlQq9HQoLr7SNThwPPW8E7V1-0-923caa801e172395bfb833d5cc730aeb)
(2)或指令
或指令共有5条,如表3-17所示。
表3-17 或指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0047_0003.jpg?sign=1739322929-YxerEzPoS3mt480xs8SuwfezO8xz3zjk-0-778f3d950f3474a35bd1f4dc98440911)
(3)异或指令
异或指令共有5条,如表3-18所示。
表3-18 异或指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0047_0004.jpg?sign=1739322929-tDXwpKNClRDd7vUBQQQ0TisO332o1xRg-0-c3835f2dd16cc74bb07574c74c6b5a3a)
(4)移位指令
移位指令共有6条,如表3-19所示。
表3-19 移位指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0048_0001.jpg?sign=1739322929-9zQbSkCHNo3vwA4V3osn5wIBV7YXBiua-0-bca78532a72e22a134b58b96666c809e)
(5)测试指令
测试指令共有5条,如表3-20所示。
表3-20 测试指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0048_0002.jpg?sign=1739322929-GuuZ6owHf3T6vKrAAeeJcKUOZZsuspGG-0-9804fc1ab98dff7d94d372bf845b46f0)
3.程序控制指令
程序控制指令包括分支指令(B,BC)、调用指令(CALL)、中断指令(INTR,TRAP)、返回指令(RET)、重复指令(RPT)、堆栈操作指令(FRAME,POP)和其他程序控制指令(IDLE,NOP),这些指令根据不同情况分别需要1~6个指令周期。
(1)分支指令
分支指令共有6条,如表3-21所示。
表3-21 分支指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0048_0003.jpg?sign=1739322929-nmBOv2B2R6vHmWsjSSj9CkFapMHpOFP5-0-964424fa779675c36338a14399d45381)
(2)调用指令
调用指令共有5条,如表3-22所示。
表3-22 调用指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0049_0001.jpg?sign=1739322929-beyfWuzSQ8iUOvj2i2uA8WfztDKoGVwP-0-3fd95d8bf73d6f24675ce7f35675d256)
(3)中断指令
中断指令共有两条,如表3-23所示。
表3-23 中断指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0049_0002.jpg?sign=1739322929-TgX0zPdJ099rmLRGoMOEb3qVJSAmd35p-0-9e55ad13aaa5952411648c6b7da5be31)
(4)返回指令
返回指令共有6条,如表3-24所示。
表3-24 返回指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0049_0003.jpg?sign=1739322929-OGTYn3oZ649adcJw8g7IAP4ouPTRMcJM-0-f76ec78494259146536a3403920da915)
(5)重复指令
重复指令共有5条,如表3-25所示。
表3-25 重复指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0050_0001.jpg?sign=1739322929-q3Iy91y91QdsBktnMYSsfiqpdbV601WS-0-a962ef34c1ada0849969efa8422437f2)
(6)堆栈操作指令
堆栈操作指令共有5条,如表3-26所示。
表3-26 堆栈操作指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0050_0002.jpg?sign=1739322929-8LJIEcN8D7kqX5Zp6cBmxsBzzGtWXm1c-0-282fe47d18020ac7c5c19b7acd03d04f)
(7)其他程序控制指令
其他程序控制指令共有7条,如表3-27所示。
表3-27 其他程序控制指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0050_0003.jpg?sign=1739322929-odZbIYqtLzEIS673wAWLp0FmjWu78h9d-0-fc3fe0455e161a6fd65bceea41c0e7fb)
4.装入指令
装入和存储指令包括一般存储指令(ST),一般装入指令(LD),条件存储指令(CMPS、SACCD),并行装入和存储指令(LD||ST),并行装入和乘法指令(LD||MAC),并行存储和加减指令(LD||ADD、LD||SUB),并行存储和乘法指令(ST||MAC),以及其他存储和装入指令(MVDD、PORTW、READA)。这些指令根据不同情况分别需要1~5个指令周期。
(1)一般存储指令
一般存储指令共有14条,如表3-28所示。
表3-28 一般存储指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0051_0001.jpg?sign=1739322929-vmIY9cn3byxctQ2xmpD9kDSc6wyZlZQN-0-0bfaf7adf923df4cae992307f4708859)
(2)一般装入指令
一般装入指令共有21条,如表3-29所示。
表3-29 一般装入指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0051_0002.jpg?sign=1739322929-b0W9l2FOtyq0Nd2vMu8rko1RO1UkVxVT-0-aca8c7739b720a5a05ea9c175cec0dc9)
(3)条件存储指令
条件存储指令共有4条,如表3-30所示。
表3-30 条件存储指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0052_0002.jpg?sign=1739322929-ItOURbExfVU6bkwNHKd3Ly4UsqDx5j8t-0-4fe7f441223f53469ae993c616d5b250)
(4)并行装入和存储指令
并行装入和存储指令共有两条,如表3-31所示。
表3-31 并行装入和存储指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0052_0003.jpg?sign=1739322929-rrTzrIQ7afPKKZougEe6TmI381ohtnZw-0-b4a5dac99467f03d5137951cc4a4c6ab)
(5)并行装入和乘法指令
并行装入和乘法指令共有4条,如表3-32所示。
表3-32 并行装入和乘法指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0052_0004.jpg?sign=1739322929-npXZqLAUJq2xqWUESEEFXIN5e8V5l3cv-0-09599ff60caef0e055b51d6fb7e90c7a)
(6)并行存储和加减指令
并行存储和加减指令共有两条,如表3-33所示。
表3-33 并行存储和加减指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0053_0001.jpg?sign=1739322929-lvR0A15xopORmKdwVxX0cmD9vDoWFwEG-0-eed0a567f546c4964802ebcaead2904c)
(7)并行存储和乘法指令
并行存储和乘法指令共有5条,如表3-34所示。
表3-34 并行存储和乘法指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0053_0002.jpg?sign=1739322929-37wvt3DPJWnvxGLBztMneK58ACGawkOt-0-911a8d7b612f9aad5d933ba55da6b1da)
(8)其他存储和装入指令
其他存储和装入指令共有12条,如表3-35所示。
表3-35 其他存储和装入指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0053_0003.jpg?sign=1739322929-89nGnqWswAUGmLNZYyUJPvz6VSLUDSPB-0-4d89805dd4853c954f596a34269774b7)
5.单个循环指令
TMS320C54x有单个循环指令,它们引起下一指令被重复执行。重复执行的次数由单个循环指令中的一个操作数决定,并等于操作数加1。该操作数的值被存储在一个16位的重复计数寄存器(RC)中。该寄存器中的值只能由单个循环指令中的操作数决定,其最大值是65536。当下一条指令被重复执行时,绝对程序或数据地址将自动加1。当重复指令被解码时,所有中断(包括NMI,不包括RS)均被屏蔽,直到下一条指令被重复执行完毕。重复的功能体现在一些指令中,如乘加或块移动指令,这样就增加了指令的执行速度。下列指令是因为重复执行而由多重循环变成单重循环的。
(1)单个循环指令
对单个数据存储器操作数指令而言,若有一个长的偏移地址或绝对地址,指令不可被循环执行。单个循环指令共有11条,如表3-36所示。
表3-36 单个循环指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0054_0001.jpg?sign=1739322929-yPQl7zGhhVGRf3c3yVsffxy5KAgDws67-0-425fffbe530067bcc9ad54a7ee97efaa)
(2)不可使用RPT或RPTZ指令循环执行的指令
不可使用RPT或RPTZ指令循环执行的指令共有36条,如表3-37所示。
表3-37 不可使用RPT或RPTZ指令循环执行的指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0054_0002.jpg?sign=1739322929-OxmkZiOT9wDiyXX8xwAnYbila39qggLg-0-4f5dd91380d81e103ef341b2c3e35698)
在TMS320C54x系列中,有一些特殊的DSP指令,它们在一个指令周期内,用一条指令就可以实现一般需要几条指令才可实现的功能,如MAC指令,它可以在一个指令周期中完成一次乘法和一次加法运算。这样既节省了时间,又提高了编程的灵活性。