ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:79.29KB ,
资源ID:6409180      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6409180.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(运用TMS320C54x汇编语言编写定点数运算浮点数运算程.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

运用TMS320C54x汇编语言编写定点数运算浮点数运算程.docx

1、运用TMS320C54x汇编语言编写定点数运算浮点数运算程一、 定点数的运算在定点 DSP 芯片中,采用定点数进行数值运算,其操作数一般采用整数来表示。一个整 数的最大表示范围取决于 DSP 芯片所给定的字长,一般为 16位或 24位。显然,字长越长,所 能表示的数的范围越大, 精度也越高。在字长固定的前提下, 所需要达到的精度越高, 那么 所能表示的浮点数的范围就会越小。DSP 芯片的数以 2的补码形式表示。每个 16位数用一个符号位来表示数的正负, 0表示数 值为正, l 则表示数值为负。其余 15位表示数值的大小。如:二进制数 0010000000000011b=8195二进制数 111

2、1111111111100b= -4为了使得无论是无符号数还是符号数, 都可以使用同样的加法减法规则, 符号数中的负 数用正数的补码表示。对 DSP 芯片而言,参与数值运算的数就是 16位的整数。但在许多情况下,数学运算过程 中的数不一定都是整数。 那么, DSP 芯片是如何处理小数的呢?这其中的关键就是数的定标, 由程序员来确定一个数的小数点处于 16位中的哪一位。通过设定小数点在 16位数中的不同位置, 就可以表示不同大小和不同精度的小数了。 数 的定标有 Q 表示法和 S 表示法两种。定点数的加减法运算 较为简单,只需遵循二进制数加减法运算规则相加减即可。如:两个 8位数具有相同的 Qn

3、 格式,保证隐含的小数点对齐。下图中两个 8位数相加, 有溢出。 溢出是由于字长有限运算结果超出数值的表示范围引起的。定点数的乘法运算DSP 处理器都有硬件乘法器和乘法指令,可实现单周期乘法运算,二进制乘法运算包含 一系列的移位和加法运算。 定点数乘法运算不要求相乘数有相同的 Qn 格式。 两个相乘数分别 为 Qn 和 Qm 格式,字长为 N ,结果为 Q(n+m格式,字长为 2N 。如:以下两个相乘数分别为 Q7和 Q6格式, 8位字长。两个定点小数作乘法运算,结果左移一 位,保存高位得到运算结果,结果为 Qm (m nm 格式。小数乘小数,整数乘小数都要求 对乘积结果左移一位后, 保存高位

4、。 整数与整数相乘,须查询标志位确定保存的位数, 结果不需要左移一位。 DSP 处理器带有可选的自动左移一位的功能,消除移位操作的时间开销。 定点数的除法运算除法是乘法的逆运算, 包括一系列移位和条件减法运算, 需要用除法子程序实现。 大多 数 DSP 处理器不提供单周期除法指令。如果除法运算中包含负数,应将负数变换为等值的正 数,然后作除法运算,最后加上正确的符号。下面详细分析 32位整数乘法, 32位小数乘法以及有符号 /无符号整数除法的程序指令。 32位定点数乘法运算示意图32位整数乘法参考程序:; This routine multiplies two 32-bit signed in

5、tegers resulting; in a 64-bit product. The operands are fetched from data memory and; the result is written back to data memory.; Data Storage:; X1,X0 32-bit operand; Y1,Y0 32-bit operand; W3,W2,W1,W0 64-bit product; Entry Conditions:; SXM = 1 , OVM = 0;.mmregsSTACK: .usect “STACK”,100h ;设置堆栈段.bss X

6、0,1.bss X1,1.bss Y0,1.bss Y1,1.bss W0,1.bss W1,1.bss W2,1.bss W3,1.def start.datatable1: .word 1.word 2table2: .word 3.word 4.textstart: STM #X0,AR2 ;将 X0的首地址存入 AR2STM #Y0,AR3 ;将 Y0的首地址存入 AR3RPT #1 ;设置重复执行两次下条指令MVPD table1,*AR2+ ;将 table1开始的两个值传给 X0RPT #1 ;设置重复执行两次下条指令MVPD table2,*AR3+ ;将 table2开始的两

7、个值传给 Y0STM #X0,AR2 ;将 X0的首地址存入 AR2STM #Y0,AR3 ;将 Y0的首地址存入 AR3LD *AR2,T ; T=X0MPYU *AR3+,A ; A=无符号数 X0无符号数 Y0STL A,W0 ;将 A 送入 W0LD A,-16,A ; A 值左移 16位MACSU *AR2+,*AR3-,A ; A+= Y1无符号数 X0MACSU *AR3+,*AR2,A ; A+= X1无符号数 Y0STL A,W1 ;将 A 送入 W1LD A,-16,A ; A 值左移 16位MAC *AR2,*AR3,A ; A+=11X Y STL A,W2 ; W2=

8、A的低 16位STH A,W3 ; W3=A的高 16位here: B here程序分析:如原理图所示, 32位整数乘法的计算过程是将两个 32位的数 X 和 Y 各自分成 X0、 X1和 Y0、 Y1的 16位数。然后进行 X0Y0, A 值左移 16位, Y1X0, X1Y0, A 值再左移 16位, X1Y1的操作。 需要注意的是在 32位乘法运算中, 实际上包括了三种乘法运算:U U 、 S U 和 S S 。 U 指无符号数, S 指带符号数。在编程时,要用到以下三条乘法指令:MACSU Xmem,Ymem,src ; 无符号数与带符号数相乘并累加 ; MPYU Smem,dst ;

9、 无符号数相乘; MAC Xmem,Ymem,src ;两个带符号数数相乘并累加。32位小数乘法参考程序: ; ; This routine multiplies two Q31 signed integers; resulting in a Q30 product. The operands are fetched from data memory and ; the result is written back to data memory; data storege:; X1,X0 Q31 operand; Y1,Y0 Q31 operand; W1,W0 Q30 product; En

10、try Conditions:; SXM = 1 , OVM = 0 ; .mmregsSTACK: .usect “STACK”,100h.bss X0,1.bss X1,1.bss Y0,1.bss Y1,1.bss W0,1.bss W1,1.def start.datatable1: .word 1.word 2table2: .word 3.word 4.textstart: STM #X0,AR2 ;将 X0的首地址存入 AR2STM #Y0,AR3 ;将 Y0的首地址存入 AR2RPT #1 ;设置重复执行两次下条指令MVPD table1,*AR2+ ;将 table1开始的两

11、个值传给 X0RPT #1 ;设置重复执行两次下条指令MVPD table2,*AR3+ ;将 table1开始的两个值传给 Y0STM #X0,AR2 ;将 X0的首地址存入 AR2STM #Y1,AR3 ;将 Y1的首地址存入 AR3LD #0,A ;将 A 置 0MACSU *AR2+,*AR3-,A ; A=X0Y1MACSU *AR3+,*AR2,A ; A+=X1Y0LD A,-16,A ;将 A 左移 16位MAC *AR2,*AR3,A ; A+=X1Y1STL A,W0 ;将结果 A 的低 16位送入 W0STH A,W1 ;将结果 A 的高 16位送入 W0here: B

12、here程序分析:小数乘法与整数乘法的程序设计大致类似,不同在于小数乘法少了 X 与 Y 的低位 相乘部分,即 X0与 Y0的相乘部分。这是因为两个整数相乘时,乘积总是“向左增长”。这 意味着多次相乘后, 乘积将会很快超出定点器件的控制范围。 但是,当两个小数相乘时,乘 积总是 “向右增长”。 这就意味着超出定点器件数据范围将是我们不感兴趣的部分, 也就是 指 X0与 Y0相乘得到的结果那部分,因此可不必计算这部分乘积。有符号 /无符号整数除法参考程序 ; Description: 32 bit by 16 bit Unsigned Integer Divide And Modulus; 32

13、位除 16位的无符号整数除法.mmregsSTACK: .usect “STACK”,100h.bss d_NumL,1 ;为分子低 16位分配 1个单元.bss d_NumH,1 ;为分子高 16位分配 1个单元.bss d_Den,1 ;为分母分配 1个单元.bss d_QuotL,1 ;为商的低 16位分配 1个单元.bss d_QuotH,1 ;为商的高 16位分配 1个单元.bss d_Rem,1 ;.def DivModUI32.def start.datatable1: .word 1.word 2table2: .word 3.textDivModUI32: RSBX SXM

14、; sign extention mode offLD d_NumH,A ;将分子高位移到累加器 ARPT #(16 1 ;重复执行下一条指令 15次SUBC d_Den,A ; A 减去分母的值STL A, d_QuotH ;将 A 的值存到商的高位XOR d_QuotH,A ; 将 A 的低 16位清零OR d_NumL,A ; AL = NumLRPT #(16 1 ;重复执行下一条指令 15次SUBC d_Den,A ; A 减去分母的值STL A, d_QuotL ;将 A 的值存到商的低位STH A,d_Rem ;RETstart: STM d_NumL,AR2 ;将分子低 16位

15、所在单元的地址传给 AR2STM d_Den,AR3 ;将分母所在单元的地址传给 AR2RPT #1 ;重复执行两次下一条指令MVPD table1,*AR2+ ;将 table1开始的两个值传给 AR2MVPD table2,*AR3 ;将 table2开始的值传给 AR3CALL DivModUI32 ;调用除法子程序here: B here; Description: 16 bit by 16 bit Unsigned Integer Divide And Modulus; 16位除 16位的无符号整数除法.mmregsSTACK: .usect “STACK”,100h.bss d_N

16、um,1 ;为分子分配单元.bss d_Den,1 ;为分母分配单元.bss d_Quot,1 ;为商分配单元.bss d_Rem,1.def DivModUI16 ;定义 16位除法子程序.def start.datatable1: .word 1000table2: .word 5.textDivModUI16: RSBX SXM ; sign extention mode offLD d_Num,A ;将分子移到累加器 ARPT #(16 1 ;重复执行下面指令 16次SUBC d_Den,A ; 16次的减法循环,完成除法STL A,d_Quot ;将 A 的结果保存为商STH A,d

17、_RemRETstart: STM d_NumL,AR2 ;将分子低 16位所在单元的首地址传给 AR2STM d_Den,AR3 ;将分子低 16位所在单元的首地址传给 AR3MVPD table1,*AR2 ;将 table1开始的值传给 AR2MVPD table2,*AR3 ;将 table2开始的值传给 AR3CALL DivModUI16 ;调用除法子程序here: B here程序分析:DSP 做除法运算时,通过减法指令与重复循环指令实现无符号除法运算。需要注 意的是,当被除数的绝对值 除数的绝对 值时,商为整数。; Description: 32 bit by 16 bit s

18、igned Integer Divide And Modulus; 32位除 16位有符号除法.mmregsSTACK: .usect “STACK”,100h.bss d_NumL,1 ;为分子低 16位分配单元.bss d_NumH,1 ;为分子高 16位分配单元.bss d_Den,1 ;为分母分配单元.bss d_QuotL,1 ;为商低 16位分配单元.bss d_QuotH,1 ;为商高 16位分配单元.bss d_Rem,1.def DivModI32 ;定义 32位除法子程序.def start.datatable1: .word 1.word 2table2: .word 3

19、.textDivModI32: SSBX SXM ; sign extention mode onLD d_Den,16,A ;将分母移到累加器MPYA d_NumH ; B has sign of quotientABS A ;分母取绝对值STH A ,d_Rem ; d_Rem = abs(Den temporarilyLD d_NumH,16,A ;将分子高 16位移到 AADDS d_NumL,A ; A 加上分子低 16位ABS A ;取 A 绝对值STH A,d_QuotH ; d_QuotH = abs(NumH temporarilySTL A,d_QuotL ; d_Quot

20、L = abs(NumLtemporarilyLD d_QuotH,A ;将商的高位移到 ARPT #(16 1 ;重复执行下条指令 16次SUBC d_Rem,A ; 16次减法循环运算,完成除法STL A,d_QuotH ; AH = abs(QuotH ;XOR d_QuotH,A ; clear ALOR d_QuotL,A ; AL = abs(NumLRPT #(16 1 ;重复执行下条指令 16次SUBC d_Rem,A ; 16次减法循环运算,完成除法STL A,d_QuotL ; AL = abs(QuotLSTH A,d_Rem ; AH = RemBCD DivModI3

21、2Skip,BGEQ ; if B neg, then Quot = abs(Quot LD d_QuotH,16,A ;将商的高 16位移到 AADDS d_QuotL,A ; A 加上商的低 16位NEG A ;如果 B,则 b1b2-b1b1x1+x2=m1e +m2e e (b2-b1b1=m1+m2e e ( 。 浮点数的乘法运算 , 要经过分离指数和尾数,进行算术运算,估计结果的符号位,以及 最后的归一化存储这几个过程。 做乘法运算时要遵循乘法运算的规则把指数相加, 尾数相乘。即:12x1x2=m m e b b +(12。需要注意的是,由于 C54X 的乘法器在一个指令周期内 只

22、能完成 17bit*17bit的二进制补码运算,故相乘运算需要分步实现。浮点数的除法运算 与乘法运算浮点数的乘法运算类似, 同样要经过分离指数和尾数, 估 计结果的符号位, 对指数进行相减运算, 对尾数进行相除运算, 以及最后的归一化存储这几个过程。即:12x1x2=m m e b b -(12。不同的是,在执行除法运算的时候,需要将除 数和被除数都由 24bit 左移成 32bit 的形式,以减少误差。不管是浮点数的加减运算还是乘除运算, 完成对操作数之间的计算后就需要对结果数进 行归一化操作。 所谓归一化操作就是把数据格式转换为第一位为符号位, 紧接着的一位是非 零的数的格式。归一化完后要再把归一化后的定点数转变为浮点数。下面来以浮点数的乘法运算为例具体分析浮点数的运算过程:设是对两个数 x1和 x2进行乘法运算。将被乘数数 x1的尾数分为 Q , R 和 S 三部分, Q 表示尾数的高位的 8bit , R 和 S 表示尾数低位的两字节。同样,乘数 x2也被分为 X , Y 和 Z 三部分, X 表示尾数的高位, Y 和 Z 表示尾数低位的两字节。于是有需要注意的是,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1