dsp实验1-基本算数运算_第1页
dsp实验1-基本算数运算_第2页
dsp实验1-基本算数运算_第3页
dsp实验1-基本算数运算_第4页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、电子科技大学通信与信息工程学院标准实验报告(实验)课程名称DSP 设计与实现电子科技大学教务处制表电子科技大学实验报告一、实验室名称: DSP 实验室二、实验项目名称: 基本算术运算三、实验学时: 4四、实验原理:(1) 定点 DSP 中数据表示方法C54X是 16 位的定点DSP。一个 16 位的二进制数既可以表示一个整数,也可以表示一个小数。当它表示一个整数时,其最低位(D0)表示 20 , D1 位表示 21 ,次高位( D14)表示 214 。如果表示一个有符号数时,最高位(D15)为符号位, 0 表示正数, 1 表示负数。例如,07FFFH表示最大的正数32767(十进制),而 0F

2、FFFH表示最大的负数-1 (负数用2 的补码方式显示) 。当需要表示小数时,小数点的位置始终在最高位后,而最高位(D15)表示符号位。这样次高位(D14)表示 2 1 ,然后是 2 2 ,最低位( D0)表示 2 15 。所以 04000H 表示小数 0.5 , 01000H 表示小数 2 30.125 ,而 0001H 表示 16 位定点 DSP能表示的最小的小数(有符号)2 15 =0.000030517578125 。在后面的实验中,除非有特别说明,我们指的都是有符号数。 在 C54X中,将一个小数用16 位定点格式来表示的方法是用215 乘以该小数,然后取整。从上面的分析可以看出,在

3、DSP中一个 16 进制的数可以表示不同的十进制数,或者是整数,或者是小数(如果表示小数,必定小于1),但仅仅是在做整数乘除或小数乘除时,系统对它们的处理才是有所区别的,而在加减运算时,系统都当成整数来处理。(2) 实现 16 定点加法C54X 中提供了多条用于加法的指令,如 ADD ,ADDC ,ADDM和 ADDS 。其中 ADDS用于无符号数的加法运算,ADDC 用于带进位的加法运算 (如 32 位扩展精度加法) ,而 ADDM专用于立即数的加法。ADD指令的寻址方式很多,其详细使用说明请参考TMS320C54X实用教程。在本实验中,我们使用下列代码来说明加法运算:ldtemp1,a;将

4、变量temp1 装入寄存器Aadd temp2,a;将变量temp2 与寄存器A 相加,结果放入A 中stla,add_result;将结果(低16 位)存入变量add_result 中。注意,这里完成计算temp3=temp1+temp2 ,我们没有特意考虑temp1 和temp2 是整数还是小数,在加法和下面的减法中整数运算和定点的小数运算都是一样的。(3) 实现16 位定点减法C54X中提供了多条用于减法的指令,如SUB , SUBB , SUBC和SUBS 。其中SUBS用于无符号数的减法运算,SUBB用于带进位的减法运算(如32 位扩展精度的减法) ,而SUBC为移位减,DSP中的除

5、法就是用该指令来实现的。SUB指令与ADD指令一样,有许多的寻址方式,其详细使用说明请参考TMS320C54X 实用教程。在本实验中,我们使用下列代码来说明减法运算:stm #temp1,ar3;将变量 temp1 的地址装入 ar3 寄存器stm #temp3,ar2;将变量 temp3 的地址装入 ar3 寄存器sub *ar2+, *ar3,b;将变量 temp3 左移 16位同时变量 temp1 也左移16 位,然后;相减,结果放入寄存器B(高 16 位)中,同时 ar2 加 1。sth b,sub_result;将相减的结果(高 16位)存入变量 sub_result。(4) 实现

6、16 定点整数乘法在 C54X 中提供了大量的乘法运算指令,其结果都是32 位,放在A 或 B 寄存器中。乘数在 C54X 的乘法指令很灵活,可以是T 寄存器、立即数、存贮单元和A 或 B 寄存器的高16 位。有关乘法指令的详细使用说明请参考TMS320C54X实用教程。在 C54X中,一般对数据的处理都当做有符号数,如果是无符号数乘时,请使用MPYU指令。这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。在本实验中,我们使用下列代码来说明整数乘法运算:rsbx FRCTldtemp1,Tmpy temp2,a;清 FRCT 标志,准备整数乘;将变量temp1 装入 T 寄存

