欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    第三章-DSP的软件结构.ppt

    • 资源ID:5030446       资源大小:2.78MB        全文页数:174页
    • 资源格式: PPT        下载积分:10
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要10
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第三章-DSP的软件结构.ppt

    第三章 DSP的软件结构,Introduction,汇编语言程序编写方法 TMS320C54x的寻址方式 TMS320C54x指令的表示方法 TMS320C54x的指令系统 汇编伪指令,汇编程序语法,TMS320的汇编程序包含汇编指令(伪指令,assembler directives)、汇编语言指令(assembly language instructions)、宏指令(macro directives)和注释(comments)。,汇编程序源程序格式,label: mnemonic operand list ;comment 标号: 助记符 操作数 ;注释 SYM1 .set 2 ;符号SYM1=2 Begin: LD #SYM1, AR1 ;将2装入AR1,汇编程序语法,所有的语句必须由语句标号、空格、*号或 ;号开头。,语句标号不是必须的,如果用,就必须在第一列。,语句中的各部分之间,由一个或多个空格分开。,注释不是必须的。注释可以从第一列的 * 号或 ;号开头;如果不是从第一列开始,就必须用 ;号开头。,语句标号,由字母、数字、_、$组成,最多不超过32个字符,对大小写敏感,第一个字符不能是数字。后跟 :。,助记符,助记符不允许从第一列开始,否则被认为是语句标号。,助记符可以是机器指令(如ABS,MPYU等)、伪指令(如.data, .list, .set等)、宏指令(如.macro, .var, .mexit等)和宏调用。,操作数,操作数可以是常数、符号或表达式。当操作数多于一个时,用逗号分开。 汇编器允许指定常数、符号或表达式作为地址、立即数或间接地址。操作数前缀规定如下: #前缀:表示操作数为立即数。如: Label:ADD #123,B ;表示将操作数123(十进制)和累加器B中的内容相加 *前缀:操作数为间接地址。使用操作数的内容作为地址。如: Label:LD *AR4,A ;操作数*AR4为间接地址,将AR4中的内容作为地址,然后将该地址的内容装入到指定的累加器A,常数,二进制常数(如01B或01b) 八进制常数(如10Q或10q) 十进制常数(如23) 十六进制常数(如78H或78h) 字符常数(如A或b) 字符串(如“sample program”),符号,符号用于作标号、常数和替代符号。符号名可长达200个字符,可由A-Z、a-z、0-9、$、_组成,且第一个字符不能是数字,符号对大小写敏感。符号仅在定义它的汇编程序中有效,除非用.global或.def伪指令声明为外部符号。 例: K .set 1024,表达式,表达式是一个常数、符号、或用算术运算符连接起来的常数或符号。表达式的值的范围为-32768到32767 例: X .set 50h sym1 .set 100h+X,可以用在表达式中的运算符,优先级,符号,含义,() +、-、! *、/、% +、- 、= =、!= & |,括弧内的表达式最先计算 一元加、减、反码、逻辑非 乘、除、模运算 加、减 左移、右移 小于、小于等于、大于、大于等于 等于、不等于 按位与 按位异或 按位或,1 2 3 4 5 6 7 8 9,注释区,注释区可以从任何一列开始,可能包含ASCII字符和空格。注释打印在列表文件中,但不影响汇编工作。,TMS320C54x的寻址方式,立即寻址:指令中有一个固定的立即数; 绝对地址寻址:指令中有一个固定的地址(16位); 累加器寻址:按累加器的内容作为地址去访问程序存储器中的一个单元; 直接寻址:指令编码中含有的7位地址与DP或SP一起合成数据存储器中操作数的实际地址; 间接寻址:通过辅助寄存器寻址; 存储器映射寄存器寻址:修改存储器映射寄存器中的值,而不影响当前数据页面指针DP和当前堆栈指针SP的值; 堆栈寻址:把数据压入或弹出系统堆栈。,寻址指令中用到的缩写符号及其含义,立即寻址,短立即数寻址(单字指令),在指令字中包括立即操作数,RPT #99 ;将下一条指令循环100次,LD #0h,DP ;将0装入数据页指针,ADD #0ffh,A ;将0ffh加给AccA,立即寻址,立即寻址,长立即数寻址,指令字的后一个字是立即数(双字指令),ADD #1234h,A ;将#1234h加给 AccA,立即寻址,绝对地址寻址,数据存储器地址(dmad)寻址: 用一个符号或一个数来确定数据空间中的一个地址 例: MVKD sample,*AR5 ;sample所代表的就是一个dmad MVKD 1000h,*AR5 ;将数据存储器1000h单元的数据传送到由AR5所指的存储单元中 。 1000h代表的是一个dmad,绝对地址寻址,程序存储器地址(pmad)寻址: 用一个符号或一个数来确定程序地址空间中的一个地址 例: MVPD table,*AR5 table 所代表的就是一个pmad,绝对地址寻址,端口地址(PA)寻址 用一个符号或常数来确定I/O口地址,PORTR PA, Smem ;从PA单元端口读入一 个数据,传送到Smem所指的数据单元中去,PORTW Smem, PA ;从Smem所指的数据单 元取出一个数据,传送到PA单元端口,PORTR FIFO, *AR5 ;把一个数从端口为 FIFO的I/O口传送到AR5所指向的数据单元,绝对地址寻址,*(lk)寻址 用一个符号或一个表示16位地址的长立即数来确定数据存储器中的一个地址 例: LD *(BUFFER),A ;把地址为BUFFER的数据单元中的数据装到AccA中,累加器寻址,用累加器中的数作为一个地址,可用来对存放数据的程序存储器寻址:,READA Smem,WRITA Smem,READA,把累加器A所确定的程序存储器单元中的一个字,传送到数据存储器单元Smem中。,WRITA,把数据单元Smem中的一个字,传送到累加器A确定的程序存储器单元。,直接寻址,TMS320C54的数据存储器分为512页,每页128字。设置一个数据页指针DP(Data Pointer),用9-bit指向一个数据页,再加上一个7-bit的页内偏移地址,形成16-bit的数据地址,LD #4,DP ;指向页4(0200h-027Fh),ADD 9h,A ;将数据页4中地址9h的 数据加给AccA,直接寻址,间接寻址,8个辅助寄存器(AR0-AR7),由一个辅助寄存器指针(ARP 3-bit)来指定,辅助寄存器算术单元(ARAU)作16-bit无符号数运算,决定一个新的地址,装入辅助寄存器中的一个,间接寻址,间接寻址,AR0-AR7的内容相当灵活,可以装入立即数,加上立即数,减去立即数;也可以从数据存储器装入地址;还可以作以下的变址寻址:,间接寻址,将该AR的内容加1或减1,再寻址(循环常用),将该AR的内容加上或减去AR0的内容,再寻址。,将该AR的内容逆向进位加上或减去AR0的内容,再寻址。,间接寻址,ADD *,8,A ;将当前辅助寄存器所指的地址里的数据,左移8-bit后加给AccA,ADD *+,8,A,AR4 ;数据左移加给AccA后,当前辅助寄存器加1,选择辅助寄存器AR4,ADD *+,8,A ;将当前辅助寄存器所指的地址里的数据,左移8-bit后加给AccA,当前辅助寄存器加1.,间接寻址,ADD *0+,8,A ;执行加法后,将AR0的值加给当前辅助寄存器,ADD *BR0+,8,A ;执行加法后,将AR0的值加给当前辅助寄存器,但反向进位,正向进位与反向进位,1 0 0 1 0 0 + 1 0 0 + 1 0 0 1 0 0 0 0 1 0,位倒序寻址,AR0 = 100 AR1 = 000 按AR1寻址后,将AR0加给AR1,反向进位,位倒序寻址,原序 原地址 位倒序后地址 位倒序,0 000 000 0,1 001 100 4,2 010 010 2,3 011 110 6,4 100 001 1,5 101 101 5,6 110 011 3,7 111 111 7,存储器映射寄存器(MMR)寻址,存储器映射寄存器寻址用来修改存储器映射寄存器。存储器映射寄存器寻址既可以在直接寻址中使用,又可以在间接寻址中使用。 STM #8888h,T ;存储器映射寄存器寻址。T暂存器。,LDM MMR,dst ;将MMR加载到累加器 MVDM dmad,MMR ;数据存储器向MMR传送数据 MVMD MMR,dmad ;MMR向指定地址传送数据 MVMM MMRx,MMRy ;MMRx向MMRy传送数据 POPM MMR ;将数据从栈顶弹至MMR PSHM MMR ;将MMR数据压入堆栈 STLM src,MMR ;累加器低位存入MMR STM #lk,MMR ;长立即数lk存入MMR,C54x共有8条指令可以进行MMR寻址。,存储器映射寄存器(MMR)寻址,堆栈寻址,系统堆栈用来在中断和子程序期间自动存放程序计数器。它也能用来存放额外的数据项或传递数据值。处理器使用一个16-bit的存储器映射寄存器堆栈指针(SP)来对堆栈寻址,它总是指向存放在堆栈中的最后一个元素。在压入堆栈操作时,SP先减1,然后将数据压入堆栈;在弹出堆栈操作时,数据从堆栈中弹出后,SP再加1. PUSH ;把一个数据存储器数据压入堆栈 POP ;从堆栈中弹出一个数据至数据存 储器单元,堆栈寻址,C54x的堆栈是向低地址生长,并由16位堆栈指针SP管理。SP总是指向栈顶。,堆栈寻址:利用SP指针,按照先进后出的原则进 行寻址。,当进栈操作时,SP先减1,然后数据进入堆栈;,当出栈操作时,数据先出栈,然后SP加1。,0001,0010,0011,0100,0101,0110,0001,0010,0011,0100,0101,0110,0011,sp,操作前的堆栈和SP,0010,sp,操作后的堆栈和SP,X1,X1,X2,图、堆栈操作对堆栈指针的影响,堆栈寻址,采用堆栈寻址的指令:,PSHD Smem ;将Smem中的数据压入堆栈 PSHM MMR ;将MMR中的数据压入堆栈 POPD Smem ;将数据从栈顶弹至Smem中 POPM MMR ;将数据从栈顶弹至MMR中,指令,TMS320C54x的指令集有近两百条指令,按功能分为如下几类:,算术运算指令,逻辑运算指令,程序控制指令,装入和存储指令,算术运算指令, 加法指令 减法指令 乘法指令 乘加指令 乘减指令 双数/双精度指令 特殊操作指令,加法指令,ADD *AR3+, A,ADD *AR3+,14,A,将AR3指向的地址单元0100h的内容1500h左移14位,得到5400000h加上1200h,将结果5401200h存在累加器A中。,ADDC *+AR2(5),A,将AR2加上5后指向的地址单元内容,并进位加到累加器A中,此指令计算0013h0004h1h0018h。,ADDM 0123Bh,*AR4+,减法指令,乘法指令,MPY 13, A,乘加和乘减指令,MAC *AR5+,A,MAC #345h,A,B,B=A+T*#345h,MAC *AR5+,*AR6+,A,B,B=A+(*AR5)*(*AR6) T=(*AR5),MACR *AR5+,A,A=rnd(A+T*(*AR5),MACR *AR5+,*AR6+,A,B,B=rnd(A+(*AR5)*(*AR6) T=(*AR5),MACA *AR5+,B=B+(*AR5)*A(3116) T=(*AR5) AR5=AR5+1,MAC X0,Y0,A X:(R0)+,X0 Y:(R4)+N4,Y0,这条指令命令DSP56300,将寄存器X0和Y0中的数相乘,结果加到Acc A中,将寄存器R0所指的X存储器地址中的值装入寄存器X0,将寄存器R4所指的Y存储器地址中的值装入寄存器Y0,R0的值加1,寄存器N4的值加给R4,.bss x, 4, 1 a0 .word 012h a1 .word 3211h a2 .word fe11h a3 .word ff03h .sect “program” LD #x, AR1 LD #0, A,AR1 LD #a0, T,MAC *+,A LD #a1,T MAC *+,A LD #a2,T MAC *+,A LD #a3,T MAC *,A,逻辑运算指令,AND *AR3+,A,A=A&(*AR3) AR3=AR3+1,ANDM #00FFh,*AR4+,(*AR4)=(*AR4)&(#00FF) AR4=AR4+1,移位指令,ROL A,ROLTC A,ROR A,SFTA B, +5,累加器算术移位,SFTA A, 5, B,SHIFT0,指令执行算术右移; SXM=1,移出的高位用符号位填。,SFTC A,SFTL A, 5, B,逻辑右移,高位补0.,测试指令,BIT *AR5+,15-12,指令中的(1512)表示测试第12位 TC=(*AR5)(15-12) AR5=AR5+1,BITF 5,#00FFh,测试Smem中指定的某些位,lk常数在测试一位或多位时起屏蔽作用。假如指定的一位或多位为0,状态寄存器ST0的TC位清0,否则该位置1。,BITT *AR70,CMPM *AR4+,0404h,比较16位单数据存储器操作数Smem和16位常数lk是否相等。若相等,ST0寄存器的TC位置1,否则该位清0。,CMPR 2,AR4,测试AR4是否大于AR0,程序控制指令,分支指令,调用指令,中断指令,返回指令,循环指令,堆栈操作指令,混合程序控制指令,转移指令,BD 1000h,程序指针指向指定的程序存储器地址(pmad),该地址可以是符号或一个数字。如果是延迟转移(指令带有后缀D),紧接着该指令的两条单字指令或一条双字指令从程序存储器中取出先执行。,BACC A,程序指针指向src的低16位所确定的地址。如果是延迟转移(指令带有后缀D),紧跟着该指令的两条单字或一条双字指令从程序存储器中取出先执行。,BANZ 2000h,*AR3,指令的条件代码所对应的条件,条件 说明 条件 说明 AEQ A=0 ANEQ A0 ALT A0 ALEQ A0 AGEQ A0 AOV AOV=0 ANOV AOV=1 C C=1 NC C=0 TC TC=1 NTC TC=0,BC 2000h,AGT,FB 012000h,FBACC A,调用指令,CALA A,程序指针转移到src的低位所确定的地址单元,返回地址压入栈顶。如果是延迟调用,紧接着该指令的两条单字指令或一条双字指令从程序存储器中取出来先执行。,CALLD 1000h,CC 2222h,AGT,FCALA A,中断指令,INTR 3,TRAP l0h,返回指令,FRET,FRETE,RC ANOV,RET,RETE,循环指令,RPT 127,该指令实现对下一条指令的自动循环执行。在循环执行期间,所有外部的中断都不会响应,如果有较长时间的循环,一定保证循环期间没有中断产生。,ST #99,BRC;执行循环块100次 RPTB end_block1,循环执行一段指令块,循环的次数由存储器映射的块循环计数器(BRC)确定。BRC的值必须在指令执行之前设置。程序执行时,块循环起始地址寄存器(RSA)中装入程序指针PC+2(如果是采用了延迟就是PC+4);块循环尾地址寄存器(REA)中装入程序存储器地址(pmad)。,RPTZ A,#1023,对目的累加器dst清0,并且循环执行下一条指令n+1次。,堆栈操作指令,FRAME 10h,把一个短立即数K加到堆栈指针SP中。,POPD 10,把由堆栈指针SP寻址的数据存储器单元的内容转移到由Smem确定的数据存储器单元中,然后堆栈指针SP执行加1操作。,POPM AR5,把由堆栈指针SP寻址的数据存储器单元的内容转移到指定的存储器映射寄存器MMR中,然后堆栈指针SP执行加1操作。,PSHD *AR3+,SP减1后将数据压入堆栈。,PSHM BRC,BRC:存储器映射的块循环计数器。 SP减1后,将MMR压入堆栈。,程序控制指令,IDLE K,1K3,执行(PC)+1 PC 状态位受INTM位的影响 强迫程序执行等待操作直至不可屏蔽中断产生或复位中断产生。芯片保持空闲状态(低功耗方式)。不论INTM如何设置,只要有一个不可屏蔽中断出现,系统就退出空闲状态,如果INTM=1,程序继续执行紧接着IDLE的指令,不会响应中断;如果INTM=,程序转移到相应的中断服务程序。,IDLE K,K的值决定了可以使芯片从空闲状态中激活的中断类型: K=1定时器和串口等外围设备在空闲状态时仍有效,此时定时器和串口仍然有输出时钟信号。外围中断和复位以及外部中断可以激活芯片。 K=2定时器和串口中等外围设备在空闲状态时无效,此时定时器和串口没有输出时钟信号。复位和外部中断可以激活芯片。 K=3定时器和串口等外围设备在空闲状态时无效,锁相环PLL被禁止,此时芯片将彻底进入空闲状态。,MAR *AR3+,修改由Smem所确定的辅助寄存器的内容。在兼容方式下(CMPT=1),并且ARxAR0,指令会修改ARx的内容以及辅助寄存器指针(ARP)的值;在非兼容方式下(CMPT=0),指令只修改辅助寄存器的值,而不改变ARP。,NOP,执行PC+1 PC 该指令除了程序指针执行加操作以外不执行任何操作。这在建立流水和执行延迟方面比较有用。,STLM A,AR1 LD *AR1,B,STLM A,AR1 NOP NOP LD *AR1,B,RESET,非屏幕的软件复位。 该指令不受INTM的影响,但它对INTM置位以禁止中断。,RSBX SXM RSBX 1,8,对状态寄存器ST0和ST1的特定位清0。N指明了被修改的状态寄存器(N0表示修改ST0寄存器,N1表示修改ST1寄存器),SBIT确定被修改的位。可直接用状态寄存器中的一个特定位的名称作为操作数,这样就不需要使用N和SBIT。,SSBX SXM SSBX 1,8,对状态寄存器ST0和ST1的特定位置1。,XC 1,ALEQ MAR *AR1+,该指令的运行情况由n和所选择的条件决定。如果n1并且满足条件,就执行该指令的下一条单字指令;如果n2并且满足条件,就执行该指令的下两条单字指令或者一条双字指令;如果不满足条件,执行n次nop操作。,装入和存储指令,一般的装入和存储指令 条件存储指令 并行装入和存储指令 并行装入和乘法指令 并行存储和加减乘指令 混合装入和存储指令,一般的装入指令,DLD *AR3+,B,把一个32位的长操作数Lmem装入目的累加器dst中。,LD *AR4,DP,把一个数据存储器的值或一个短立即数装入T寄存器或状态寄存器中的DP、ASM和ARP位。,LDM AR4,A,把存储器映射寄存器MMR中的值装入到目的累加器的低位字中,累加器的高位字和保护位清0 。不论DP的当前内容或ARx的高9位是多少,有效地址的高9位清0,将数据页指针设置为0。,LDR *AR1,A,把单数据存储器操作数Smem左移16位后装入目的累加器DST的高端(位3116)。Smem通过对累加器的位140清0进行四舍五入运算,累加器的第15位设置为1。,LDU *AR1,A,把单数据存储器Smem的值装入目的累加器dst的低端(位150),dst的保护位和高端(位3916)清0。因此,数据被看成是一个无符号的16位数,不管SXM位的状态如何都不进行符号扩展。,存贮指令,DST B,*AR3+,把源累加器的内容存放在一个32位的长数据储存器单元中Lmem中。,ST TRN,5,ST T,*AR7,ST #FFFFh,0,STH A,10,把源累加器src的高端(位3116)存放到数据存储器单元Smem中.,STH B,8,*AR7,把源累加器移位后位3116存放到数据存储器单元(Smem或Xmem)中。,STLM A,BRC,把源累加器src的低端(位150)存放到存储器映射寄存器MMR中。无论DP的当前值或ARx的高9位是多少,有效地址的高9位清0。,并行装入和乘法指令,LD *AR4+,16,A |MAC *AR5+,B,16位双数据存储器操作数Xmem左移16位后装入目的累加器的高端。同时并行执行一个双数据操作数Ymem与T寄存器的值相乘再把乘积加到dst_中的操作。,LD *AR4+,16,A |MACR *AR5+,B,指令带有R后缀,则对乘积和累加器操作的结果进行四舍五入,再存在dst中。四舍五入的方法是:给该值加上215,然后将结果的低端(位150)清0。,混合装入和存储指令,MVDD *AR3+,*AR5+,将Xmem寻址的数据存储器单元的内容复制到Ymem寻址的数据存储器单元中。,伪指令(Assembler Directives),伪指令为程序提供数据、控制汇编过程。所作的工作包括:,将代码和数据汇编到指定的位置。,在存储器中为未初始化的变量保留存储空间。,控制列表的方式。,初始化存储器,汇编条件块。,定义全局变量。,为汇编器指定可以获得宏的库,检查符号调试信息,段定义伪指令,.bss 在该段中保留若干字,.data 汇编入已初始化的数据段,.sect “section name” 汇编入已命名的段,.text 汇编入可执行的代码段,初始化常数伪指令,.float 初始化一个32-bit的浮点常数,.int 初始化一个或多个16-bit的无符号整数,.string 初始化一个或多个字符串,.word 初始化一个或多个16-bit的带符号整数,格式化输出列表的伪指令,.list 开始源文件列表,.nolist 停止源文件列表,.length 设置源文件列表的页长度,.title 在列表文件每一页打印文件名,引用其他文件的伪指令,.copy /.include 包含其他文件的源语句,.global 确认一个或多个全局(外部)符号,.mlib 定义宏库,条件汇编伪指令,.if/.else/.endif 条件汇编代码块,.loop/.endloop 循环汇编代码块,.break 终止循环汇编代码块,汇编时的符号,.equ/.set 使一个符号等于一个值,.end 结束程序,宏语言,Macro: A user-defined routine that can be used as an instruction,汇编器支持宏语言,使用户可以建立自己的“指令”。当程序要将特定的任务执行若干次时,尤其有用。,宏语言可以使用户:,定义自己的宏,或重新定义正执行的宏,简化长的或复杂的汇编代码,访问由归档器建立的宏库,在一个宏内定义条件块和可重复的块,在一个宏内操作字符串,控制展开列表,定义宏,在程序中使用宏之前,首先必须定义它。可以用两种方法来定义:,(1)在源文件或.include/.copy文件中定义,(2)在宏库中定义,定义宏,macname .macro parameter,model statements,.mexit,.endm,定义宏,macname 宏的名字,.macro 是一个伪指令,确认源语句为宏定义的第一行,parameters 选项,作为.macro伪指令的操作数,Model statements 每次调用宏时执行的指令或伪指令,.endm 终止宏定义,定义宏举例,* add3 p1, p2, p3 * p3 = p1 + p2 + p3 add3 .macro p1, p2, p3 ld p1,a add p2,a add p3,a stl a,p3 .endm,调用宏,在源程序中用宏的名字作为操作码来调用宏,add3 x, y, z,TMS320C54x程序简例,一个16位的二进制数既可以表示一个整数,也可以表示一个小数。,当它表示一个整数时,其最低位(D0)表示20,D1位表示21,次高位(D14)表示214。,如果表示一个有符号数时,最高位(D15)为符号位,0表示正数,1表示负数。,例如,07FFFH表示最大的正数32767(十进制),而0FFFFH表示最大的负数-1(负数用二进制的补码方式显示)。,TMS320C54x程序简例,当需要表示小数时,小数点的位置始终在最高位后,最高位(D15)表示符号位。,次高位(D14)表示2-1,然后是2-2,最低位(D0)表示2-15。,04000H表示小数0.5,01000H是小数2-3 = 0.125,0001H则表示16位定点DSP能表示的最小的小数(有符号) 2-15 = 0.000030517578125。,TMS320C54x程序简例,在DSP中,一个16进制的数可以表示不同的十进制数,或者是整数,或者是小数(如果表示小数,必定小于1),但仅仅是在做整数乘除或小数乘除时,系统对它们的处理才是有所区别的,而在加减运算时,系统都当成整数来处理。,在后面的例子中,除非有特别说明,我们指的都是有符号数。在C54X中,将一个小数用16位定点格式来表示的方法是用215乘以该小数,然后取整。,定点加法 temp3=temp1+temp2,ld temp1,a ;变量temp1装入累加器A add temp2,a ;变量temp2与累加器A相 加,结果放入A中 stl a,temp3 ;结果(低16位)存入变 量temp3中。,没有特意考虑temp1和temp2是整数还是小数,定点减法,stm #temp1,ar3 ;变量temp1的地址装入ar3寄存器 stm #temp2,ar2 ;变量temp2的地址装入ar2寄存器 sub *ar2, *ar3,b ;变量temp2和temp1都左移16位,然后相减,结果放入累加器B中(高16位) sth b,temp3 ;相减的结果(累加器B的高16位)存入变量temp3。,定点整数乘法,C54X提供了大量的有符号数乘法运算指令,其结果都是32位。,MPYU是一条专用于无符号数乘法运算的指令,而其它的乘法指令都是有符号数的乘法,定点整数乘法,rsbx FRCT ;清FRCT标志,准备整数乘 ld temp1,T ;变量temp1装入T寄存器 mpy temp2,a ;temp2*temp1,结果放入 累加器A(32位) sth a,temp3 ;结果的高16位存入temp3 stl a,temp4 ;结果的低16位存入temp4,定点小数乘法,由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。C54X中提供了一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移移位。,定点小数乘法,ssbx FRCT ;FRCT=1,准备小数乘法 ld temp1,16,a ;temp1装入A的高16位 mpya temp2 ;temp2乘A的高16位,结果 在B中,同时将temp2装入T寄存器 sth b,temp3 ;将乘积的高16位存temp3,定点整数除法,C54X没有提供专门的除法指令,一般有两种方法来完成除法。,使用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。,使用SUBC指令,重复16次减法完成除法运算。,C54程序举例,例1:使用C54X汇编语言编程计算 z1=x1+y1;z2=x1-y1;z3=x1*y1;z4=x2*y2。其中,x1=20,y1=54,x2=0.5,y2=-0.5837 编写汇编源程序如下: .title “suanshu.asm” .mmregs .bss x1,1 .bss x2,1 .bss y1,1,.bss y2,1 .bss z1,1 .bss z2,1 .bss z3_h,1 .bss z3_l,1 .bss z4,1 v1 .set 014h ; v1 =20 v2 .set 036h ; v2=54 v3 .set 04000h ; v3=0.5 v4 .set 0b548h ; v4=-0.5837,start: LD #x1,DP ST #v1,x1 ST #v2,y1 LD x1,A ;x1 A ADD y1,A ;A+Y1 A STL A,z1 ;保存AL z1 LD x1,A SUB y1,A STL A,z2,RSBX FRCT ;准备整数乘法,FRCT=0 LD X1,T MPY Y1,A ; x1*y1 A STH A,z3_h ;乘法结果高16位在z3_h 单元 STL A,z3_l ;乘法结果低16位在z3_l单元 ST #v3,x2 ST #v4,y2 SSBX FRCT ;准备小数乘法,FRCT=1 LD x2,16,A ; 将x2加载到AH MPYA y2 ;x2*y2 B,and y2 T STH B,z4 ;结果放到z4单元,例2:对数组x8=0,1,2,3,4,5,6,7进行初始化,.bss x,8 .data Table: .word 0,1,2,3,4,5,6,7 .text Start: STM #x,AR5 RPT #7 MVPD table,*AR5+ ,例3:计算 y =,.bss x,10 STM #x,AR1 STM #9,AR2 LD #0,A LOOP: ADD *AR1+,A BANZ LOOP,*AR2-,例3:计算 y =,.bss x,10 .bss y,1 STM #x,AR1 LD #0,A RPT #9 ; RPTZ A, #9 ADD *AR1+,A STL A,y,例4:对数据x8中的每个元素加1,.bss x,8 Begin: LD #1,16,B STM #7,BRC STM #x,AR4 RPTB next-1 ADD *AR4,16,B,A STH A,*AR4+ next: LD #0,B ,例5:求解 .其中数据均为小数,且a1=0.3 a2=0.2 a3= -0.4 a4=0.1 x1=0.6 x2=0.5 x3=-0.1 x4=-0.2,.bss a,4 .bss x,4 .data table: .word 3*32768/10 .word 2*32768/10 .word -4*32768/10 .word 1*32768/10 .word 6*32768/10 .word 5*32768/10 .word -1*32768/10 .word -2*32768/10,.text Start: SSBX FRCT STM #a,AR4 RPT #7 MVPD table,*AR4+ STM #x,AR5 STM #a,AR6 RPTZ A,#3 MAC *AR5+,*AR6+,A,

    注意事项

    本文(第三章-DSP的软件结构.ppt)为本站会员(韩长文)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开