您好,欢迎访问三七文档
三、TMS320C54X的指令系统TMS320C5000指令系统TMS320C54x的指令集TMS320C54x的指令集有近两百条指令,按功能分为如下几类:算术运算指令逻辑运算指令程序控制指令装入和存储指令一、算术运算指令算术运算指令可分为如下几类:加法指令减法指令乘法指令乘加指令乘减指令双数/双精度指令特殊操作指令定点DSP中数据表示方法当它表示一个整数时,其最低位(D0)表示1,D1位表示2的1次方,次高位(D14)表示2的14方。如果表示一个有符号数时,最高位(D15)为符号位,0表示正数,1表示负数。例如,7FFFH表示最大的正数32767(十进制),而0FFFFH表示最大的负数-1(负数用2的补码方式显示)。实现16位定点加法‘C54X中提供了多条用于加法的指令,如ADD,ADDC,ADDM和ADDS。其中ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算(如32位扩展精度加法),而ADDM专用于长立即数的加法。1、加法指令使用ADD完成加法LDtemp1,A;将变量temp1装入寄存器AADDtemp2,A;将变量temp2与寄存器A相加;结果放入A中STLA,temp3;将结果(低16位)存入变量;temp3中。注意:这里完成计算temp3=temp1+temp2,我们没有特意考虑temp1和temp2是整数还是小数,在加法和下面的减法中整数运算和定点的小数运算都是一样的。利用ADDS实现32位数据装入:LD#0,DP;设置数据页指针LD60H,16,A;将60H的内容装到A的高16位ADDS61H,A;将61H的内容加到A的低16位DLD60H,B;直接装入32位到B寄存器2、减法指令TMS320C54x汇编指令集:符号与缩写:ALUARARxBITCCCCond[d],[D]DABDARdmad算术逻辑单元辅助寄存器,通用某一指定的辅助寄存器(0x7)被测试位(0BITC15)2位的条件码(0CC3)条件执行指令中的操作数延迟选项D地址总线DAB的地址寄存器16位数据存储器立即地址Dmemdstdst_EABEARextpmadhi(A)Kk3k5数据存储器操作数目的累加器(A或B)相对目的累加器的另一个累加器E地址总线EAB的地址寄存器23位程序存储器的立即地址累加器A中的高位部分(位32~16)少于9位的短立即数3位立即数(0k37)5位立即数(-16k515)Dmemdstdst_EABEARextpmadhi(A)Kk3k5数据存储器操作数目的累加器(A或B)相对目的累加器的另一个累加器E地址总线EAB的地址寄存器23位程序存储器的立即地址累加器A中的高位部分(位32~16)少于9位的短立即数3位立即数(0k37)5位立即数(-16k515)Dmemdstdst_EABEARextpmadhi(A)Kk3k5数据存储器操作数目的累加器(A或B)相对目的累加器的另一个累加器E地址总线EAB的地址寄存器23位程序存储器的立即地址累加器A中的高位部分(位32~16)少于9位的短立即数3位立即数(0k37)5位立即数(-16k515)Dmemdstdst_EABEARextpmadhi(A)Kk3k5数据存储器操作数目的累加器(A或B)相对目的累加器的另一个累加器E地址总线EAB的地址寄存器23位程序存储器的立即地址累加器A中的高位部分(位32~16)少于9位的短立即数3位立即数(0k37)5位立即数(-16k515)实现16位定点减法:‘C54X中提供了多条用于减法的指令,如SUB,SUBB,SUBC和SUBS。其中SUBS用于无符号数的减法运算,SUBB用于带借位的减法运算(如32位扩展精度的减法),而SUBC为带条件的移位减,DSP中的除法就是用该指令来实现的。SUB指令与ADD指令一样,有许多的寻址方式减法指令使用举例SUB*AR1+,14,ASUBA,-8,BSUBB5,ASUBB*AR1+,B利用SUBC实现除法在‘C54X中没有提供专门的除法指令,一般有两种方法来完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。另一种方法是使用SUBC指令,重复16次减法完成除法运算。利用SUBC完成Temp1/Temp2LDtemp1,B;将被除数temp1装入B寄存器的低16位RPT#15;重复SUBC指令16次SUBCtemp2,B;使用SUBC指令完成除法STLB,temp3;将商(B寄存器的低16位)存入变量temp3STHB,temp4;将余数(B寄存器的高16位)存入变量temp4注:实际上是完成整数除法3、乘法指令实现16定点整数乘法在‘C54X中提供了大量的乘法运算指令,其结果都是32位,放在A或B寄存器中。乘数在‘C54X的乘法指令很灵活,可以是T寄存器、立即数、存贮单元和A或B寄存器的高16位。如果是无符号数乘时,请使用MPYU指令。这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。整数乘法举例:RSBXFRCT;清FRCT标志,准备整数乘LDtemp1,T;将变量temp1装入T寄存器MPYtemp2,A;完成temp2*temp1,结果放入A寄存器(32位)FRCT标志为小数方式标志位实现小数乘法在‘C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。‘C54X中提供了一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移移位。两个小数(16位)相乘后结果为32位,如果精度允许的话,可以只存高16位,将低16位丢弃,这样仍可得到16位的结果。小数乘法举例SSBXFRCT;FRCT=1,准备小数乘法LDtemp1,16,A;将变量temp1装入寄存器A的高16位MPYAtemp2;完成temp2乘寄存器A的高16位,结;果在B中,同时将temp2装入T寄存器STHB,temp3;将乘积结果的高16位存入变量temp3如:0.1(0x0ccd)*0.7(0x599a)=0.06997680664063(0x08f5F0A4)4、乘加与乘减指令:5、双精度/双数操作指令6、特殊指令数据归一化相关指令EXP、NORM归一化一个数是先求其指数,然后把它调整到最大精度格式。实现方法如下:二、逻辑运算指令逻辑指令包括与、或、异或、移位和测试指令1、与指令(AND)2、或、异或指令3、移位和测试指令三、程序控制指令程序控制指令包括:分支指令、调用指令、中断指令、返回指令、重复指令、堆栈操作指令、混合程序控制指令四、装入和存储指令装入和存储指令包括:一般的装入和存储指令2、存贮指令5、并行存储和加、减、乘法指令6、并行装入和乘法指令7、混合装入和存储指令注意:同一条指令在不同存储器中可能有不同执行时间操作数在双寻址空间、单寻址空间和外部程序代码在双寻址、单寻址和外部空间操作数和代码在相同存储器块中数据空间插入了等待周期程序空间插入了等待周期特殊指令使用说明FIRS指令FIRS指令用于线性相位滤波器的处理。一个如下图的8阶线性相位滤波器的输出表达式:FIR滤波的两指令MAC、FIRS数据块移动MVDD、MVDP、MVPD在C54x系列DSP,数据与数据存储器、数据与程序存储器之间可以方便的进行数据传输,结合单指令循环可实现数据块移动。如16个系数的移动:最小均方运算LMS在进行自适应滤波等操作中经常会使用LMS算法,C54x提供的LMS指令方便了编程。如下图所示的自适应滤波器设计中,滤波器系数修正公式为:基于LMS的自适应滤波编程数据块移动指令MVDD、MVDP、MVPD在C54x系列DSP,数据与数据存储器、数据与程序存储器之间可以方便的进行数据传输,结合单指令循环可实现数据块移动。如16个系数的移动:4、C语言DSP程序设计一、存储器模式二、寄存器规则三、函数调用规则四、中断函数五、表达式分析一、存储器模式(5.5.1节)TMS320C2X/C5X定点处理器:程序存储器:可执行的程序代码;数据存储器:外部变量、静态变量和系统堆栈。由C程序生成的每一块程序或数据存放于存储空间的一个连续段中。(一)C编译器生成的块由C5X编译器编译生成5个初始化段,3个未初始化段和1个.data段(表5.5.1)(二)C系统堆栈定点C编译器采用1个寄存器来管理这个堆栈:AR1——作为堆栈指针(SP被保护起来),它指向堆栈的顶部。激活每个函数时,都在堆栈中建立一个新的帧,以用于分配局部变量和临时变量。C环境能够自动管理这些寄存器。如果需要编写操作堆栈的汇编程序,必须注意这些寄存器的正确使用。定点C编译器的堆栈长度由链接器确定,全局符号_STACK_SIZE的值等于堆栈长度,单位为字节,缺省值为1K字节。同样,需要改变堆栈长度时,在链接时用-stack选项,并在其后指定一个数值。(三)动态存储器分配在运行支持库中,有几个允许在运行时进行动态存储器分配的函数,如malloc、calloc、realloc,动态存储器分配的目标一般采用指针进行寻址。(四)静态和全局变量的存储器分配在C程序中说明的每一个外部或静态变量被分配给一个唯一的连续空间。空间的地址由链接器确定。编译器保证这些变量的空间分配在多个字中以使每个变量按字边界对准。(五)域/结构的对准编译器为结构分配空间时,它分配足够的字以包含所有的结构成员,在一组结构中,每个结构开始于字边界。所有的非域类型对准于字的边界。对域分配足够多的比特,相邻域组装进一个字的相邻比特,但不跨越两个字。如果一个域要跨越两个字,则整个域分配到下一个字中。二、寄存器规则(5.5.3节)在定点c编译器中定义了严格的寄存器使用规则。这些规则对于编写汇编语言与C语言的接口非常重要。如果编写的汇编程序不符合寄存器使用规则,则C环境将被破坏。C编译器使用寄存器的方法在使用和不使用优化器时是不一样的。因为优化器需要使用额外的寄存器作为寄存器变量以提高程序的运行效率。但函数调用时保护寄存器的规则在使用和不使用优化器时是一样的。下面我们来介绍定点C编译器使用寄存器的规则。函数采用汇编编写时,可以使用辅助寄存器、T寄存器和SP寄存器、各种状态寄存器,在使用时必须符合下列规则:1.辅助寄存器(ARP和AR0~AR7)AR2、AR3、AR4和AR5可以自由使用,也就是说,在函数执行过程中可以修改,被调用函数不会保护这些寄存器,如果要保护的话需要调用者来进行。AR6和AR7用作寄存器变量。分别分配给第一个和第二个寄存器变量2.状态寄存器在C编译器中,ARP、ASM、C、OVA、OVB、OVM、SMUL、SXM和TC可以修改。其他位域不可修改。3.其它寄存器累加器A/B可以自由使用,不必保护和恢复。SP、BRC和T寄存器也可以自由使用。(三)寄存器变量在一个函数中,定点C编译器可以自由使用多至两个寄存器变量。如果要在函数中使用寄存器变量,则应在函数的参数表或函数的第一块中定义。否则,作为一般的变量处理。编译器用AR6和AR7作为寄存器变量,其中AR6分配给第一个寄存器变量,AR7分配给第二个寄存器变量。由于在运行时建立一个寄存器变量约需4个指令周期,因此,只有当一个变量访问2次以上,使用寄存器变量的效果才能明显地体现出来。三、函数调用规则(5.5.4节)C编译器规定了一组严格的函数调用规则。除了特殊函数的运行支持外,任何调用C函数或被C函数所调用的函数都必须遵循这些规则,否则就会破坏C环境。(一)参数传递将参数传递给一个C函数时,必须遵循下列规则:(1)函数调用前,将参数压入运行堆栈。(2)以逆序传递参数。也就是说:第一个参数(最左边)最后压栈,而最后一个参数(最右边)最先压。(3)若参数是浮点数或长整型数,则低位字先压栈,高位字后压栈。(4)传递结构时,采用多字方式。(二)局部帧的产生函数被调用时,编译器在运行栈中建立一个帧以存储信息。当前函数帧
本文标题:dsp复习详解
链接地址:https://www.777doc.com/doc-2910495 .html