7、器;完成 temp2*temp1 ,结果放入A 寄存器(32 位)例如,当 temp1=1234H (十进制的4660),temp2=9876H(十进制的 -26506),乘法的结果在 A 寄存器中为 0F8A343F8H (十进制的 -123517960 )。这是一个 32 位的结果,需要两个内存单元来存放结果:stha,mpy_I_h;将结果(高16 位)存入变量mpy_I_hstla,mpy_I_l;将结果(低16 位)存入变量mpy_I_l当 temp1=10H (十进制的16), temp2=05H (十进制的5),乘法结果在A 寄存器中为00000050H (十进制的80)。对于这

8、种情况,仅仅需要保存低16 位即可:stla,mpy_I_l;将结果(低16 位)存入变量mpy_I_l(5) 实现 16 定点小数乘法在 C54X 中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。C54X中提供了一个状态位FRCT ,将其设置为1 时,系统自动将乘积结果左移移位。但注意整数乘法时不能这样处理,所以上面的实验中一开始便将FRCT 清除。两个小数(16 位)相乘后结果为32 位,如果精度允许的话,可以只存高16 位,将低16 位丢弃,这样仍可得到 16 位的结果。在本实验中,我们使用下列代码来

9、说明小数乘法运算:ssbxFRCT; FRCT=1 ,准备小数乘法ldtemp1,16,a;将变量 temp1 装入寄存器 A 的高 16 位mpyatemp2;完成 temp2 乘寄存器 A 的高 16 位,结果在 B 中,同时;将 temp2 装入 T 寄存器sthb,mpy_f;将乘积结果的高 16 位存入变量 mpy_f例如,temp1=temp2=4000H (十进制的0.5 ),两数相乘后结果为20000000 (十进制的22=0.25)。再如,temp1=0ccdH (十进制的0.1),temp2=0599aH (十进制的0.7),两数相乘后 B 寄存器的内容为08f5f0a4H

10、 (十进制的0.07000549323857 )。如果仅保存结果的高16位 08f5H(十进制的 0.06997680664063)。有时为了提高精度, 可以使用 RND 或使用 MPYR指令对低16 位做四舍五入的处理。(6) 实现 16 定点整数除法在 C54X 中没有提供专门的除法指令,一般有两种方法来完成除法。一种是用乘法来代替, 除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。 这种方法对于除以常数特别适用。另一种方法是使用 SUBC 指令,重复 16 次减法完成除法运算。下面我们以temp1/temp2 为例,说明如何使用SUBC 指令实现整数除法。 其中变量 temp1

11、为被除数,temp2为除数,结果即商存放在变量 temp3 中。在完成整数除法时, 先判断结果的符号。 方法是将两数相乘, 保存 A 或 B 的高 16 位以便判断结果的符号。然后只做两个正数的除法, 最后修正结果的符号。为了实现两个数相除,先将被除数装入 A 或 B 的低 16 位,接着重复执行指令,用除数重复减 16 次后,除法运算的商在累加器的低 16 位,余数在高 16 位。 SUBC详细代码如下:ldtemp1,T;将被除数装入 T 寄存器mpytemp2,A;除数与被除数相乘,结果放入A 寄存器ldtemp2,B;将除数 temp2 装入 B 寄存器的低 16 位absB;求绝对值

12、stlB,temp2;将 B 寄存器的低 16 位存回 temp2ldtemp1,B;将被除数 temp1 装入 B 寄存器的低 16 位absB;求绝对值rpt#15;重复 SUBC 指令 16 次subctemp2,b;使用 SUBC 指令完成除法运算bcddiv_end,agt;延时跳转,先执行下面两条指令,然后判断A ,若 A>0 ,则;跳转到标号 div_end,结束除法运算stlB,quot_i;将商( B 寄存器的低 16 位)存入变量 quot_isthB,remain_i;将余数( B 寄存器的高 16 位)存入变量 remain_ixorB;若两数相乘的结果为负,则商

