DSP技术-05 电子通信08.ppt_第1页
DSP技术-05 电子通信08.ppt_第2页
DSP技术-05 电子通信08.ppt_第3页
DSP技术-05 电子通信08.ppt_第4页
DSP技术-05 电子通信08.ppt_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

1 第五章TMS320C54x汇编语言程序设计 一 概述二 堆栈的使用方法三 控制程序四 算术运算程序五 重复操作程序六 数据块传送程序七 小数运算程序八 浮点运算程序 2 一 概述 汇编语言程序设计作为DSP应用软件设计的基础 其主要任务是利用汇编指令和伪指令编写源程序以完成指定的功能 虽然C语言程序设计具有不依赖或较少依赖具体硬件且为大家所熟悉 因而可以大大缩短软件开发和升级DSP产品的周期 但在DSP芯片的资源和运算能力非常紧张的情况下 采用汇编语言进行DSP应用程序开发是最合适的 3 汇编语言源程序的句法格式 汇编源程序以 asm为扩展名 每行由4个部分组成 标号 助记符 操作数 注释 供本程序的其它部分或其它程序调用 标号是任选项 标号后面可以加也可以不加冒号 4 标号 助记符 操作数 注释 可以是助记符指令 汇编伪指令 宏指令和宏调用指令 1 助记符指令 一般用大写 2 汇编伪命令和宏命令 以句号 开始 且通常用小写 5 1 指令中的操作数或汇编命令中定义的内容2 操作数之间必须用逗号 分开 1 从分号 开始2 可以放在指令或汇编命令后面 也可以放在单独的一行或数行 标号 助记符 操作数 注释 6 汇编语言源程序的数据型式 二进制 如1110001b或1111001B 八进制 226q或572Q 十进制 1234或 1234或 1234 缺省型 十六进制 0A40h或0A40H或0 xA40浮点数 1 623e 23字符常数 D 字符串 thisisastring 7 汇编语言源程序要素 汇编命令助记符指令宏命令 汇编程序 汇编器 功能 将源程序汇编成可重定位的目标文件 obj文件 如果需要 可以生成一个列表文件 lst文件 将程序代码分段 每段的目标代码都有一个SPC管理 定义和引用全局符号 可在列表后附加交叉引用表 对条件程序块进行汇编 支持宏功能 允许定义宏命令 8 运行汇编程序 asm500 inputfile objectfile listingfile options 汇编器是名为asm500 exe的可执行程序 例如asm500cjy asm l s x源程序cjy asm经汇编后将生成一个cjy obj目标文件 列表文件 符号表 在目标文件中 以及交叉引用表 在列表文件中 例编写计算y a1 x1 a2 x2 a3 x3 a4 x4的汇编源程序 example asmy a1 x1 a2 x2 a3 x3 a4 x4 1 title example asm 为汇编源程序取名2 mmregs 定义存储器映象寄存器3STACK usect STACK 10h 分配10个单元的堆栈空间4 bssa 4 为系数a分配4个单元的空间5 bssx 4 为变量x分配4个单元的空间6 bssy 1 为结果y分配1个单元的空间7 def c int00 定义标号 c int0089 data 定义数据代码段10table word1 2 3 4 在标号table开始的8个单元11 word8 6 4 2 为这8个单元赋初值 12 text 定义文本代码段13 c int00 STM 0 SWWSR 软件等待状态R置0 不设等待14STM STACK 10h SP 设置堆栈指针初值15STM a AR1 AR1指向a的地址16RPT 7 从程序存储器向数据存储器17MVPDtable AR1 重复传送8个数据16CALLSUM 调用SUM实现乘累加和的子程序19end Bend 循环等待20SUM STM a AR3 将系数a的地址赋给AR321STM x AR4 将变量x的地址赋给AR422RPTZA 3 将A清0并重复执行下条指令4次23MAC AR3 AR4 A 执行乘累加 结果放在A中24STLA y 将A的低字送结果单元y25RET 结束子程序26 end 结束全部程序 11 列表文件 TMS320C54xCOFFAssemblerVersion3 70TueOct1912 42 592004Copyright c 1996 2001TexasInstrumentsIncorporatedexample asmPAGE11 2 example asmy a1 x1 a2 x2 a3 x3 a4 x4 3 5 mmregs 定义存储器映象寄存器6000000STACK usect STACK 10h 分配10个单元的堆栈空间7000000 bssa 4 为系数a分配4个单元的空间8000004 bssx 4 为变量x分配4个单元的空间9000008 bssy 1 为结果y分配1个单元的空间10 global c int00 定义标号 列表文件中包括源程序语句和目标代码 11000000 data 定义数据代码段120000000001table word1 2 3 4 在标号table开始的8个单元中0000010002 为这8个单元赋初值00000200030000030004130000040008 word8 6 4 200000500060000060004000007000214000000 text 定义文本代码段150000007728 c int00STM 0 SWWSR 软件等待状态寄存器置0 不设等待0000010000160000027718STM STACK 10h SP 设置堆栈指针初值0000030010 170000047711STM a AR1 AR1指向a的地址0000050000 18000006EC07RPT 7 从程序存储器向数据存储器190000077C91MVPDtable AR1 重复传送8个数据0000080000 源文件的每一行都会在列表文件中生成一行 包括行号 段程序计数器SPC的数值 汇编后的目标代码 源程序语句 第2字单独列一行 列出了SPC的数值和目标代码 20000009F074CALLSUM 调用SUM实现乘法累加和的子程序00000a000D 2100000bF073end Bend 循环等待00000c000B 2200000d7713SUM STM a AR3 将系数a的地址赋给AR300000e0000 2300000f7714STM x AR4 将变量x的地址赋给AR30000100004 24000011F071RPTZA 3 将A清0 并重复执行下条指令4次000012000325000013B09AMAC AR3 AR4 A 执行乘法并累加 结果放在A中260000140008 STLA y 将A的低字内容送结果单元y27000015FC00RET 结束子程序28 end 结束全部程序NoAssemblyErrors NoAssemblyWarnings Field1源程序语句的行号用十进制数表示 Field2段程序计数器 SPC 用十六进制数表示 Field4 源程序语句 Field3 目标代码 未定义的外部引用 text段重新定位 data段重新定位 sect段重新定位 bss和 usect段重新定位 14 在运行汇编程序时 还可产生交叉引用清单 清单包括符号 定义和引用的位置 交叉引用列表 LABELVALUEDEFNREFINT00002 191ISR2REF321procREF428 列出汇编时定义和引用的每个符号 列出一个赋给符号的4位十六进制数值 或说明符号属性的字符或名称 列出引用此符号的语句的行号 如果此栏是空格 表示此符号还没有被引用过 列出定义符号的语句编号 如果此符号未加定义则此栏是空格 15 REF 外部引用 globa段的符号 UNDF 未曾定义过 在 text段定义的符号 在 data段定义的符号 在 sect段定义的符号 在 bss或 usect段定义的符号 交叉引用清单中符号的属性 16 二 堆栈的使用方法 TMS320C54xDSP支持软件堆栈 提供一个16位堆栈指针 SP 寻址 用户可以在存储区开辟一块区域作为堆栈存储器使用 使用堆栈时应注意 1 如要用堆栈 必须先设置 后使用 2 堆栈从高地址向低地址增长 压栈时 指针先减SP 1 再压入数据 出栈时 先弹出数据后 再SP 1 3 在编写链接命令文件 cmd 中将堆栈段放入内部数据存储区 17 例设计一存储空间为100个单元的堆栈 Size set100 设置空间为100stackstack usect STK size 设置堆栈段的首地址 和堆栈空间STM stack size SP 将栈底地址指针送 SP 对其初始化 18 三 控制程序1 分支转移操作 通过分支转移指令改写PC 可以改变程序的流向 而子程序调用指令则通过将一个返回地址压入堆栈 执行返回时恢复原地址 可执行 分支转移循环控制子程序调用 功能 方法 19 条件分支转移无条件分支转移远分支转移 B D 用指令中所给出的地址加载PCBACC D 用所指定的累加器的低16位作为地址加载PC 带延迟不带延迟 C54xDSP转移种类 BC D 如果指令中所规定的条件得到满足 就用指令中所给出的地址加载PC BANZ D 如果当前辅助寄存器不等于0 就用指令中所规定的地址加载PC 允许分支转移到扩展程序存储器 20 无延时在分支指令到达流水线执行阶段时 紧跟在该指令后面的2条已读入流水线的指令在流水线中被清除 不执行 带延时在分支指令到达流水线执行阶段时 紧跟在分支指令后面的一个2字指令或2个单字指令被执行 远分支转移远分支转移允许分支转移到扩展存储器 2 子程序调用和返回 转移前 原程序的下条指令地址被压入堆栈 而在返回时则将该地址弹出至PC 使被中断的原程序能继续执行 当执行调用指令进行子程序或函数调用时 DSP中断当前运行的程序 转移到程序存储器其它地址继续运行 功能 方法 无条件调用与返回有条件调用与返回远调用与远返回 带延迟不带延迟 CALL d lopRETmain 3 条件指令中的条件判断 23 多重条件判断 BCpmad cond cond cond 相与关系 相或关系 BCpmad condBCpmad cond 24 第1组 例如 可以从A类中选一个条件 同时从B类中选择一个条件 但是不能从同一类中选择两个条件 另外 两种条件测试的累加器必须是同一个 可以同时测试AGT和AOV 但不能同时测试AGT和BGT 第1组 25 第2组 例如 可以同时在A B C三类中各选择一个条件 但不能从同一类中选择两个条件 可以选择TC C和BIO 但不能同时选择NTC C和NC 26 特例 如果条件分支转移出去的地方只有1 2字的程序段 则可以用一条单周期条件执行指令 XC 来代替分支转移指令 XCn cond cond cond 当n 1 且条件得到满足 就执行紧随此条件指令后的 个字指令 当n 2 且条件得到满足 就执行紧随此指令后的1个双字指令或者2条单字指令 当条件不满足 就依n的值执行1条或2条NOP指令 27 1 加法和减法运算例编写求解加 减法的程序 计算z x y w SUM1 LD x A 将x地址的内容送AADD y A 将y地址的内容与A中x值相加SUB w A 将A中的内容与w相减 得zSTLA z 将A的计算值存入z地址中 四 算术运算程序 28 例编写求解直线方程的程序 计算y mx b SUM2 LD m T 将m地址的内容送TMPY x A 将x地址的内容与T中的m相乘 结果送AADD b A 将A中的mx与b地址的内容相加 结果送ASTLA y 将A的计算结果存入y地址中 29 运行速度快 用间接寻址方式获得操作数 且辅助寄存器只用了AR2 AR5 占用程序空间小 2 双操作数乘法运算 特点 30 例编制求解的程序 利用双操作数指令可以节省机器周期 迭代次数越多 节省的机器周期数也越多 本例中 在每次循环中 双操作数指令都比单操作数指令少用一个周期 节省的总机器周期数 T N 迭代次数 31 单操作数指令方案双操作数指令方案LD 0 BLD 0 BSTM a AR2STM a AR2STM x AR3STM x AR3STM 19 BRCSTM 19 BRCRPTBdone 1RPTBdone 1LD AR2 T 1TMPY AR2 AR3 A 1TMPY AR3 A 1TADDA B 1TADDA B 1Tdone STHB ydone STHB ySTLB y 1STLB y 1 块重复结束地址 块重复计数器 32 在单个周期内同时利用C总线和D总线 得到32位的长字操作数 使用长操作数指令时 按指令中给出的地址存取的总是高16位操作数 这样就有两种数据排列方法 3 长字运算 特点 33 1 偶地址排列法指令中给出的地址为偶地址 存储器中低地址存放高16位操作数 如 DLD AR3 A 长字加载累加器A执行前 A 0000000000执行后 A 006CACBD90AR3 0100AR3 0102 0100h 6CAC 高字 0100h 6CAC 0101h BD90 低字 0101h BD90 34 2 奇地址排列法指令中给出的地址为奇地址 存储器中低地址存放低16位操作数 如 DLD AR3 B 长字加载累加器B执行前 B 0000000000执行后 B 00BD906CACAR3 0101AR3 0103 0100h 6CAC 低字 0100h 6CAC 0101h BD90 高字 0101h BD90 35 一般推荐采用偶地址排列法 将高16位操作数放在偶地址存储单元中 如 程序存储器 long12345678h 偶地址 1234 奇地址 5678数据存储器 bssxhi 2 1 1 偶地址 xhi 奇地址 xlo变量名称字长页邻接偶地址排列法 36 例计算Z32 X32 Y32 标准运算长字运算 双精度 LD xhi 16 ADLD xhi AADDS xlo ADADD yhi AADD yhi 16 ADSTA zhiADDS ylo A 3个字 3个T STHA ZhiSTLA Zlo 6个字 6个T 37 1 并行运算指同时利用D总线和E总线 其中 D总线用来执行加载或算术运算 E总线用来存放先前的结果 2 并行指令都是单字单周期指令 3 并行运算时所存储的是前面的运算结果 存储之后再进行加载或算术运算 4 并行指令都工作在累加器的高位 5 大多数并行运算指令都受累加器移位方式ASM位影响 4 并行运算 特点 38 并行指令 39 例编写计算z x y和f d e的程序段 在此程序段中用到了并行存储 加载指令 即在同一机器周期内利用E总线存储和D总线加载 数据存储器分配如图 title cjy3 asm mmregsSTACK usect STACK 10H bssx 3 为第一组变量 分配3个存储单元 bssd 3 为第二组变量 分配3个存储单元 defstart datatable word0123H 1027H 0 1020H 0345H 0 40 textstart STM 0 SWWSRSTM STACK 10H SPSTM x AR1RPT 5MVPDtable AR1 STM x AR5 将第一组变量的首地址传给AR5STM d AR2 将第二组变量的首地址传给AR2LD 0 ASM 设置ASM 0LD AR5 16 A 将x的值左移16位放入A的高端字ADD AR5 16 A 将y值左移16位与A的高端字x相加STA AR5 将A中的和值右移16位存入z中 LD AR2 B 将d的值左移16位放入B的高端字ADD AR2 16 B 将e值左移16位与B的高端字d相加STHB AR2 将B的高端字中的和值存入f中end Bend end 41 5 64位加法和减法运算 例编写计算Z64 W64 X64 Y64的程序段 这里的W X Y和结果Z都是64位数 它们都由两个32位的长字组成 利用长字指令可以完成64位数的加 减法 w3w2w1w0 W64 x3x2Cx1x0 X64 低32位相加产生进位C y3y2C y1y0 Y64 低32位相减产生借位C z3z2z1z0 Z64 DLD w1 A A w1w0DADD x1 A A w1w0 x1x0 低32位加 产生进位CDLD w3 B B w3w2ADDC x2 B B w3w2 x2 C 16位带进位加法ADD x3 16 B B w3w2 x3x2 CDSUB y1 A A w1w0 x1x0 y1y0 产生借位C DSTA z1 z1z0 w1w0 x1x0 y1y0 保存低32位结果SUBB y2 B B w3w2 x3x2 C y2 C 16位带借位减法SUB y3 16 B B w3w2 x3x2 C y3y2 C DSTB z3 z3z2 w3w2 x3x2 C y3y2 C 保存64位结果由于没有长字带进 借 位加 减法指令 所以上述程序中只能用16位带进 借 位指令ADDC和SUBB 43 6 32位乘法运算 x1x0SU y1y0SU x0 y0U Uy1 x0S Ux1 y0S Uy1 x1S S w3w2w1w0SUUU 例编写计算W64 X32 Y32的程序段 32位乘法算式如下 其中 S为带符号数 U为无符号数 数据存储器分配如图所示 在32位乘法运算中 实际上包括了三种乘法运算 U U S U和S S 一般的乘法运算指令都是两个带符号数相乘 即S S 所以 在编程时 要用到以下三条乘法指令 MACSUXmem Ymem src 无符号数与带符号数相乘并累加 src U Xmem S Ymem srcMPYUSmem dst 无符号数相乘 dst U U Smem MACXmem Ymem src 两个带符号数相乘并累加 src S Xmem S Ymem src 45 STM x0 AR2 将x的首地址放入AR2STM y0 AR3 将y的首地址存入AR3LD AR2 T T x0MPYU AR3 A A x0 y0STLA w0 w0 x0 y0LDA 16 A A A 16MACSU AR2 AR3 A A y1 x0MACSU AR3 AR2 A A x1 y0STLA w1 w1 ALDA 16 A A A 16MAC AR2 AR3 A A x1 y1STLA w2 w2 A的低16位STHA W3 w3 A的高16位 32位乘法的程序段如下 特点2 特点1 五 重复操作程序1 单指令重复操作 重复执行 RC 1次 RC内容不能编程设置 只能由重复指令 RPT和RPTZ 中的操作数加载 操作数n的最大值为65535 最大重复执行次数为65535 1 一旦重复指令被取指 译码 直到重复循环完成以前 对所有的中断 包括 但不包括 均不响应 重复执行下一条指令n 1次 47 重复过程 当RPT指令执行时 首先把循环次数装入重复计数器 RC 其循环次数n由一个16位单数据存储器操作数或一个8位或16位常数给定 这样紧接着的下一条指令会循环执行n 1次 循环中 RC在执行减1操作时不能被访问 该循环内不能套用循环 48 例利用单条指令的重复操作对数组x 5 0 0 0 0 0 进行初始化 bssx 5 为数组x分配5个存储单元STM x AR1 将x的首地址赋给AR1LD 0 A 对A清零RPT 4 设置重复执行下条指令5次STLA AR1 对x 5 各单元清零或者 bssx 5STM x AR1RPTZA 4 对A清零并重复执行下条指令5次STLA AR1 49 利用C54x块重复计数器 BRC加载值0 65535 块重复起始地址寄存器 RSA 块重复结束地址寄存器 REA 与块重复指令RPTB 可对RPTB后由若干条指令构成的程序块进行n 1次重复操作 2 块程序重复操作 功能 重复执行程序代码块n 1次 注意 RPT指令一旦执行 不会停止操作 即使有中断请求也不响应 RPTB指令可以响应中断 例对数据组x 5 中的每个元素加1 bssx 5 为数组x分配5个存储单元begin LD 1 16 B 将1左移16位放入B的 高端字的最低位STM 4 BRC 4 BRC PC 2 RSASTM x AR4 将x的首地址赋给AR4RPTBnext 1 将NEXT 1 REAADD AR4 16 B A x地址的内容左移16位加 B的高端字 结果放ASTHA AR4 将A的高端字存入x单元 完成加1操作next LD 0 B 对B清零 next 1为结束地址 对寄存器的占用 3 循环的嵌套 嵌套原则 参与嵌套循环的寄存器不能重复使用 执行RPT指令时要占用RC寄存器 重复计数器 执行RPTB指令时要占用到BRC RSA和RSE寄存器 因为C54xDSP只有一套块重复寄存器 故块重复操作不能嵌套 由于RPT与RPTB两者用了不同的寄存器 因此RPT指令可以嵌套在RPTB指令中 实现循环的嵌套 52 一个三重循环嵌套结构 53 传送速度比加载和存储指令要快 传送数据不需要通过累加器 可以寻址程序存储器 与RPT指令相结合 重复时 这些指令都变成单周期指令 可以实现数据块传送 六 数据块传送程序 特点 54 1 数据存储器数据存储器指令字数 执行周期MVDKSmem dmad Smem dmad2 2MVKDdmad Smem Smem dmad2 2MVDDXmem Ymem Ymem Xmem1 1 2 程序存储器数据存储器MVPDpmad Smem Smem pmad2 3MVDPSmem pmad pmad Smem2 4 55 pmad为16位立即数程序存储器地址 dmad为16位立即数数据存储器地址 Smem为数据存储器地址 Xmem Ymem为双操作数数据存储器地址 Xmem从DB数据总线上读出 Ymem从CB数据总线上读出 3 数据存储器MMRMVDMdmad MMR 指令的字数 执行周期2 2MVMDMMR dmad dmad MMR2 2MVMMmmrx mmry mmry mmrx1 1 4 程序存储器 Acc 数据存储器READASmem Smem prog A 1 5WRITASmem prog A Smem1 5mmrx mmry为AR0 AR7或SP MMR为任何一个存储器映象寄存器 57 例将数组x 5 初始化为 1 2 3 4 5 data 定义初始化数据段起始地址TBL word1 2 3 4 5 为标号地址TBL 开始的5个单元赋初值 bssx 5 为数组x分配5个存储单元 text 定义代码段起始地址START STM x AR5 将x的首地址存入AR5RPT 4 设置重复执行5次下条指令MVPDTBL AR5 将TBL开始的5个值传给x 58 例将数据存储器中的数组x 10 复制到数组y 10 title cjy1 asm 为汇编源程序取名 mmregs 定义存储器映象寄存器STACK usect STACK 30H 设置堆栈 bssx 10 为数组x分配10个存储单元 bssy 10 为数组y分配10个存储单元 datatable word1 2 3 4 5 6 7 8 9 10 defstart 定义标号start text start STM 0 SWWSR 复位SWWSRSTM STACK 30H SP 初始化堆栈指针STM x AR1 将目的地首地址赋给AR1RPT 9 设定重复传送的次数为10次MVPDtable AR1 程序存储器传送到数 据存储器STM x AR2 将x的首地址存入AR2STM y AR3 将y的首地址存入AR3RPT 9 设置重复执行10次下条指令MVDD AR2 AR3 将地址x开始的10个值 复制到地址y开始的10个单元end Bend end 60 七 小数运算程序 整数运算的问题 1 两个16位整数相乘 乘积总是 向左增长 这意味着多次相乘后 乘积将会很快超出定点器件的数据范围 2 保存32位乘积到存储器 要开销2个机器周期以及2个字的存储器单元 3 由于乘法器都是16位相乘 因此很难在后续的递推运算中 将32位乘积作为乘法器的输入 小数运算与整数运算的比较 61 小数运算的优点 1 乘积总是 向右增长 意味着运算结果超出定点器件数据范围的将是不太感兴趣的尾数部分 2 既可以存储32位乘积 也可以只存储高16位乘积 这就允许用较少资源保存结果 3 适合用于递推运算 小数运算与整数运算的比较 62 1 小数的表示方法 Q格式表示法 Q之后的数字 如Q15格式中的15 决定小数点右边二进制的位数 故Q15表示在小数点后有15位小数 当用一个16位的字来表示Q15格式时 在MSB 最高位 的右边为小数点 MSB表示符号位 所以Q15格式可表示的数据范围为 1 以 0 999997表示 到 1的值 通常用Q15格式表示小数 Q0格式表示整数 63 一个16位2的补码小数的Q15格式的每一位权值为 MSB 最高位 LSB 最低位 符号位1 21 41 8 2 15一个十进制小数乘以32768之后再将其十进制整数部分转换成十六进制数 就能得到这个十进制小数的2的补码表示了 1 7FFFh0 5正数 乘以32768 整数部分转为16进制数4000h0 0000h 0 5负数 绝对值部分乘以32768 再取反加1C000h 18000h 64 在C54xDSP汇编语言中 是不能直接写入十进制小数的 但可写为整数运算式 例如要定义一个系数0 707 可以写成 word32768 707 1000而不能写成32768 0 707 注意 65 通过选择合适的Q格式 可以把数值根据所需的精确度做适当地转换 以便定点DSP也可以处理高精度的浮点数 下面以Q15为例 说明转换的过程 先确定准备转换的十进制数值N 是在Q15格式的数值范围之间 即 1 000000 N 0 999997 2 数值N乘以215 即N 215 N 32768步骤2 的结果转换成十六进制 负数取反加1 得到的结果就是N的Q15转换值 66 例下面把 0 2345及 0 2345转换成Q15格式 0 2345的转换为 0 2345 32768 7684 1 76847684转换成十六进制数值结果为1E04h即 0 2345的Q格式表示为1E04H 0 2345的转换为 0 2345 32768 7684 1 7684 7684转换成十六进制数值结果为9E04H即 0 2345的Q格式表示为0 xE1FCH 67 以数据字长为4位 8位累加器为例的小数乘法 0 5 0 375 0 187501000 5 23 0 5 4 10 0100 2 1101 0 375 23 0 375 3 10 1101 2补0100 Q3格式 000001001100 01001110100 0 1875 12 26 12 1110100 补 Q6格式 2 小数乘法与冗余符号位 68 上述乘积是7位 当将其送到8位累加器时 为保持乘积的符号 必须进行符号位扩展 这样 累加器中的值应为11110100 0 09375 12 27 出现了冗余符号位 原因是 Sxxx Q3 Syyy Q3 SSzzzzzz Q6格式 即两个带符号数相乘 得到的乘积带有2个符号位 造成错误的结果 同样 对于两个十六位数相乘 乘积只有30位 在最高的两位也是符号位 同样会造成错误的结果 69 解决冗余符号的办法是 在程序中将状态寄存器ST1中的FRCT 小数方式 位设为1 在乘法器将结果传送至累加器时就自动地左移1位 累加器中结果为 Szzzzzz0 Q7格式 即11101000 0 1875 24 27 24 11101000 补 自动地消去了两个带符号数相乘时产生的冗余符号位 所以在小数乘法编程时 应当事先置位FRCT SSBXFRCT FRCT 1 MPY AR2 AR3 ASTHA Z这样 C54x就完成了Q15 Q15 Q15的小数乘法 70 例编制计算的程序段 其中数据均为小数 a1 0 1 a2 0 2 a3 0 3 a4 0 4 x1 0 8 x2 0 6 x3 0 4 x4 0 2 title cjy4 asm mmregsSTACK usect STACK 10H 定义10个堆栈空间 bssa 4 为a分配4个存储单元 bssx 4 为x分配4个存储单元 bssy 1 为结果y分配1个存储单元 defstart 定义符号 data 定义数据代码段 71 table word1 32768 10 在table开始的8个 word2 32768 10 地址存放数据 word 3 32768 10 word4 32768 10 word8 32768 10 word6 32768 10 word 4 32768 10 word 2 32768 10 text 定义程序代码段start SSBXFRCT 设置FRCT位 表示进行小数乘STM x AR1 将x的首地址传给AR1RPT 7 重复8次下条指令MVPDtable AR1 将程序空间8个数传给数据存储器STM x AR2 将数据存储器第一个数x1的地址传给AR2STM a AR3 将数据存储器第五个数a1的地址传给AR3RPTZA 3 将A清零 重复4次下条指令MAC AR2 AR3 A 执行乘法累加和 结果放在A中STHA y 将A的高端字存入结果y 低端字省去end Bend 循环等待 end结果为 y 0 x1EB7 转换为十进制小数 y 1 163 14 162 11 161 7 160 32768 0 24 73 10 除法运算 条件减法指令的功能 SUBCSmem src src Smem 15 ALU输出端 如果ALU输出 0 则 ALU输出 1 1 src 否则 src 1 src 方法 利用条件减法指令 SUBC 加重复指令 RPT 15 实现两个无符号数除运算 例设累加器为8位 完成10 3的运算 00001001 00010011 前4位余数 后4位商 00001010 00011000结果为负 丢弃结果 将被除数左移一位再减11110010 00010100 00011000结果为负 丢弃结果 将被除数左移一位再减11111100 00101000 00011000结果为正 将结果左移一位后加一再减00010000 00100001 00011000结果为正 将结果左移一位后加一得最后结果00001001 75 例编写0 4 0 8 的程序段 title cjy5 asm mmregsSTACK usect STACK 10H bssnum 1 为分子分配单元 bssden 1 为分母分配单元 bssquot 1 为商分配单元 data 定义数据段起始地址table word4 32768 10 在以table为地址的 单元放入0 4 word 8 32768 10 在以table为地址的 下一单元放入 0 8 defstart 1 当 被除数 除数 此时商为小数 text 定义数据段起始地址start STM num AR1 将分子所在单元的地址传给AR1RPT 1 重复执行下一指令2次MVPDtable AR1 传送程序空间的2个数据 分子 分母 至地址为num开始的数据存储器单元LD den 16 A 将分母移到累加器A 31 16 MPYA num num A 31 16 B 获取商的符号 在累加器B中 ABSA 分母取绝对值STHA den 分母绝对值存回原处LD num 16 A 分子加载到A 31 16 ABSA 分子取绝对值RPT 14 15次减法循环 完成除法SUBC den A XC1 BLT 如果B 0 商是负数 则需要变号NEGA 如果B 0执行求反 否则跳过此指令STLA quot 保存商end Bend end a 被除数 除数 商为小数b 被除数 除数 商为整数 78 2 当 被除数 除数 时 商为整数 例编写16384 512的程序段 将上例程序段仅作两处修改 其它不变 就得本例的程序段 LD num 16 A改成LD num ARPT 14改成RPT 15本例的程序段为 title cjy6 asm mmregsSTACK usect STACK 10H bssnum 1 为分子分配单元 bssden 1 为分母分配单元 bssquot 1 为商分配单元 data 定义数据段起始地址table word66 32768 100 在以table为地址 的单元放入16384 word 33 32768 100 在以table为地址 的下一单元放入512 defstart text 定义数据段起始地址start STM num AR1 将分子所在单元地址传给AR1RPT 1 重复执行下一指令2次MVPDtable AR1 传送程序空间的2 数据 分子 分母 至地址为 num开始的数据存储器单元 LD den 16 A 将分母移到累加器A 31 16 MPYA num num A 31 16 B 获取商的符号 在累加器B中 ABSA 分母取绝对值STHA den 分母绝对值存回原处LD num A 分子加载到A 15 0 ABSA 分子取绝对值RPT 15 16次减法循环 完成除法SUBC den A XC1 BLT 如果B 0 商是负数 则需要变号NEGA 如果B 0执行求反 否则跳过此指令STLA quot 保存商End Bend end 结果为quot 0 x0020 32 81 八 浮点运算程序 整数和小数部分分开 小数点位置固定硬件实现比较容易数据动态范围受到限制 定点数运算 1 C54x系列本身是定点DSP芯片 但支持浮点运算 2 用定点DSP芯片进行浮点数运算时 必须先将定点数转换为浮点数 要点 82 1 浮点数的表示方法 浮点数表示定点数 用尾数和指数两部分组成 定点数 尾数 2 指数 或x m 2e 扩大了数据的范围和精度操作数必须先变为定点数 然后再返回浮点数通过规格化输入数据 将定点数变换为浮点数 浮点数运算 83 2 定点数转换成浮点数 这是一条提取指数的指令 所提取的指数保存在T暂存寄存器中 尾数保存在累加器中 如果累加器A 0 则0 T 否则 累加器A的冗余符号位数减8 T 累加器A中的内容不变 转换要点 1 先将定点数放在累加器A或B中 然后使用指令 EXPA或EXPB 注意 由于C54xDSP用16位表示数字 其对浮点数的表示与IEEE754 1985标准的32位表示法略有不同 采用一个单元保存指数和一个单元保存尾数的两个16位表示法 84 例提取A FFFFFFFFCB中的指数值 执行指令 EXPA执行前执行后A FFFFFFFFCBA FFFFFFFFCBT 0000T 0019 25 本例中 由于A 0 需要先求出A的冗余符号位并减去8 A FFFFFFFFCB111111111111111111111111111111111100101133位冗余符号位1 33 8 25 0 x0019 85 例提取B 0785432105中的指数值 执行指令 EXPB执行前执行后B 0785432105B 0785432105T 0000T FFFC 4 本例中 由于B 0 需要先求出B的冗余符号位并减去8 A 078543210500000111100001010100001100100001000001014位冗余符号位0 4 8 4 0 xFFFC 4 0 x0004 1111111111111011 1 补 0 xFFFC 补 86 2 使用存储指令STT EXPONENT 将保存在T寄存器中的指数存放到数据存储器的指定单元中 如EXPA 提取指数STT e1 将指数存入数据存储器 e1所指定的单元中 87 3 使用归一化指令NORMA 按 中的内容对累加器A进行归一化处理 将定点数转换成浮点数所进行的归一化处理 指通过左移或右移 使一个二进制数变为一个小数 且小数点后的第一个数不为零 移动的位数用指数表示 88 例如 0 3 0 010011 2 2 0 0 10011 2 2 1 0 8 0 8 2 0 0 110011 2 2 0 0 24 0 001111 2 0 0 1111 2 2 2 3 11 2 2 0 0 11 2 22 8 1000 2 2 0 0 1 2 24 24 11000 2 2 0 0 11 2 25 上例中 对于小数 当转换成小数点后第一位为1的归一化数时 通过将小数点右移实现 指数为负数 对于整数 则将小数点左移实现 89 例对累加器A进行归一化处理 执行指令 NORMA执行前执行后A FFFFFFF001A FF80080000T 0013T 0013 19 执行时 按T中的十进制数值 这里为正19 对累加器A中的值左移19位 即将在A FFFFFFF001中的值左移19位 低位添零 高位溢出丢弃 A 1111111111111111111111111111000000000001 2 11111111111111111111111111110000000000010000000000000000000左移出去掉19位左移进19位添0 1111111110000000000010000000000000000000 2 FF80080000 16 90 例对累加

温馨提示

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

评论

0/150

提交评论