![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=1738841110-i86orHScvYlZ66qv3Qfb7XiUwrEDCy6v-0-36ea54700c0812eb3100544858bf5abf)
续表
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0040_0001.jpg?sign=1738841110-eegIkal0w5QC7uLUUl0r9uzbrfrUcT8s-0-a63605088d1e31aeedcc3981869d96fa)
续表
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0041_0001.jpg?sign=1738841110-jEGDrF4RhW3apHs6lrkwcukmDVH9fnLc-0-4987ac1b11c29233190bc4131500278f)
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=1738841110-9PODTdd9T0UzCcVtYA8b4b70sM7XLykf-0-61cbc7e2c1d1206fc8b87b48a6ad21f1)
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=1738841110-Hf9iw3JoW6XwpjNPKYlVjgwbw3Ja0aXD-0-7f92f1052f3e10718965a56e234e1d4f)
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=1738841110-WjVa7qk6iKrAcwO95JQ3aquGiGv1Maw3-0-6250ede56dd1db796807add01c6d35da)
在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=1738841110-maHhag2uCNUOICjTkkeAhm33W6DdnyVk-0-5e41a5f74525c337a2a8c42eb0d0e920)
表3-14 双操作数指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0046_0001.jpg?sign=1738841110-8c0UhdSYF7hUITT4gdMClB3ceT9LTmxE-0-84d2e04b9ed18483082349b0c842b502)
表3-15 特殊应用指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0046_0002.jpg?sign=1738841110-S3JAbKMsVgbxkYxMt5gRB8DWSrHII743-0-b88507a12cd9ca2f40a9b860e81f989e)
续表
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0047_0001.jpg?sign=1738841110-Kh1wFm42gvLoFXomIfvQeNxWGFveTbid-0-fef4e6b53f76429f61958d8d633e71dc)
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=1738841110-jhVxQzI6GkX1P03Eyp9o7ZkVdoLIL39d-0-4bdd3aa1d9a48c38bc719c6b221fad99)
(2)或指令
或指令共有5条,如表3-17所示。
表3-17 或指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0047_0003.jpg?sign=1738841110-4xit2XDYDr7q45AsFqITRobUXKyN97MM-0-66e70b88f4a590542ce2609b1798d9cd)
(3)异或指令
异或指令共有5条,如表3-18所示。
表3-18 异或指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0047_0004.jpg?sign=1738841110-kzNpESwu41GmCp0lc97G97Yubv5OtFXm-0-c281bd98a7104fc8768e0e18e251f801)
(4)移位指令
移位指令共有6条,如表3-19所示。
表3-19 移位指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0048_0001.jpg?sign=1738841110-CZqPBQKWOjWr3X67w2CKHukqu2caXqlo-0-c187dcb746d5cace9209fd6f66c1f374)
(5)测试指令
测试指令共有5条,如表3-20所示。
表3-20 测试指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0048_0002.jpg?sign=1738841110-fskjWXX38pVtz6TVSrBDOlXRalBeEdck-0-9e55b3ba04cdee35e38a844818407cc5)
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=1738841110-sxTJLq72dLrrREXy9Vii0CM2CyBSXU7x-0-530aed911ef35af11272c8c19f287061)
(2)调用指令
调用指令共有5条,如表3-22所示。
表3-22 调用指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0049_0001.jpg?sign=1738841110-xKliI5vwvJDvlapwXE00ZBMRvjtEtiJS-0-f9312d0a318f18c25135c17004108d16)
(3)中断指令
中断指令共有两条,如表3-23所示。
表3-23 中断指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0049_0002.jpg?sign=1738841110-CBr9toNKg4NwopmS9qovUiM61vM7UlkM-0-a22b1a8b83da3a9e5c401f6576cf2a47)
(4)返回指令
返回指令共有6条,如表3-24所示。
表3-24 返回指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0049_0003.jpg?sign=1738841110-zrcrXToHbQR8gE5sLzzKngMLn7TBYAp5-0-5288c868659b1b3d151d3ab9b6d9914c)
(5)重复指令
重复指令共有5条,如表3-25所示。
表3-25 重复指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0050_0001.jpg?sign=1738841110-Wtz62NLTDLQXNZDoECgujyHKLhPXDhgc-0-31af0c8e48818535b9bd255d3859defc)
(6)堆栈操作指令
堆栈操作指令共有5条,如表3-26所示。
表3-26 堆栈操作指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0050_0002.jpg?sign=1738841110-psXrXtek7bgw5ACxsxgamXlHDCmQe7w7-0-482c391efff7aad44cea6768df6acd02)
(7)其他程序控制指令
其他程序控制指令共有7条,如表3-27所示。
表3-27 其他程序控制指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0050_0003.jpg?sign=1738841110-AxmrKa8pF5VvUVyzvlL2TJt85HU83lCq-0-4f6c719a2b0a5d5643b4a66dde7c4bbc)
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=1738841110-DMdL5n2rnDlREVgKXQLaNU5FA3JQ5nsn-0-31e67c5539c4d4de025a1e9ebac01edb)
(2)一般装入指令
一般装入指令共有21条,如表3-29所示。
表3-29 一般装入指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0051_0002.jpg?sign=1738841110-jq9mBVh9kuptFxVLfttHEgHFzGFl4mxL-0-a53d94857e49ff1c98878c44076ebf18)
(3)条件存储指令
条件存储指令共有4条,如表3-30所示。
表3-30 条件存储指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0052_0002.jpg?sign=1738841110-X7xWdggBmd3zvYyPvJ7qin0jJSpxo5iB-0-dce482d6890ac1dcbfc422a246b295e5)
(4)并行装入和存储指令
并行装入和存储指令共有两条,如表3-31所示。
表3-31 并行装入和存储指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0052_0003.jpg?sign=1738841110-7Ap0tbexlGcUCAiIfnLuj3pL6XJVyYb8-0-94f1b6a4d4a47d996855b13127e4982c)
(5)并行装入和乘法指令
并行装入和乘法指令共有4条,如表3-32所示。
表3-32 并行装入和乘法指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0052_0004.jpg?sign=1738841110-G1ix7O9F2NJADyZzCuutJpUld4noBVhm-0-b474e49001665dcc999c338c01a7381a)
(6)并行存储和加减指令
并行存储和加减指令共有两条,如表3-33所示。
表3-33 并行存储和加减指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0053_0001.jpg?sign=1738841110-xAcJnP58vDsWOyVh4Vq5cLfV3TViOgRL-0-744210e0e3cdc24813b783ed5278b139)
(7)并行存储和乘法指令
并行存储和乘法指令共有5条,如表3-34所示。
表3-34 并行存储和乘法指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0053_0002.jpg?sign=1738841110-sTl47j1dSbyCLWCwHAAwK8sKsIsgJ8KY-0-90ac10dabbaa2b441427b4c4f219a4c2)
(8)其他存储和装入指令
其他存储和装入指令共有12条,如表3-35所示。
表3-35 其他存储和装入指令
![](https://epubservercos.yuewen.com/E6988F/3729561503561801/epubprivate/OEBPS/Images/figure_0053_0003.jpg?sign=1738841110-8QSInlxcGHOcKLXS6e3EOdLbmVZ7lOVE-0-0a2272335c4421a2ec667d7629fd4a47)
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=1738841110-A7iw8AVT7MShQd29w4WDLhh2CeWIZmvm-0-0068756df85176f6ceb907f22638b836)
(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=1738841110-zEIwuTviUAmEKRquga2XNVU22TZdWX4U-0-a5ea9fa1dd0a5ab03c6a773e6d9bc851)
在TMS320C54x系列中,有一些特殊的DSP指令,它们在一个指令周期内,用一条指令就可以实现一般需要几条指令才可实现的功能,如MAC指令,它可以在一个指令周期中完成一次乘法和一次加法运算。这样既节省了时间,又提高了编程的灵活性。