1、DSPDSP原理与应用原理与应用第第7章章 应用程序设计应用程序设计1第第7章章 应用程序设计应用程序设计内容提要:内容提要:n7.1 定标与溢出处理定标与溢出处理n7.2 基础算术运算基础算术运算n7.3 FIR滤波器滤波器n7.4 IIR滤波器滤波器n7.5 快速傅里叶变换快速傅里叶变换(FFT)n7.6 DSPLIB的使用的使用27.1定标与溢出处理定标与溢出处理n7.1.1 数的定标数的定标n7.1.2 溢出的处理方法溢出的处理方法n7.1.3 常用信号处理算法中的定标方法常用信号处理算法中的定标方法37.1.1 数的定标数的定标l小数定标的概念小数定标的概念u设定一个设定一个16位数
2、的小数点处于该数中的哪一位位数的小数点处于该数中的哪一位;u可以表示不同大小和不同精度的小数可以表示不同大小和不同精度的小数;lQ表示法表示法u表表7-1列出了一个列出了一个16位数的位数的16种种Q表示及它们表示及它们所能表示的十进制数值范围。所能表示的十进制数值范围。4计算机有两种数据表示方法:计算机有两种数据表示方法:定点数定点数表示法表示法 浮点数浮点数表示法表示法定点数定点数就是小数点位置固定的数。数据的表示形式是:就是小数点位置固定的数。数据的表示形式是:57.1.1 数的定标数的定标 符号位符号位 整数部分整数部分.小数部分小数部分C55x DSPC55x DSP是定点芯片是定点
3、芯片,采用补码形式来表示无符号,采用补码形式来表示无符号数和有符号数。数和有符号数。CPU在执行指令时,并不知道处理的数据是整数在执行指令时,并不知道处理的数据是整数还是小数,也不能指出小数点的位置。在编程时必还是小数,也不能指出小数点的位置。在编程时必须由程序员须由程序员指出一个数的小数点处于哪一位指出一个数的小数点处于哪一位,这就,这就是是定标定标(scale)的概念。的概念。常用的定标方法是常用的定标方法是Q表示法表示法,Q表示法用表示法用Q0,Q1,Qi,Q15 分别表示小数点在分别表示小数点在D0位之后位之后、D1位之位之后、后、Di位之后、位之后、D15位之后位之后。64.5 汇编
4、语言程序设计汇编语言程序设计严格地严格地,是是Qm.n 格式格式:n位小数位小数,m位整数位整数,1位位符符号位号位,共共m+n+1位二进制数。位二进制数。表7-1 Q表示及数值范围Q表示表示 小数点位置小数点位置整数位整数位 小数位小数位十进制表示范围十进制表示范围精度精度-幂幂Q15在在D15之后之后015-10.99996952-157Q13在在D13之后之后213-43.99987792-13Q12在在D12之后之后312-87.99975592-12Q11在在D11之后之后411-1615.99951172-11Q10在在D10之后之后510-3231.99902342-10Q9在在
5、D9之后之后69-6463.998043752-9Q8在在D8之后之后78-128127.99609382-8Q7在在D7之后之后87-256255.99218752-7Q6在在D6之后之后96-512511.98043752-6Q5在在D5之后之后105-10241023.968752-5Q4在在D4之后之后114-20482047.93752-4Q3在在D3之后之后123-40964095.8752-3Q2在在D2之后之后132-81928191.752-2Q1在在D1之后之后141-1638416383.52-1Q0在在D0之后之后150-32768367672 0Q14在在D14之后之
6、后114-21.99993902-14表表7-1 Q表示及数值范围表示及数值范围Q表示十进制数X表示范围Q15-1X0.9999695Q14-2X1.9999390Q13-4X3.9998779Q12-8X7.9997559Q11-16X15.9995117Q10-32X31.9990234Q9-64X63.9980469Q8-128X127.9960938Q7-256X255.9921875Q6-512X511.9804375Q5-1024X1023.96875Q4-2048X2047.9375Q3-4096X4095.875Q2-8192X8191.75Q1-16384X16383.5Q0
7、-32768X327678l不同的不同的Q所表示的数不仅范围不同所表示的数不仅范围不同,而且精度也不相同而且精度也不相同:uQ越大越大,数值范围越小数值范围越小,但精度越高但精度越高;uQ越小越小,数值范围越大数值范围越大,但精度就越低但精度就越低;例如例如:Q0数值范围是数值范围是-32768到到+32767,其精度为其精度为1;Q15的数值范围为的数值范围为-1到到0.9999695,精度为精度为 1/32768=0.00003051对定点数而言对定点数而言,数值范围与精度是一对矛盾。一个变量数值范围与精度是一对矛盾。一个变量要想能够表示比较大的数值范围要想能够表示比较大的数值范围,必须以
8、牺牲精度为代必须以牺牲精度为代价价;而想提高精度而想提高精度,则数的表示范围就相应地减小。则数的表示范围就相应地减小。在实际的定点算法中,应该根据具体问题进行折衷处在实际的定点算法中,应该根据具体问题进行折衷处理理,以达到最佳效果。以达到最佳效果。9l在在C55x中中,16位整数采用补码形式表示。每个采用位整数采用补码形式表示。每个采用Qi定标定标的的16位数用位数用1个符号位、个符号位、i个小数位和个小数位和15-i个整数位来表示个整数位来表示。10.表表7-2 同样的数在不同定标方式下所表示的具体数值同样的数在不同定标方式下所表示的具体数值l同样一个同样一个16位数,位数,若小数点设定的位
9、置不同若小数点设定的位置不同,它,它所表示的数也就不同。所表示的数也就不同。Q格式 十六进制数二进制数十进制数Q02000H0010 0000 0000 0000b8192Q142000H0010 0000 0000 0000b0.5Q152000H0010 0000 0000 0000b0.25Q0E000H1110 0000 0000 0000b-8192Q14E000H1110 0000 0000 0000b-0.5Q15E000H1110 0000 0000 0000b-0.2511定标不同定标不同.7.1.2 溢出的处理方法溢出的处理方法l如果算术运算结果超出寄存器所能表示的最大如果
10、算术运算结果超出寄存器所能表示的最大数就会出现溢出数就会出现溢出;u因为因为16位定点位定点DSP的动态范围有限,所以在使的动态范围有限,所以在使用时必须注意动态范围以防溢出用时必须注意动态范围以防溢出;l溢出还与输入信号的特性和运算法则有关溢出还与输入信号的特性和运算法则有关。1.溢出溢出12 C55x有以下几种硬件特性可以处理溢出:有以下几种硬件特性可以处理溢出:l保护位保护位 C55x的每个的每个累加器都有累加器都有8个保护位个保护位(3932位位),允许连续允许连续256次乘加操作而累加器不溢出次乘加操作而累加器不溢出;l溢出标志位溢出标志位 C55x的每个的每个累加器都有相关的溢出标
11、志位累加器都有相关的溢出标志位,当累当累加器操作结果出现溢出时加器操作结果出现溢出时,这个标志位就会置位。这个标志位就会置位。2.C55x的溢出处理机制的溢出处理机制13l饱和方式位饱和方式位SATD和和SATAuSATD控制控制D单元的操作单元的操作,SATA控制控制A单元的操作。单元的操作。u若若SATD=1,当当D单元发生溢出时单元发生溢出时,对对D单元结果进单元结果进行饱和处理。不管饱和方式位值是什么行饱和处理。不管饱和方式位值是什么,当累加器发当累加器发生溢出时生溢出时,相应溢出标志位相应溢出标志位(ACOVx)都会被置位都会被置位;uA单元没有溢出标志位单元没有溢出标志位,但如果但
12、如果SATA=1,发生溢出发生溢出时时,结果也会结果也会进行饱和处理进行饱和处理。饱和处理是用最近的边界值代替溢出结果。饱和处理是用最近的边界值代替溢出结果。例例,16,16位寄存器范围是位寄存器范围是8000h(8000h(最小负数最小负数)7FFFh(7FFFh(最大正数最大正数),),饱和处理就是饱和处理就是:用用7FFFh7FFFh代替比代替比7FFFh7FFFh大的结果大的结果;用用8000h8000h代替比代替比8000h8000h小的结果。小的结果。14l饱和饱和。饱和是一种处理溢出的方法,但是饱和会剪掉。饱和是一种处理溢出的方法,但是饱和会剪掉部分输出信号,可能会引起信号失真和
13、引起系统非线部分输出信号,可能会引起信号失真和引起系统非线性。性。l输入定标输入定标scaling。分析所要使用的系统,假定最坏。分析所要使用的系统,假定最坏的情况,然后对输入信号定标,以防止溢出。但是这的情况,然后对输入信号定标,以防止溢出。但是这种方法会极大地降低输出信号的精确度。种方法会极大地降低输出信号的精确度。l固定定标固定定标scaling。假定最坏情况。假定最坏情况,对中间结果定标。对中间结果定标。这种方法可防止溢出这种方法可防止溢出,同时增加了系统的信噪比。同时增加了系统的信噪比。l动态定标动态定标scaling。可以监测中间结果的范围,只在。可以监测中间结果的范围,只在需要的
14、时候对中间结果定标。这种方法可以防止溢出需要的时候对中间结果定标。这种方法可以防止溢出但会增加计算量。但会增加计算量。3.溢出的处理方法溢出的处理方法157.1.3 常用信号处理算法中的定标方法常用信号处理算法中的定标方法lFIR滤波器的定标滤波器的定标scaling方法方法u在在FIR滤波器中处理溢出的最好方法是设计时使滤滤波器中处理溢出的最好方法是设计时使滤波器的增益小于波器的增益小于1,这样就不需要对输入信号定标。,这样就不需要对输入信号定标。这种方法和累加器的保护位结合起来,可以有效这种方法和累加器的保护位结合起来,可以有效地防止溢出。地防止溢出。u由于对信号处理的负面影响,在由于对信
15、号处理的负面影响,在FIR滤波器中不使滤波器中不使用固定定标和输入定标。如果不考虑计算量,在用固定定标和输入定标。如果不考虑计算量,在FIR滤波器中可以使用动态定标。对一些类型的音滤波器中可以使用动态定标。对一些类型的音频信号,饱和处理也是一种常用的方法。频信号,饱和处理也是一种常用的方法。16lIIR滤波器的定标滤波器的定标scaling方法方法uIIR滤波器的定点实现推荐使用多个二阶基本节滤波器的定点实现推荐使用多个二阶基本节级联组成,这样可以减小高阶滤波器频率响应灵级联组成,这样可以减小高阶滤波器频率响应灵敏度。由于滤波器系数的量化引入误差,因此避敏度。由于滤波器系数的量化引入误差,因此
16、避免溢出对免溢出对IIR滤波器非常重要。滤波器非常重要。u可以通过把中间结果保存在处理器累加器来避免可以通过把中间结果保存在处理器累加器来避免节间数据溢出。为防止在第节间数据溢出。为防止在第k阶内部发生数据溢出,阶内部发生数据溢出,需要用增益系数对滤波器的单位脉冲响应需要用增益系数对滤波器的单位脉冲响应(前馈通前馈通道道)定标。定标。u动态定标动态定标scaling方法方法。在每个阶段若检测到溢出。在每个阶段若检测到溢出,滤波器内部状态滤波器内部状态,定标定标都被减半都被减半,以提高指令周期以提高指令周期换取为代价提高了结果的精度。换取为代价提高了结果的精度。knGabs(f(n),2 1/2
17、knG(abs(f(n)17l FFT的定标方法的定标方法u在在FFT操作里,每次蝶形运算后数据平均增加一位。操作里,每次蝶形运算后数据平均增加一位。输入定标输入定标需要移位需要移位 (FFT长度为长度为N),这会导致),这会导致在计算在计算FFT之前就衰减之前就衰减 6 dB。u在在固定定标固定定标中中,每级蝶形运算输出除以每级蝶形运算输出除以2,这是最常用这是最常用的的FFT定标方法定标方法,因为它简单而且有比较好的信噪比。因为它简单而且有比较好的信噪比。但是但是,对于大的对于大的FFT,这种定标可能会使信息丢失。这种定标可能会使信息丢失。u另一种方法是另一种方法是动态定标动态定标,即在输
18、出溢出时再除以即在输出溢出时再除以2。在。在这种情况下这种情况下,会在这个过程中指定一个变量会在这个过程中指定一个变量,每定标一每定标一次变量的值加次变量的值加1,计算结束后根据变量的值把结果乘以计算结束后根据变量的值把结果乘以一个系数。动态定标的信噪比最好一个系数。动态定标的信噪比最好,但会增加但会增加FFT循环循环次数。次数。N2logN2log187.2 基础算术运算基础算术运算n7.2.1 加减运算加减运算n7.2.2 乘法运算乘法运算n7.2.3 除法运算除法运算n7.2.4 小数乘法小数乘法197.2.1 加减运算加减运算l在数字信号处理中,加减运算是常见的算术运算。在数字信号处理
19、中,加减运算是常见的算术运算。一般使用一般使用16位或位或32位加减运算位加减运算,数值分析、浮,数值分析、浮点运算和其它操作点运算和其它操作可能需要可能需要32位以上的运算位以上的运算。lC55x有直接完成有直接完成16位或位或32位加减运算的指令,位加减运算的指令,但没有能直接完成多字加减运算的指令但没有能直接完成多字加减运算的指令。要进行。要进行多字加减运算,需要通过编程方法实现。多字加减运算,需要通过编程方法实现。20l 以下指令可在单周期内完成以下指令可在单周期内完成32位加法运算:位加法运算:MOV40 dbl(Lmem),ACx ADD dbl(Lmem),ACxl 64位的高位
20、的高32位加法要考虑低位加法要考虑低32位加法产生的进位,位加法产生的进位,高高32位位使用以下指令:使用以下指令:ADD uns(Smem),CARRY,ACxl 以下指令可在单周期内完成以下指令可在单周期内完成32位减法运算:位减法运算:MOV40 dbl(Lmem),ACxSUB dbl(Lmem),ACxl 64位的位的高高32位减位减法要考虑低法要考虑低32位减法产生的借位,位减法产生的借位,使用以下指令:使用以下指令:SUB uns(Smem),BORROW,ACx 可进行单独可进行单独32位或位或64位的低位的低32位加位加可进行单独可进行单独32位或位或64位的低位的低32位加
21、位加21例例7-1,64位加法运算。文件名为:位加法运算。文件名为:add64.asm。.mmregs.model call=c55_std.model mem=large;*;64位加法;X3 X2 X1 X0 ;+Y3 Y2 Y1 Y0 ;-;W3 W2 W1 W0 22The.mmregs directives are supported by the C1x/C2x/C2xx/C5x assembler.指针分配AR1-X3(偶地址)X2 X1 X0AR2-Y3(偶地址)Y2 Y1 Y0 AR3-W3(偶地址)W2 W1 W0 1000h地址值依次增加1004h1008h.sect.t
22、ext.align 4.globalstart;.sym start,start,36,2,0 start:MOV#0100h,AR1 MOV#0104h,AR2 MOV#0108h,AR3 L1:MOV40 dbl(*AR1(#2),AC0 ;AC0=X1 X0 ADD dbl(*AR2(#2),AC0 ;AC0=X1 X0+Y1 Y0 MOV AC0,dbl(*AR3(#2);保存W1 W0.MOV40 dbl(*AR1),AC0 ;AC0=X3 X2 ADD uns(*AR2(#1),CARRY,AC0;AC0=X3 X2+00 Y2+CARRY ADD*AR2#16,AC0 ;AC0=
23、X3 X2+Y3 Y2+CARRY MOV AC0,dbl(*AR3);保存 W3 W2.B L123.sym-COFF Symbolic Debugging Directives已废弃已废弃The.sym directive defines a global variable,a local variable,or a function.Several parameters allow you to associate various debugging information with the variable or function.格式:.sym name,value,type,sto
24、rage class,size,tag,dims参考文献参考文献:TMS320C28X系列DSP指令和编程指南-附录B 符号调试伪指令.sym(需看附录A:难懂)茶苑老吴的博客:”关于TMS320C55x的汇编语言中的.sym伪指令“(此文献非常详细明了)标号,地址,表示函数,外部外部,不占存储用数表示对应C变量变量类型,占存储单元位数.sect.text.align 4.globalstart;.sym start,start,36,2,0 start:MOV#0100h,AR1 MOV#0104h,AR2 MOV#0108h,AR3 L1:MOV40 dbl(*AR1(#2),AC0 ;A
25、C0=X1 X0 ADD dbl(*AR2(#2),AC0 ;AC0=X1 X0+Y1 Y0 MOV AC0,dbl(*AR3(#2);保存W1 W0.MOV40 dbl(*AR1),AC0 ;AC0=X3 X2 ADD uns(*AR2(#1),CARRY,AC0 ;AC0=X3X2+00Y2+CARRY ADD*AR2 X3(偶地址)X2 X1 X0AR2-Y3(偶地址)Y2 Y1 Y0 AR3-W3(偶地址)W2 W1 W0 1000h地址值依次增加1004h1008h指针分配无带进位的32位加指令此指令不是带进位加,也不需要,X2加Y2的进位就在AC0(16)中.1002h1006h1
26、00Ah1005h加法AC0=AC0+Y300.sect.text.align 4.globalstart;.sym start,start,36,2,0 start:MOV#0100h,AR1 MOV#0104h,AR2 MOV#0108h,AR3 L1:MOV40 dbl(*AR1(#2),AC0 ;AC0=X1 X0 ADD dbl(*AR2(#2),AC0 ;AC0=X1 X0+Y1 Y0 MOV AC0,dbl(*AR3(#2);保存W1 W0.MOV40 dbl(*AR1),AC0 ;AC0=X3 X2 ADD uns(*AR2(#1),CARRY,AC0 ;AC0=X3X2+00
27、Y2+CARRY ADD*AR2 X3(偶地址)X2 X1 X0AR2-Y3(偶地址)Y2 Y1 Y0 AR3-W3(偶地址)W2 W1 W0 1000h地址值依次增加1004h1008h.sect.text.align 4.global start;.sym start,start,36,2,0 start:MOV#0100h,AR1 MOV#0104h,AR2 MOV#0108h,AR3 L1:MOV40 dbl(*AR1(#2),AC0 ;AC0=X1X0 SUB dbl(*AR2(#2),AC0 ;AC0=X1X0-Y1Y0 MOV AC0,dbl(*AR3(#2);保存保存W1W0.
28、MOV40 dbl(*AR1),AC0 ;AC0=X3X2 SUB uns(*AR2(#1),BORROW,AC0;AC0=X3X2-00Y2-BORROW SUB*AR2 X3(偶地址)X2 X1 X0AR2-Y3(偶地址)Y2 Y1 Y0 AR3-W3(偶地址)W2 W1 W0 1000h地址值依次增加1004h1008h指针分配除加法换成减法,CARRY换成BORROW外,步骤相同.7.2.2乘法运算乘法运算lC55x提供了硬件乘法器,提供了硬件乘法器,16位乘法可在一个位乘法可在一个指令周期内完成指令周期内完成。l高于高于16位的乘法运算可以采用下述方法实现位的乘法运算可以采用下述方法
29、实现(以(以32位乘法为例)。位乘法为例)。28例例7-3,32位整数乘法运算。文件名位整数乘法运算。文件名:mpy32.asm.mmregs.model call=c55_std.model mem=large29;*;本子程序是两个32位整数乘法,得到一个64位结果。;操作数取自数据存储器,运算结果送回数据存储器。;数据存储数据存储:指针分配指针分配:;X1 X0 32位操作数 AR0-X1;Y1 Y0 32位操作数 X0;W3 W2 W1 W0 64位结果 AR1-Y1;Y0;入口条件入口条件:AR2-W0;SXMD=1 (允许符号扩展)W1;SATD=0 (不做饱和处理)W2;FRCT
30、=0 (关小数模式)W3;限制条件:延迟链和输入序列必须指定为长字类型。;*.sect.text.align 4.global start;.symstart,start,36,2,0 start:MOV#0100h,AR0 MOV#0102h,AR1 MOV#0104h,AR2 BSET SXMD BCLR SATD BCLR FRCT30例例7-3,32位整数乘法运算。位整数乘法运算。指针分配指针分配:AR0-X1 X0 AR1-Y1 Y0 AR2-W0 W1 W2 W3有符有符号数的号数的数数据存储据存储:X1 X0 32位 Y1 Y0 32位 无符号乘 X0 Y0 有符号与无符号乘 X
31、1Y0有符号与无符号乘 X0Y1 有符号乘 X1Y1 结果累加 W3 W2 W1 W0 64位0100h地址值依次增加0102h0104h32位32位32位 L1:AMAR *AR0+;AR0指向X0|AMAR*AR1+;AR1指向Y0MPYM uns(*AR0-),uns(*AR1),AC0 ;ACO=X0*Y0MOV AC0,*AR2+;保存W0(是AC0的低16位)MACM*AR0+,uns(*AR1-),AC0#16,AC0 ;AC0=X0*Y016+X1*Y0MACM uns(*AR0-),*AR1,AC0 ;AC0=X0*Y016+X1*Y0+X0*Y1MOV AC0,*AR2+;
32、保存W1MACM*AR0,*AR1,AC0#16,AC0 ;AC0=AC016+X1*Y1MOV AC0,*AR2+;保存W2MOV HI(AC0),*AR2 ;保存W3 B L131例例7-3,32位整数乘法运算。位整数乘法运算。AR0-X1 X0AR1-Y1 Y00100h0102h指针分配AR2-W0 W1 W2 W30104h X1 X0 32位 Y1 Y0 32位 X0 Y0 X1Y0 X0Y1 X1Y1 累加W3 W2 W1 W064位;即累加前AC0的高16位1001h1003h1005h7.2.3 除法运算除法运算lC55x没有提供硬件除法器,也没有提供专门的除没有提供硬件除法
33、器,也没有提供专门的除法指令,要实现除法运算需借助于条件减法指令法指令,要实现除法运算需借助于条件减法指令SUBC和重复指令和重复指令RPT。l根据被除数绝对值与除数绝对值的大小关系,除法根据被除数绝对值与除数绝对值的大小关系,除法的实现过程略有不同:的实现过程略有不同:u当当|被除数被除数|被除数;AR1-除数;AR2-商;AR3-余数;注:;无符号除法,被除数、除数均为16位;关闭符号扩展,被除数、除数均为正数;运算完成后AC0(15-0)为商,AC0(31-16)为余数。;*33.sect.text.align 4.globalstart;.symstart,start,36,2,0 s
34、tart:MOV#0100h,AR0 MOV#0101h,AR1 MOV#0102h,AR2 MOV#0103h,AR3 L1:BCLR SXMD;清零SXMD(关闭符号扩展)MOV*AR0,AC0;把被除数放入AC0RPT#(16-1);执行subc 16次SUBC*AR1,AC0,AC0;AR1指向除数MOV AC0,*AR2;保存商MOV HI(AC0),*AR3;保存余数 B L134指针分配AR0-被除数AR1-除数AR2-商AR3-余数0100h0102h0101h0103h例例7-4,无符号无符号16位除位除16位整数除法。位整数除法。例例7-5,无符号,无符号32位除位除16位
35、整数除法。位整数除法。文件名为:文件名为:udiv32o16.asm。.mmregs.model call=c55_std.model mem=large35;*;指针分配;AR0-被除数高位;被除数低位;AR1-除数;AR2-商高位;商低位;AR3-余数;注:;无符号除法,被除数为32位,除数为16位;关闭符号扩展,被除数、除数均为正数;第一次除法之前,把被除数高位存入AC0;第一次除法之后,把商的高位存入AC0(15-0);第二次除法之前,把被除数低位存入AC0;第二次除法之后,AC0(15-0)为商的低位,AC0(31-16)为余数;*.sect.text.align 4.global
36、startstart:MOV#0100h,AR0 MOV#0102h,AR1 MOV#0104h,AR2 MOV#0106h,AR3L1:BCLR SXMD ;清零SXMD(关闭符号扩展)MOV*AR0+,AC0;把被除数高位存入AC0|RPT#(15-1);执行subc 15次SUBC*AR1,AC0,AC0;AR1指向除数SUBC*AR1,AC0,AC0;执行subc最后一次|MOV#8,AR4;把AC0_L 存储地址(08h)装入AR4MOV AC0,*AR2+;保存商的高位MOV*AR0+,*AR4 ;把被除数低位装入AC0_L(08h)RPT#(16-1)SUBC*AR1,AC0,A
37、C0 ;执行subc 16次MOV AC0,*AR2+;保存商的低位MOV HI(AC0),*AR3 ;保存余数BSET SXMD ;置位SXMD(打开符号扩展)B L136指针分配AR0-被除数高位 被除数低位AR1-除数AR2-商高位 商低位AR3-余数0100h0104h0102h0106h;不能用MOV*AR0+,AC0(高16位清0)例例7-6,带符号带符号16位除位除16位整数除法。位整数除法。文件名为:文件名为:sdiv16o16.asm。.mmregs .model call=c55_std .model mem=large .sect.text .align 4;*;指针分配
38、指针分配;AR0-被除数被除数;AR1-除数除数;AR2-商商;AR3-余数余数;注:注:;带符号除法带符号除法,被除数为,被除数为16位,除数为位,除数为16位位;打开符号扩展,被除数、除数可为负数打开符号扩展,被除数、除数可为负数;除法运算之前,商的符号存入除法运算之前,商的符号存入AC0;除法运算之后,商存入除法运算之后,商存入AC1(15-0),余数存入余数存入AC1(31-16);*37.globalstartstart:MOV#0100h,AR0 MOV#0101h,AR1 MOV#0102h,AR2 MOV#0103h,AR3 L1:BSET SXMD ;置位号SXMD(打开符扩
39、展)MPYM*AR0,*AR1,AC0;计算期望得到的商的符号MOV*AR1,AC1;把除数存入AC1ABS AC1,AC1;求绝对值,|除数|MOV AC1,*AR2;暂时保存|除数|MOV*AR0,AC1;把被除数存入 AC1ABS AC1,AC1;求绝对值,|被除数|RPT#(16-1);执行subc 16次38SUBC*AR2,AC1,AC1;AR2-|除数|MOV HI(AC1),*AR3 ;保存余数MOV AC1,*AR2;保存商(AC1的低16位,是正数)SFTS AC1,#16 ;对正数商左移16位:使符号位在最高位(31)NEG AC1,AC1;对商求反2补码(商变成负数)X
40、CCPART label,AC0被除数AR1-除数AR2-商AR3-余数0100h0102h0101h0103h把除数取绝对值把被除数取绝对值无符号数除法例例7-7,带符号,带符号32位除位除16位整数除法。位整数除法。文件名为:文件名为:sdiv32o16.asm.mmregs.model call=c55_std.model mem=large;*;指针分配:(被除数和商都被指定为长字);AR0-被除数高半部分(高16位)(NumH)(偶地址);被除数低半部分(低16位)(NumL);AR1-除数(Den);AR2-商的高半部分(高16位)(QuotH)(偶地址);商的低半部分(低16位)
41、(QuotL);AR3-余数(Rem);注:;带符号除法,被除数为32位,除数为16位;打开符号扩展,被除数、除数可为负数;除法运算之前,期望的商的符号存入AC0;第一次除法运算之前,把被除数的高16位分存入AC1;第一次除法运算之后,把商的高16位存入AC1(15-0);第二次除法运算之前,把被除数的低16位存入AC1;第二次除法运算之后,把商的低16位存入AC1(15-0),余数存入AC1(31-16);*39.sect.text.align 4.global start.symstart,start,36,2,0 start:MOV#0100h,AR0 MOV#0102h,AR1 MOV
42、#0104h,AR2 MOV#0106h,AR3 MOV#0108h,AR4 L1:BSET SXMD;置位SXMD(打开符号扩展)MPYM*AR0,*AR1,AC0;除法结果的符号位(NumH x Den)MOV*AR1,AC1;AC1=Den(16位除数)ABS AC1,AC1;AC1=abs(Den)(除数取绝对值)MOV AC1,*AR3;Rem=abs(Den)(暂存除数绝对值)MOV40 dbl(*AR0),AC1;AC1=NumH NumL(32位被除数)ABS AC1,AC1;AC1=abs(Num)(被除数取绝对值)MOV AC1,dbl(*AR2);QuotH=abs(Nu
43、mH)(暂存被除数绝对值);QuotL=abs(NumL)40指针分配AR0-被除数高位(NumH)被除数低位(NumL)AR1-除数AR2-商高位(QuotH)商低位(QuotL)AR3-余数AR4-AC1_L存储地址0100h0104h0102h0106h0108h11hMOV*AR2,AC1 ;AC1=QuotH(被除数取绝对值高16位)RPT#(15-1);执行subc 15次SUBC*AR3,AC1,AC1 ;(被除数取绝对值高16位除以除数)SUBC*AR3,AC1,AC1 ;最后一次执行subc|MOV#11,AR4 ;把AC1_L存储地址装入AR4MOV AC1,*AR2+;保
44、存 QuotH(存储结果商的高16位)MOV*AR2,*AR4 ;AC1_L=QuotH(应该是被除数绝对值低16位)RPT#(16-1);执行subc 16次SUBC*AR3,AC1,AC1MOV AC1,*AR2-;保存 QuotLMOV HI(AC1),*AR3 ;保存 RemBCC skip,AC0=#0 ;如果实际结果应该为正数,跳到skip.MOV40 dbl(*AR2),AC1 ;否则,对商取反.NEG AC1,AC1MOV AC1,dbl(*AR2)skip:B L141(QuotL)的存储单元内容 7.2.4 小数乘法小数乘法l在定点在定点DSP的某些应用中,的某些应用中,整
45、数运算整数运算很难满足要很难满足要求。这是因为它求。这是因为它自身存在缺陷自身存在缺陷:u两个两个16位整数相乘位整数相乘,乘积乘积总是总是“向左增长向左增长”(即小即小数点左侧的位数增加数点左侧的位数增加),这意味着这意味着多次相乘后多次相乘后,乘乘积将很快超出定点器件的数据范围积将很快超出定点器件的数据范围。u保存保存32位乘积到存储器位乘积到存储器,要占用要占用2个个CPU周期和周期和2个字的存储器空间。个字的存储器空间。u由于由于乘法器都是乘法器都是16位相乘位相乘,因此将因此将32位乘积再位乘积再作为乘法器的输入时就显得较繁琐作为乘法器的输入时就显得较繁琐,不能胜任递不能胜任递归运算
46、归运算。42l为了克服这些缺陷,在实际应用中更多采用的是为了克服这些缺陷,在实际应用中更多采用的是小数运算。小数运算。小数运算具有如下优点小数运算具有如下优点:u乘积乘积总是总是“向右增长向右增长”。这就意味着。这就意味着超出定点器超出定点器件数据范围的将是不太感兴趣的部分件数据范围的将是不太感兴趣的部分。u既可以存储既可以存储32位乘积位乘积,也可近似存储高也可近似存储高16位乘积位乘积,这就允许用较少的资源保存结果。这就允许用较少的资源保存结果。u可以用于递归运算可以用于递归运算。437.2.4 小数乘法小数乘法小数部分越靠近小数点小数部分越靠近小数点,其权值越大。其权值越大。例例7-8,
47、两个两个Q31格式有符号小数相乘格式有符号小数相乘,得到一个得到一个Q31格式结果。格式结果。文件名为文件名为:mpyQ31.asm。需要注意的是:需要注意的是:u两个带符号小数相乘两个带符号小数相乘,所得乘积带有所得乘积带有2个符号位个符号位。u为解决冗余符号位的问题为解决冗余符号位的问题,需在程序中设定状态寄需在程序中设定状态寄存器存器ST1中的中的FRCT(小数方式小数方式)为为1,这样当乘法器这样当乘法器将结果传送至累加器时就会将结果传送至累加器时就会自动左移自动左移1位位。44.mmregs.model call=c55_std.model mem=large;*;操作数取自数据存储
48、器,运算结果送回数据存储器。;数据存储数据存储:指针分配指针分配:;X1 X0 Q31操作数 AR0-X1;Y1 Y0 Q31操作数 X0;W1 W0 Q31结果 AR1-Y1;Y0;入口条件入口条件:AR2-W0(偶地址);SXMD=1 (允许符号扩展)W1;SATD=0 (不做饱和处理);FRCT=1 (运算结果左移一位);限制条件:W1被指定为偶地址;*45例例7-8,两个两个Q31格式有格式有符号小数相乘。符号小数相乘。X1 X0 Q31 Y1 Y0 Q31 X0 Y0 X1Y0 X0Y1 X1Y1 累加W1 W0 w1 w0(忽略).sect .text .align 4 .glob
49、al start ;.sym start,start,36,2,0 start:MOV#0100h,AR0 MOV#0102h,AR1 MOV#0104h,AR2 BSET SXMD BCLR SATD BSET FRCT L1:AMAR*AR0+;AR0指向X0 MPYM uns(*AR0-),*AR1+,AC0 ;AC0=X0*Y1 MACM*AR0,uns(*AR1-),AC0 ;AC0=X0*Y1+X1*Y0 MACM*AR0,*AR1,AC0#16,AC0;AC0=AC016+X1*Y1 MOV AC0,dbl(*AR2);保存W1W0 B L146AR0-X1 Q31乘操作数 X0
50、 Q31乘操作数AR1-Y1 Q31乘操作数 Y0 Q31乘操作数AR2-W1 Q31乘结果 W0 Q31乘结果0100h0104h0102h Y1 Y0 Q31 X1 X0 Q31 X0 Y0(忽略)X0Y1 X1Y0 X1Y1 累加W1 W0 w1 w0(忽略)1001h7.3 FIR滤波器滤波器l数字滤波器是数字滤波器是DSP的基本应用,有的基本应用,有2种基本类型:种基本类型:u有限冲激响应滤波器有限冲激响应滤波器FIRu无限冲激滤波器无限冲激滤波器IIRl一般来说,如果需要线性相位则选择用一般来说,如果需要线性相位则选择用FIR滤波器,滤波器,对于相位要求不敏感的场合可以选用对于相位