DSP第16讲.ppt_第1页
DSP第16讲.ppt_第2页
DSP第16讲.ppt_第3页
DSP第16讲.ppt_第4页
DSP第16讲.ppt_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、DSP技术及应用,教学课件,DSP技术及应用,第十六讲 汇编程序设计(2),汇编程序设计(2),授课内容: 1.双操作数乘法 2.长字运算和并行运算 3.小数运算 4.除法运算 5.浮点运算,汇编程序设计(2):双操作数乘法,1.双操作数乘法 在利用MAP指令进行乘法操作中,即可应用MPY Smem,dst等单操作数形式,也可利用MPY Xmem,Ymem,dst等双操作数形式。 采用双操作数指令编程的特点是: 采间接寻址方式获得操作数 , 且辅助寄存器只能用 AR2AR5 占用的程库空间小 程序运行速度快 例如,计算y=mx+b可用两种方法实现:,双操作数乘法,单操作数乘法: LDm,T M

2、PYx,A ADDb,A STLA,y,双操作数乘法: MPY*AR2,*AR3,A ADDb,A STLA,y,双操作数乘法,在重复操作中,利用双操作数运算,可以明显提高运算效率,节约计算时间。 例如,计算乘累加式 就可采用不同的指令实现:,双操作数乘法,1).单操作数指令实现 LD#0,B STM#a,AR2 STM#x,AR3 STM#19,BRC RPTBdone-1 LD*AR2+,T MPY*AR3+,A;单操作数指令 ADDA,B;每重复一次用3个周期 Done:STHB,y STLB,y+1,双操作数乘法,2).双操作数指令实现 LD#0,B STM#a,AR2 STM#x,A

3、R3 STM#19,BRC RPTBdone-1 MPYAR2+,*AR3+,A;单操作数指令 ADDA,B;每重复一次用3个周期 Done:STHB,y STLB,y+1,双操作数乘法,利用单操作数指令进行乘法累加运算,完成N项乘积求和,需要3N个机器周期;利用双操作数指令进行相同的运算,需要2N个机器周期,共可节约N个机器周期。 充分利用DSP的丰富指令,可以对上述算法进一步优化,完成一个 N 项乘积求和的操作 , 只需要 N+2 个机器周期。 程序如下 :,双操作数乘法,STM#x,AR2 STM#a,AR3 RPTZA,#19 MAC*AR2+,*AR3+,A;单周期指令 STHB,y

4、 STLB,y+1,汇编程序设计(2): 长字运算和并行运算,2.长字运算和并行运算 1).长字运算 C54x中可以利用长操作数(32位)进行长字运算的指令主要有: DLDLmem,dst;dst=Lmem DSTsrc,Lmem;Lmem=src DADDLmem,src,dst;dst=src+Lmem DSUBLmem,src,dst;dst=src-Lmem DRSUB Lmem,src,dst;dst=Lmem-src,长字运算和并行运算,在长操作数指令指令中,必须注意高16位和低16位操作数在存储器中的排列问题。 指令系统中规定:按指令中给出的地址进行存取的总是高 16 位操作数。

5、这样,就有两种数据排列方法:,长字运算和并行运算,偶地址排列法: 指令中给出的地址为偶地址,即存储器中低地址存放高16位操作数。 例如: DLD*AR3+,A 指令执行前:指令执行后: A=00 0000 0000A=00 6CAC BD90 AR3=0100AR3=0102 (0100H)=6CAC(高字)(0100H)=6CAC (0101H)=BD90(低字)(0101H)=BD90,长字运算和并行运算,奇地址排列法: 指令中给出的地址为奇地址,即存储器中低地址存放低16位操作数。 例如: DLD*AR3+,A 指令执行前:指令执行后: A=00 0000 0000A=00 BD90 6

6、CAC AR3=0101AR3=0103 (0100H)=6CAC(低字)(0100H)=6CAC (0101H)=BD90(高字)(0101H)=BD90,长字运算和并行运算,例1:计算Z32=X32+Y32 标准运算实现长字运算实现 LDxhi,16,ADLDxhi ADDSxlo,ADADDyhi,A ADDyhi,16,ADSTA,zhi ADDSylo,A STHA,zhi STLA,zlo,长字运算和并行运算,2).并行运算 并行指令有 4 种 : 并行加载和乘法指令 , 并行加载和存储指令 , 并行存储和乘法指令 , 以及 并行存储和加/减法指令。所有并行指令都是单字单周期指令。