13、也应为负。先将B 寄存器清 0subquot_i,B;将商反号stlB,quot_i;存回变量 quot_i 中div_end:上面给出的是整数除法的通用程序, 在实际应用中可以根据具体情况做简化。 如正数除法可以直接将被除数 temp1 装入 B 寄存器的低 16 位,然后用 SUBC 指令循环减除数 temp2,减完后 B 寄存器中低16 位为商,高 16 位为余数,不用判断符号, 从而节省时间。 例如 temp1=10H(十进制的 16), temp2=5,两数相除后商为 3(在 B 寄存器的低 16 位),余数为 1(在寄存器的高 16 位)。B(7) 实现 16 定点小数除法在 C5

14、4X 中实现 16 位的小数除法与前面的整数除法基本一致, 也是使用循环的 SUBC 指令来完成。但有两点需要注意:第一,小数除法的结果一定是小数(小于 1),所以被除数一定小于除数。这与整数除法正好相反。所以在执行 SUBC 指令前,应将被除数装入 A 或 B 寄存器的高 16 位,而不是低 16 位。其结果的格式与整数除法一样, A 或 B 寄存器的高 16 位为余数, 低 16 位为商。 第二,与小数乘法一样, 应考虑符号位对结果小数点的影响。所以应对商右移一位,得到正确的有符号数。其详细代码如下:ldtemp1,T;将被除数装入 T 寄存器mpytemp2,A;除数与被除数相乘,结果放

15、入A 寄存器ldtemp2,B;将除数 temp2 装入 B 寄存器的低16 位absB;求绝对值stlB,temp2;将 B 寄存器的低 16 位存回 temp2ldtemp1,16, B ;将被除数 temp1 装入 B 寄存器的高16 位absB;求绝对值rpt#15;重复 SUBC 指令 16 次subctemp2,b;使用 SUBC 指令完成除法运算and#0ffffh,B;将 B 寄存器的高 16 位清为 0。这时余数被丢弃,仅保留商bcddiv_end,agt;延时跳转,先执行下面两条指令,然后判断A ,若 A>0 ,则;跳转到标号 div_end,结束除法运算stlB,-

16、1 ,quot_f;将商右移一位后存入变量quot_f ,右移是为了修正符号位xorB;若两数相乘的结果为负,则商也应为负。先将B 寄存器清 0subquot_f,B;将商反号stlB,quot_f;存回变量 quot_f 中div_end:注意,上面的C54X 的 16 位定点有符号小数除法通用程序没有保留余数,商保存在变量temp3 中。举一个例子,当 temp1=2cccH(十进制的 0.35),temp2=55c2H (十进制的 0.67 ),两数相除的结果为 temp3=42dcH (十进制的 0x42dc 215 0.52233 )。五、实验目的:用定点 DSP实现 16 位定点加

17、、减、乘、除运算的基本方法和编程技巧。六、实验内容:本实验需要使用C54X 汇编语言实现加、减、乘、除的基本运算,并通过DES 的存贮器显示窗口观察结果。实验分两步完成:(1) .编写实验程序代码本实验的汇编源程序代码主要分为六个部分:加法、减法、整数乘法、小数乘法、整数除法和小数除法。每个部分后面都有一条需要加断点的标志语句:nop当执行到这条加了断点的语句时,程序将自动暂停。这时你可以通过“存贮器窗口”检查计算结果。当然你看到的结果都是十六进制的数。实验源程序请参见第5 部分。( 2) .在 simulator 上调试运行,并观察结果七、实验器材(设备、元器件) :Windows7 系统计

18、算机, CCS 软件 3.3 版本八、实验步骤:在完成实验程序代码的输入,并使用汇编批处理ASM.BA T进行编译并连接后,就可以在simulator上调试运行。步骤如下:a. 启动simulator实验系统软件sim54Xw.exe 。b. 在调试界面的左下脚命令行栏输入load exer1.out,或单击菜单栏下面的“Load”选项,并在弹出的File Name 对话框中键入exer1.out 装入基本算术运算实验程序,这时应能在“反汇编”窗口看到程序代码。c. 用鼠标选中 “Memory ”窗口, 并在其中选择要查看的存贮器地址段:0x080 0x08e。d. 在反汇编窗口中在每个“no

