DSP技术与应用实例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.2 指令系统

TMS320C54x可以使用助记符方式和表达式方式两套指令系统。TMS320C54x指令系统可以分成算术指令、逻辑指令、程序控制指令、装入和存储指令4种基本类型。

3.2.1 符号与意义

表3-9中列出TMS320C54x指令系统的符号和意义。

表3-9 TMS320C54x指令系统的符号与意义

续表

续表

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 加法指令

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 减法指令

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 乘法指令

在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 乘加和乘减指令

表3-14 双操作数指令

表3-15 特殊应用指令

续表

2.逻辑指令

逻辑指令包括与指令(AND)、或指令(OR)、异或指令(XOR)、移位指令(ROL)和测试指令(位F)。根据操作数的不同,这些指令需要1~2个指令周期。

(1)与指令

与指令共有5条,如表3-16所示。

表3-16 与指令

(2)或指令

或指令共有5条,如表3-17所示。

表3-17 或指令

(3)异或指令

异或指令共有5条,如表3-18所示。

表3-18 异或指令

(4)移位指令

移位指令共有6条,如表3-19所示。

表3-19 移位指令

(5)测试指令

测试指令共有5条,如表3-20所示。

表3-20 测试指令

3.程序控制指令

程序控制指令包括分支指令(B,BC)、调用指令(CALL)、中断指令(INTR,TRAP)、返回指令(RET)、重复指令(RPT)、堆栈操作指令(FRAME,POP)和其他程序控制指令(IDLE,NOP),这些指令根据不同情况分别需要1~6个指令周期。

(1)分支指令

分支指令共有6条,如表3-21所示。

表3-21 分支指令

(2)调用指令

调用指令共有5条,如表3-22所示。

表3-22 调用指令

(3)中断指令

中断指令共有两条,如表3-23所示。

表3-23 中断指令

(4)返回指令

返回指令共有6条,如表3-24所示。

表3-24 返回指令

(5)重复指令

重复指令共有5条,如表3-25所示。

表3-25 重复指令

(6)堆栈操作指令

堆栈操作指令共有5条,如表3-26所示。

表3-26 堆栈操作指令

(7)其他程序控制指令

其他程序控制指令共有7条,如表3-27所示。

表3-27 其他程序控制指令

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 一般存储指令

(2)一般装入指令

一般装入指令共有21条,如表3-29所示。

表3-29 一般装入指令

(3)条件存储指令

条件存储指令共有4条,如表3-30所示。

表3-30 条件存储指令

(4)并行装入和存储指令

并行装入和存储指令共有两条,如表3-31所示。

表3-31 并行装入和存储指令

(5)并行装入和乘法指令

并行装入和乘法指令共有4条,如表3-32所示。

表3-32 并行装入和乘法指令

(6)并行存储和加减指令

并行存储和加减指令共有两条,如表3-33所示。

表3-33 并行存储和加减指令

(7)并行存储和乘法指令

并行存储和乘法指令共有5条,如表3-34所示。

表3-34 并行存储和乘法指令

(8)其他存储和装入指令

其他存储和装入指令共有12条,如表3-35所示。

表3-35 其他存储和装入指令

5.单个循环指令

TMS320C54x有单个循环指令,它们引起下一指令被重复执行。重复执行的次数由单个循环指令中的一个操作数决定,并等于操作数加1。该操作数的值被存储在一个16位的重复计数寄存器(RC)中。该寄存器中的值只能由单个循环指令中的操作数决定,其最大值是65536。当下一条指令被重复执行时,绝对程序或数据地址将自动加1。当重复指令被解码时,所有中断(包括NMI,不包括RS)均被屏蔽,直到下一条指令被重复执行完毕。重复的功能体现在一些指令中,如乘加或块移动指令,这样就增加了指令的执行速度。下列指令是因为重复执行而由多重循环变成单重循环的。

(1)单个循环指令

对单个数据存储器操作数指令而言,若有一个长的偏移地址或绝对地址,指令不可被循环执行。单个循环指令共有11条,如表3-36所示。

表3-36 单个循环指令

(2)不可使用RPT或RPTZ指令循环执行的指令

不可使用RPT或RPTZ指令循环执行的指令共有36条,如表3-37所示。

表3-37 不可使用RPT或RPTZ指令循环执行的指令

在TMS320C54x系列中,有一些特殊的DSP指令,它们在一个指令周期内,用一条指令就可以实现一般需要几条指令才可实现的功能,如MAC指令,它可以在一个指令周期中完成一次乘法和一次加法运算。这样既节省了时间,又提高了编程的灵活性。