7、 注意:并行运算时存储的是前面的运算结果,存储之后再进行加载或算术运算。这些 指令都工作在累加器的高位 , 且大多数并行运算指令都受 ASM(累加器移位方式) 位影响。,长字运算和并行运算,例2:计算 z=x+y 和 f=e+d 设数据如右图存放,则程序段为: (并行加载和存储指令语法) .bssx,3 .bssd,3 STM#x,AR5 STM#d,AR2 LDAR5+,16,A;x进入A高位 ADDAR5+,16,A;y与A高位相加 STA, #AR5;Z=A16 |LD *AR2+,B;e进入B高位 ADD*AR2+,16,B ;d与B高位相加 STHB,*AR2 ;f=BH,长字运算和

8、并行运算,3).64 位加法和减法运算 利用双字指令,可以实现多位字的计算。 例3:计算 Z64=W64+X64-Y64 的程序段。 本例中,W、X、Y和Z都是64位数,它们都由两个32位的双字组成。因此,多次利用长字指令就可以实现64位数的加/减法。,长字运算和并行运算,计算原理如下图所示:,长字运算和并行运算,长字运算和并行运算,3).32位乘法运算 两个32位有符号数相乘的过程如下图所示,其中S代表有符号数,U代表无符号数。,长字运算和并行运算,在运算中,涉及到三种乘法运算:U*U、S*U和S*S。因此需要用到MPYU和MACSU这两操作: 相应的程序段如下所示。,长字运算和并行运算,汇

9、编程序设计(2): 小数运算,3.小数运算 两个 16 位整数相乘,得到一个32位整数,即乘积“向左增长” 。这就意味着多次相乘后乘积将会很快超出定点器件的数据范围。 要将 32 位乘积保存到数据存储器 , 就要开销2个机器周期以及2个字的程序和RAM单元。更坏的是 , 由于乘法器都是 16 位相乘 , 因此很难在后续的递推运算 中 , 将 32 位乘积作为乘法器的输入。,小数运算,两个小数相乘 , 得到一个32位小数,即乘积总是“向右增长” 。这就意味着超出定点器件数据范围的将是不感兴趣的部分。 在小数乘法情况下 , 既可以存储 32 位乘积 , 也可以存储高 16 位乘积 , 这就允许用较

10、少的资源保存结果 , 也可以用于递推运算。 因此,定点DSP芯片都采用小数乘法。,小数运算,小数的表示方法 C54x 采用2的补码小数 , 其最高位为符号位 , 数值范围为-1+1 。 一个 16 位 2 制码小数 (Q15 格式 ) 的每一位的权值为 : MSB LSB -1. 1/2 1/4 1/8 2-15,小数运算,一个十进制小数乘以32768之后,再将其十进制整数部分转换成十六进制数,并取其补码,就可以将这个数表示为其补码形式。 在汇编语言程序中,不能直接写入十讲制 小数。如果要定义一个系数 0.707,则可以写为: .word 32768*707/1000 而不能写成 .word

11、32768 *0.707,小数运算,符号冗余 两个带符号数相乘 时, 得到的乘积将带有2个符号位 , 造成错误的结果。 解决冗余符号位的方法是 : 在程序中设定状态寄存器 STl 中的 FRCT(小数方式)位为 1。此时,在乘法器将结果传送军累加器时就能自动地左移1 位 , 自动消去多余的符号位。 所以,在进行小数相乘时,必须首先设置FRCT位: SSBX FRCT,小数运算,例3:计算小数运算式 ai=0.1,0.2,-0.3,0.4 xi=0.8,0.6,-0.4,-0.2 .bssx,4 .word-3*32768/10 .bssa,4 .word4*32768/10 .bssy,1 .

