![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=1739293166-fu3rrPmKXQrMe6QWyupmj4XsFJTQwafY-0-570bb34fcbef4620c8dd0826bc2b5172)
续表
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0040_0001.jpg?sign=1739293166-6joYRyQ8Y7HQfhQlCHXNgLPxRjbvZ4zT-0-957dcee17115d5c9973ef4bba1bbff00)
续表
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0041_0001.jpg?sign=1739293166-czeeqNGqSZhIyHLFQ8KmIfGEvyexSB6F-0-13b91c7b8242f0842367c2abd27805b3)
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=1739293166-mNz96be0PYDF70aEuEoiwSh1toSPjOH8-0-fd111099d5d3c5c80e4c14a79710beb6)
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=1739293166-1ppnXSiWV4rRa2W79oxLT32oMFKt8iYo-0-a4b4049020d782e51e6aa8a1fd1f9a6b)
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=1739293166-tL6WAcKibJM8iF51V6tKgOnYGvtVHpdJ-0-6df0f68c4e9904f3ef5c862014090b55)
在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=1739293166-2I1CSvKw1NAzdYERfzwcUeLO5ThEL6Oe-0-00a001e6698471b29702876a8c584e6d)
表3-14 双操作数指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0046_0001.jpg?sign=1739293166-kjA9GJdwdk5b1yX5wSzDG2VOPi6d38Hl-0-5a48bae7a1a58a7c5773ea65f14632d4)
表3-15 特殊应用指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0046_0002.jpg?sign=1739293166-o5zpuXFqv2wF1CfYEIt2dCHxpVQw3oc4-0-3af932c06cfdc7e0284140cc8edd4238)
续表
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0047_0001.jpg?sign=1739293166-q24CvOgVewVTQM3U4SJlGVIzCXCh32zy-0-bddc25890d418b9d2f756e21b8b0de4b)
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=1739293166-o0jhfzrzBZR2Y5x5XL0mXKbBAgl1geAj-0-39a55cfc942e0bd92eae2757920a71e9)
(2)或指令
或指令共有5条,如表3-17所示。
表3-17 或指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0047_0003.jpg?sign=1739293166-xEJK8kDOpyLgP0Gw41CQAcgQ9WmoCJXA-0-1003318b95d888b1789d8ae27613b5f4)
(3)异或指令
异或指令共有5条,如表3-18所示。
表3-18 异或指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0047_0004.jpg?sign=1739293166-zGxjQJ3eVQaxkkrBVc3nklAZQQ16ocN5-0-05e9459e3e52c9b92d53a32ff6d3f4ce)
(4)移位指令
移位指令共有6条,如表3-19所示。
表3-19 移位指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0048_0001.jpg?sign=1739293166-6i9xlIBnZFF5yosR0jpVdpUmks7qkviT-0-3aabfcbd624941acb557a52ba232ec84)
(5)测试指令
测试指令共有5条,如表3-20所示。
表3-20 测试指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0048_0002.jpg?sign=1739293166-0UvJipzT8u5jl8PfnVHCxKf9QpCT9s2P-0-ccb906bb6a63302af75b36154db4773f)
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=1739293166-JkU67PcJ8EN8bEUzjzxOpBzw3XcpYQeg-0-fb18eac3e96d6d7be93c24f9ae4b996c)
(2)调用指令
调用指令共有5条,如表3-22所示。
表3-22 调用指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0049_0001.jpg?sign=1739293166-AL013UMmE3RJjmyEMrRAAa9LL895yjSy-0-4db2b66871849e476bc9c15aef461fe8)
(3)中断指令
中断指令共有两条,如表3-23所示。
表3-23 中断指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0049_0002.jpg?sign=1739293166-VxJvqzBUzuaLPGb6XPUjNYlKBaHvc5tU-0-60cd8554030254822bf7b98c3635f4e6)
(4)返回指令
返回指令共有6条,如表3-24所示。
表3-24 返回指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0049_0003.jpg?sign=1739293166-kfenoKNBzxj6UgZuxYdf9veWyDhbrNnW-0-9529ef8e9bd15c51ffa23dd80fb235a4)
(5)重复指令
重复指令共有5条,如表3-25所示。
表3-25 重复指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0050_0001.jpg?sign=1739293166-AShTma6Gy3I3YZe8PHUyJYnR4W5nusBX-0-f4e61c2e7d53420f3cba7a01f0564c59)
(6)堆栈操作指令
堆栈操作指令共有5条,如表3-26所示。
表3-26 堆栈操作指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0050_0002.jpg?sign=1739293166-o9W4H76bAznP13WaMmiu56rGlFt6m6jW-0-b695c7071cfd8744a4eb485682319957)
(7)其他程序控制指令
其他程序控制指令共有7条,如表3-27所示。
表3-27 其他程序控制指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0050_0003.jpg?sign=1739293166-AlXcGNYH2Iqw9fsV6nUjUDDtJZzBGeZJ-0-956f6e06f75aff89a56f2017286779d8)
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=1739293166-SkY0yNscItna27hwjMObnSzBFumODGXz-0-b69400e111f9689912f76c85bdc83f33)
(2)一般装入指令
一般装入指令共有21条,如表3-29所示。
表3-29 一般装入指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0051_0002.jpg?sign=1739293166-Fje82qvzQtsnfqIYJ12rWNHcbgJvs07m-0-d89f56d9387a3e87cd0deea723d1ca04)
(3)条件存储指令
条件存储指令共有4条,如表3-30所示。
表3-30 条件存储指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0052_0002.jpg?sign=1739293166-oM6YADfAQJpukCizsVVybKTHp0LiUKYj-0-afbce2a60b5452ba5d70f8c6983d9fe7)
(4)并行装入和存储指令
并行装入和存储指令共有两条,如表3-31所示。
表3-31 并行装入和存储指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0052_0003.jpg?sign=1739293166-zeXC5VbRo8RQ9jnrM2c1wk66Qn3dmnEu-0-dc376b8452a4f54a0134beb83d60ddf1)
(5)并行装入和乘法指令
并行装入和乘法指令共有4条,如表3-32所示。
表3-32 并行装入和乘法指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0052_0004.jpg?sign=1739293166-qMkJ5ch1BTPBdTFwcLKMMyixaYxE0ujJ-0-14d00e1fd758cda1b7d9e004c91a02e7)
(6)并行存储和加减指令
并行存储和加减指令共有两条,如表3-33所示。
表3-33 并行存储和加减指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0053_0001.jpg?sign=1739293166-kc4G04Q0OwZbmLyn8ZOlYYe4UGNYIASS-0-a33d23e5992a1fdaa6a5f00949b270df)
(7)并行存储和乘法指令
并行存储和乘法指令共有5条,如表3-34所示。
表3-34 并行存储和乘法指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0053_0002.jpg?sign=1739293166-m8ZyFYGBSXawHsIfiIywoDGAO4E1LYAC-0-2243636a92b9a964c1f74c076ebc59db)
(8)其他存储和装入指令
其他存储和装入指令共有12条,如表3-35所示。
表3-35 其他存储和装入指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0053_0003.jpg?sign=1739293166-7IXDr5HUnjRvBucDlINwYcuLnGdovQu6-0-22d15a1c94056f9b341662acdc4ef441)
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=1739293166-zhGelgKwj5GO35f0rqqfNNOZinYX0hsS-0-db130f33c11fbe77c2779ec731b92a19)
(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=1739293166-DPYy0nPI3SHIIzuiUm4NbePt1dNAyhMY-0-e8c07e7f7996b284ff5aa5d57c0fd2ab)
在TMS320C54x系列中,有一些特殊的DSP指令,它们在一个指令周期内,用一条指令就可以实现一般需要几条指令才可实现的功能,如MAC指令,它可以在一个指令周期中完成一次乘法和一次加法运算。这样既节省了时间,又提高了编程的灵活性。