19、p”指令处都设一个断点,方法有两种:1.用鼠标单击该指令将其点亮即可。2.在菜单栏中选择“Break” ”Add”,然后在弹出的对话框中键入欲加断点的地址即可。e. 单击菜单栏下的“运算后自动暂停。通过“Run=F5 ”按钮,启动执行基本算术运算程序,程序在执行完加法CPU”窗口可以看到寄存器AHL的内容为0x46 ,这正是加法运算的 结 果 。 同 样 , 在 “ Memory” 窗 口 中 , 可 以 看 到0x81,0x82,0x88的内容为分别为0012,0034,0x46 。执行加法运算后,将0x81和0x82 的内容相加,结果放在0x88 单元。f. 在“ Memory ”窗口中用

20、鼠标左键双击0x81单元,这时可以修改该内存单元的内容。输入新的数据0x0ffee (十进制的-18),编辑内容时请直接输入FFEE (十六进制),然后回车确认,便完成对0x81 单元的修改。g. 在“ CPU ” 窗口中修改PC 值,方法也是鼠标左键双击PC 寄存器的内容,输入新的 PC 值 0x1805 (编辑内容时直接输入1805),并用回车键确认。h. 单击菜单栏下的 “ Run=F5 ”按钮,程序从当前PC 继续运行, 重新计算0x81 和 0x82的和,结果在0x88 中。当程序再次暂停时,可以看到AHL寄存器和0x88 的内容为0x22(十进制的34),这正是我们希望的结果:-1

21、8+52=34 。i. 单击“Run=F5 ”按钮,程序从当前PC 继续运行,完成减法运算。当程序再次暂时(断点位于0x1813 ),可以看到0x83内容 为ffdc0000 , 而0x89的内容和 为0x84 单元的内容分别为FFEE 和 0012,Bffdc (十进制-36 ),这正是我们希望的寄存器的结果:181836 。注意,该减法操作使用了辅助寄存器寻址,所以计算结果在B 寄存器的高16位。j. 单击“ Run=F5 ”按钮,程序从当前PC 继续运行,完成整数乘法运算。当程序再次暂时(断点位于 0x181d),可以看到 0x81 和 0x82单元的内容分别为0012 和 0034,

22、A寄存器的内容为 000003A8 ,这正是我们希望的结果:18*52=936(0x3a8) 。这时我们可以用1 个16 位的内容单元来保存结果,如将 A 寄存器的低16 位存入 0x8b 单元。 但如果将 0x81 的内容修改为 0x2000(十进制的8192),在“ CPU 窗口”中将 PC 修改为1818,然后继续运行,重新计算乘法。当程序完成乘法暂停时,可以看到A 寄存器的内容为00068000,这也是一个正确的结果:8192*52=425984 ( 0x68000)。此时将无法用一个16 位的存贮单元来保存A寄存器中的结果。k. 单击“ Run=F5 ”按钮,程序从当前 PC 继续运

23、行,完成小数乘法运算。当程序再次暂停时(断点位于0x1826),可以看到0x83 和0x84单元的内容分别为4000 和b548,A寄存器的内容为40000000,乘法的结果在B 寄存器中为daa40000,这正是我们希望的结果:0.5*(-0.58374)=-0.29187(0x0daa4)。对于小数乘法,一般情况都可以用1个16位的内容单元将 B 寄存器的高16 保存(如存入0x8c单元)。l. 单击“ Run=F5 ”按钮,程序从当前PC 继续运行,完成整数除法运算。当程序再次暂时(断点位于0x183b),可以看到 0x81,0x82,0x8d 和 0x8e 单元的内容分别为0034,0012,FFFE和 0010,这正是我们希望的结果:52 除以 -18,商为 -2(0xfffe),余数为 16(0x10) 。m. 单击“ Run=F5”按钮,程序从当前 PC 继续运行,完成小数除法运算。当程序再次暂停时(断点位于0x1852 ),可以看到 0x81,0x82 和 0x8f 单元的内容分别为4000,4ab8 和 6da3,这正是我们希望的结果:0.5/0.58374=0.8

温馨提示

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

评论

0/150

提交评论