数字信号处理技术及其应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SUBC Smem ,src ;(src)-(Smem)<<15→ALU输出端 ;如果ALU输出端≥0, 则(ALU输出 端)<<1+1→src ;否则(src)<<1→src 除法运算有两种情况:
Leabharlann Baidu
1. |被除数|<|除数|,商为小数 例20: 编写0.4÷(-0.8)的程序段 .bss num , 1 .bss den , 1 .bss quot , 1 .data Table : .word 4*32768/10 ;0.4 .word -8*32768/10 ;-0.8 .text Start : STM #num ,AR1 RPT #1 MVPD table ,*AR1 ;传送2个数据至分子、分母单元 LD @den ,16,A ;将分母移到累加器A(31~16) MPYA @num ;(num)*(A(32~16))→B, ABS A
例2:编写一段程序将数据存储器中的数组X[20]复制到 数组Y[20]中。 .bss x,20 .bss y,20 … STM #x,AR2 STM #y,AR3 RPT #19 MVDD AR2+,AR3+
5.2 加减法和乘法运算
例3:编写完成 Z=X+Y-W的功能
LD @x,A;直接寻址 ADD @y,A SUB @w,A; A=A-@w STL A, @z
;T=x0 ;A=uy0*ux0 ;w0=ux0*uy0 ;A=A>>16 ;A+=y1*ux0 ;A+=x1*uy0 ;w1=A ;A=A>>16 ;A+=x1*y1 ;w2=A的低16位 ;w3=A的高16位
5.8 小数运算
1. 小数的表示方法 C54X采用2的补码小数,其最高位为符号位数值范围从 -1~1,一个16位2的补码小数的每一位权值为: -1 1/2 1/4 1/8 …2-15 一个十进制小数乘以32768之后,将十进制整数部分转换成十 六进制数,就得到了这个十进制小数的2的补码表示了。
5.10 浮点运算
为了扩大数据的范围和精度,往往需要采用浮点运算。 C54X虽然是个定点DSP器件,但它支持浮点运算。 1. 浮点数的表示方法 浮点数用 尾数和指数组成,定点数=尾数×2-指数 浮点数的尾数和指数可正可负,均用补码表示。指数范 围-8~31。 2. 定点数→浮点数 通过3条指令实现 (假设定点数已在累加器A中) 1)EXP A 例22 EXP A 执行前 执行后 A=FF FFFF FFCB A=FF FFFF FFCB T= 0000 T= 0019(25)
书名:数字信号处理技术及其 应用 ISBN:7-111-16016-9 作者:刘丽钧 出版社:机械工业出版社 本书配有电子课件
第5章 汇编语言程序设计举例:
5.1 数据块传送
例1:将数组X[5]={1,2,3,4,5}初始化 .data TAL: .word 1,2,3,4,5 .sect “.vectors” B START .bss x,5 .text START: STM #x,AR5 RPT #4 MVPD TAB,*AR5+
C C’
低32 位相加产生进位C 低32位相减产生借位C’
程序段:
DLD @w1,A DADD @x1,A DLD @w3,B ADDC @x2,B ADD @x3,16,B DSUB @y1,A DST A,@z1 SUBB@y2,B SUB @y3,16,B DST B,@z3 ; A=w1w2 ; A=w1w0+x1x0,产生进位C ; B=w3w2 ; B=w3w2+x2+C ; B=w3w2+x3x2+C ; A=w1w0+x1x0-y1y0,产生借位C’ ; z1z0=w1w0+x1x0-y1y0 ; B=w3w2+x3x2+C-y2-C’ ; B=w3w2+x3x2+C-y3y2-C’ ;z3z2=w3w2+x3x2+C-y3y2-C’
例4:编程实现 y=mx+b 的功能
LD @m,T MPY @x,A ADD @b,A STL A, @y
例5:编写实现 y=x1•a1+x2 •a2的功能 LD @x1,T MPY @a1,B LD @x2,T MAC @a2,B STL B, @y STH B, @y+1
例6:找出y=ai•xi(i=1,2,3,4)中乘机项ai•xi的最大值, 并存入累加器A中。 STM #a,AR1 STM #x,AR2 STM #2,AR3 LD *AR1+,T MPY *AR2+,A Loop1: LD *AR1+,T MPY *AR2+,B MAX A BANZ loop1,*AR3-
例19 编写计算 y=∑ai*xi( i=1~4) 的程序 其中数据均为小数: a1=0.1 a2=0.2 a3=-0.3 a4=0.4 x1=0.8 x2=0.6 a3=-0.4 x4=-0.2 .bss x , 4 .bss a , 4 .bss y , 1 .data Table: .word 1*32768/10 .word 2*32768/10 .word -3*32768/10 .word 4*32768/10 .word 8*32768/10 .word 6*32768/10 .word -4*32768/10 .word -2*32768/10 .text
MPY *AR2,*AR3,A ADD @b,A STL A, @y
例13:编写完成 y=aixi(i=1~20) 采用单操作数方法: LD #0,B STM,#a,AR2 STM #x,AR3 STM #19,BRC RPTB done-1 …… LD *AR2+,T 3T MPY *AR3+,A …… ADD A,B Done:STH B, @y STL B, @y+1 采用双操作数的方法: LD #0,B STM,#a,AR2 STM #x,AR3 STM #19,BRC RPTB done-1 2T MPY *AR2+,AR3+,A …… ADD A,B Done:STH B, @y STL B, @y+1
Start: SSBX FRCT STM #x , AR1 RPT #7 MVPD table , *AR1 STM #x ,AR2 STM #a , AR3 RPTZ A , #3 MAC AR2+, AR3 , A STH A, @y Done: B done
5.9
除法运算
C54X中没有单周期的16位除法指令,利用一条条减法 指令(SUBC),加上重复指令RPT #15就可实现 两个无符号的除法运算。
注意:汇编语言程序中,不能直接写入十进制小数。要定义 一个系数0.707,可以写成:word 32768×707/1000 不能写成32768×0.707.
2. 小数乘法与冗余符号位 出现冗余符号位是两个带符号数相乘,得到的乘积带2个 符号位,造成错误的结果。 解决冗余符号位的方法:在程序中设定状态寄存器ST1中 的FRAT(小数方式)位为1,在乘法器将结果送至累 加器时就能自动的左移一位,自动地消去了两个带符 号数相乘时产生的冗余符号位。 注意: 小数乘法编程时,应事先设置FRCT位: SSBX FRCT … MPY AR2, *AR3,A STH A, @Z
5.3 重复操作
例7:对一个数组初始化:X[5]={0,0,0,0,0} .bss x,5 STM #x,AR1 LD #0,A RPT #4 STL A,*AR1+ 或采用如下方法: .bss x,5 STM #x,AR1 RPTZ A, #4 STL A,*AR1+ 注意:执行重复操作时不响应任何中断
;保存商
注意:SUBC指令仅对无符号数进行操作,因此事先必须对除数和被
除数取绝对值。利用乘法操作,获得商的符号,最后通过条件执行指 令给商加上适当的符号。
2. |被除数|〉|除数| ,商为整数 与例 20,除输入数据外,仅有下列改动 LD @num ,16 ,A 改成 LD @num ,A RPT #14 改成 RPT #15
例14:进一步优化例13的程序:
STM #x,AR2 STM #a,AR3 RPTZ A,#19 MAC *AR2+,*AR3+,A STH A,@y STL A, @y+1
5.7 长字运算和并行运算
例15 计算 Z32=X32+Y32 长字运算
标准运算
LD @xhi, 16,A DLD @xhi,A ADDS @xho,A DADD @yhi ,A ADD @yhi,16,A DSTA,@zhi ADDS @yho,A (3个字,3个T) STH A,@zhi STL A,@zho (6个字,6个T) 除DST指令(存储32位数要用E总线2次,需2个机器周期)外, 都是单周期指令,也是在单个周期内同时利用C总线和D总线, 得到32位操作数。
例10:计算 y= xi(i=1~5) .bss x,5 .bss y,1 STM #x,AR1 STM #4,AR2 LD #0,A Loop:ADD *AR1+,A BANZ loop,*AR2STL A,@y
例11:
STM #5,AR1 STM #10,AR0 Loop: …… *AR1+ …… CMPR LT,AR1;若(AR1)<(AR0),则TC=1 BC loop,TC;若TC=1,则转LOOP
5.5 堆栈的使用方法
在数据RAM空间开辟一个堆栈区,设置如下: Size .set100 Stack .usect”STK”,size STM #stack+size,SP … …
5.6 双操作数乘法
例12:编写实现方程y=mx+b的程序 单操作数法: LD @m,T MPY @x,A ADD @b,A STL A, @y 双操作数法:
例8:对数组X[5]中的每个元素加1 .bss x,5 Begin: LD #1,16,B STM #4,BRC STM #X,AR4 RPTB next-1 ADD *AR4,16,B,A STH A,*AR4+ Next: LD #0,B ……
5.4 程序的控制与转移
例9:RC TC CC sub,BNEQ BC new,AGT,AOV
32位乘法运算
乘法算式如下: x1 x0 ×y1 y0 x0×y0 y1×x0 x1×y0 Y1×x1 w3 w2 w1 w0
S U S U U× U S×U S×U S×S S U U U
其中,S---带符号数,U---无符号数
例18 :编写计算W64=X32*Y32 的程序段
STM #x0,AR2 STM #y0,AR3 LD *AR2,T MPYU AR3+,A STL A @w0 LD A,-16,A MACSU *AR2+,*AR3-,A MACSU *AR3+,*AR2,A STL A,@w1 LD A,-16,A MAC *AR2,*AR3,A STL A,@w2 STL A,@w3
例17 编写计算Z64=W64+X64-Y64 的程序段 W、X、Y和结果Z都是64位,它们都由两个32位的 长字组成。利用长字指令完成64位数的加/减法 W3 + x3 - y3 z3 w2 x2 y2 z2 w1 x1 y1 z1 w0 (W64 ) x0 (X64 ) y0 (Y64 ) z0 ( Z64 )
并行运算指令有4种:并行加载和乘法指令,并行加载和存 储指令,并行存储和乘法指令,并行存储和加/减法指令。
例16:编写计算 z=x+y和f=e+d的程序段 .bss x,3 .bss d,3 STM #x,AR5 AR5 x STM #d,AR2 y LD #0,ASM ADD *AR5+,16,A z ST *AR5+,16,A d AR2 ||LD *AR2+,B e ADD *AR2+,16,B f STH B,*AR2
获取商的符号(在累加器B中) ;分母取绝对值
STH LD ABS RPT SUBC XC NEG STL
A,@den @num ,16 ,A A #14 @den , A 1, BLT A A,@quot
;分母绝对值存放原处 ;分子→A(32~16) ;分子取绝对值 ;15次减法循环,完成除法 ;如果B<0(商是负数),则需要变号