12、word8*32768/10 .data .word6*32768/10 table:.word1*32768/10 .word-4*32768/10 .word2*32768/10 .word-2*32768/10,小数运算,Start:SSBXFRCT STM #x,AR1 MVPDtable,*AR1 STM #x,AR2 STM#a,AR3 RPTZA,#3 MAC*AR2+,*AR3+,A STMA,y Done:Bdone,汇编程序设计(2): 除法运算,4.除法运算 在一般的DSP芯片中,由于硬件除法器代价很高而没有硬件除法器,所以就没有专门的 除法指令。 C54x中没有专门的除

13、法指令。但是,利用条件减法指令SUBC和重复指令RPT,就可以实现两个无符号数的除法运算。,除法运算,条件减法指令的功能为 SUBC的指令实例如下所示,除法运算,除法运算,例4:编程计算0.4/(-0.8)。 .bssnum,1;分子单元 .bssden,1;分母单元 .bssquot,1 .data table: .word4*32768/10;分子 .word-8*32768/10;分母,除法运算,.text Start:STM#num,AR1; RPT#1 MVPDtable,*AR1+ LDden,16,A; 分母A MPYAnum;商符号B ABSA;取分母绝对值 STHA,den;

14、绝对值存入分母单元,除法运算,LDnum,16,A ; 分子A ABSA;取绝对值 RPT#14;重复减,实现除法 SUBCden,A XC1,BLT;判断商符号 NEGA;商取反 STLA,quot;输出商,汇编程序设计(2): 浮点运算,5.浮点运算 在数字信号处理过程中,为了扩大数据的范围和精度,往往需要采用浮点运算。 C54x虽然是个定点DSP器件, 但却可以通过相关指令支持浮点运算。,浮点运算,浮点数的表示方法 C54x中浮点数用尾数和指数两部分组成,它与定点数的关系为 定点数 = 尾数2(指数) 例如 , 定点数 0 x2000(0.25) 用浮点数表示时 , 尾数为 0 x400

15、0(0.5) , 指数为1, 即 0.52-1=0.25 。 浮点数的尾数和指数可正可负 , 均用补码表示。指数的范围从-831 。,浮点运算,定点数浮点数 C54x 通过 3 条指令就可以将一个定点数转化成浮点数 ( 假设定点数已在累加器中): 1). EXP A 这是一条提取指数的指令,将指数保存在暂存器 T中。若A=0,则0T ;否则,(A的冗余符号位数-8)T。 指令执行后,累加器中的内容不变。 指数的数值范围:-831 。,浮点运算,EXP指令应用实例,浮点运算,2). ST T,Exponent 该指令将T寄存器中的指数值保存到指定的数据单元Exponent中。 3). NORM

16、A 该指令中累加器A中的值按T寄存器中的内容进行左移或右移,实现规格化。 注意:NORM指令不能紧跟在EXP指令的后面。由于EXP指令并不直接将指数值送T。,浮点运算,NORM指令应用实例,浮点运算,浮点数定点数 浮点数的指数就是在规格化时左移的位数,因此,在将浮点数化为定点数时,只需按指数值将尾数右移就可以得到相应的定点数。,浮点运算,例5:编程计算浮点乘法运算0.3(-0.8)。 程序中的数据单元定义为,浮点运算,.title“float.asm” .defstart STACK:usect“STACK”,100;定义堆栈名 .bssx1,1;建立末初始化段 .bssx2,1 .bsse1

17、,1 .bssm1,1 .bsse2,1 .bssm2,1 .bssproduct,1 .bsstemp,1,浮点运算,.data Table:.word3*32768/10 .word-8*32768/10 .text Start:STM#STACK+100,SP; 设置堆栈指针 MVPDtable,x1; 操作数送至数据存储器 MVPDtable+1,x2 LDx1,16,A;x1进入A高位字规格化 EXPA STT,e1;保存x1指数 NORMA STHA,m1;保存尾数,浮点运算,LDx2,16,A;x2进入A高位字规格化 EXPA STT,e2;保存x1指数 NORMA STHA,m2;保存x1指数 CALLMULT;调用浮点乘法程序 Done:BDone;执行完毕,在此循环,浮点运算,MULT:SSBXFRCT;设置为小数方式 SSBXSXM;允许符号扩

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论