dsp实验1-基本算数运算课案.docx

上传人:苏美尔 文档编号:12102206 上传时间:2021-12-01 格式:DOCX 页数:10 大小:23.53KB
返回 下载 相关 举报
dsp实验1-基本算数运算课案.docx_第1页
第1页 / 共10页
dsp实验1-基本算数运算课案.docx_第2页
第2页 / 共10页
dsp实验1-基本算数运算课案.docx_第3页
第3页 / 共10页
dsp实验1-基本算数运算课案.docx_第4页
第4页 / 共10页
dsp实验1-基本算数运算课案.docx_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《dsp实验1-基本算数运算课案.docx》由会员分享,可在线阅读,更多相关《dsp实验1-基本算数运算课案.docx(10页珍藏版)》请在三一文库上搜索。

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

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

3、小于1),但仅仅是在做整数乘除或小数乘除时,系统对它们的处理才是有所区别的,而在加减运算时,系统都当成整数来处理。(2)实现16定点加法C54X中提供了多条用于力口法的指令,如ADD , ADDC , ADDM 和ADDS 。其中ADDS用于无符号数的加法运算, ADDC 用于带进位的加法运算 (如 32 位扩展精度加法) , 而 ADDM专用于立即数的加法。 ADD 指令的寻址方式很多,其详细使用说明请参考 TMS320C54X实用教程 。在本实验中,我们使用下列代码来说明加法运算:ld temp1,a ;将变量 temp1 装入寄存器 Aadd temp2,a ;将变量 temp2 与寄存

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

5、 指令一样,有许多的寻址方式,其详细使用说明请参考 TMS320C54X 实用教程 。在本实验中,我们使用下列代码来说明减法运算:stm #temp1,ar3stm #temp3,ar2sub *ar2+, *ar3,bsth b,sub_resulttemp1 的地址装入ar3 寄存器temp3 的地址装入ar3 寄存器temp3 左移 16 位同时变量temp1 也左移 16 位,然后B (高 16位)中,同时ar2 加 1。16位)存入变量sub_result。4 )实现 16 定点整数乘法在 C54X 中提供了大量的乘法运算指令,其结果都是32 位,放在 A 或 B 寄存器中。乘数在

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

7、234H (十进制的 4660) , temp2=9876H (十进制的 -26506) ,乘法的结果在 A 寄存器中为 0F8A343F8H (十进制的 -123517960)。这是一个32 位的结果,需要两个内存单元来存放结果:sth a,mpy_I_h ;将结果(高16位)存入变量 mpy_I_h stl a,mpy_I_l ;将结果(低16位)存入变量 mpy_I_l当temp1=10H (十进制的16), temp2=05H (十进制的 5),乘法结果在 A寄存器中为 00000050H (十进制的80)。对于这种情况,仅仅需要保存低16位即可:stl a,mpy_I_l ;将结果(

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

9、变量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 (十进制的0.07000549323857 )。如果仅保存结果的高 16 位08f5H (十进制的0.0699768066

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

11、然后只做两个正数的除法,最后修正结果的符号。为了实现两个数相除,先将被除数装入A或B的低16位,接着重复执行SUBC指令,用除数重复减 16次后,除法运算的商在累加器的低16位,余数在高16位。详细代码如下:ldtemp1,T;将被除数装入 T 寄存器mpytemp2,A;除数与被除数相乘,结果放入 A 寄存器ldtemp2,B;将除数temp2 装入 B 寄存器的低 16位absB;求绝对值stlB,temp2;将 B 寄存器的低16 位存回 temp2ldtemp1,B;将被除数temp1 装入 B 寄存器的低16 位absB;求绝对值rpt#15;重复SUBC 指令 16次subctem

12、p2,b;使用 SUBC 指令完成除法运算bcddiv_end,agt;延时跳转,先执行下面两条指令,然后判断A ,若 A>0 ,则;跳转到标号div_end ,结束除法运算stlB,quot_i;将商( B 寄存器的低 16 位)存入变量quot_isthB,remain_i;将余数( B 寄存器的高16 位)存入变量remain_ixorB;若两数相乘的结果为负,则商也应为负。先将B 寄存器清0subquot_i,B;将商反号stlB,quot_i;存回变量quot_i 中div_end:上面给出的是整数除法的通用程序, 在实际应用中可以根据具体情况做简化。 如正数除法可以直接将被除

13、数tempi装入B寄存器的低16位,然后用SUBC指令循环减除数temp2,减完后 B 寄存器中低16位为商, 高 16 位为余数, 不用判断符号, 从而节省时间。 例如 temp1=10H(十进制的16) , temp2=5 ,两数相除后商为3(在B 寄存器的低16 位) ,余数为1(在B寄存器的高 16 位) 。(7) 实现 16定点小数除法在 C54X 中实现 16 位的小数除法与前面的整数除法基本一致, 也是使用循环的 SUBC指令来完成。但有两点需要注意:第一,小数除法的结果一定是小数(小于1) ,所以被除数一定小于除数。这与整数除法正好相反。所以在执行SUBC 指令前,应将被除数装

14、入 A或 B 寄存器的高16 位,而不是低 16 位。其结果的格式与整数除法一样, A 或 B 寄存器的高 16 位为余数, 低 16位为商。 第二, 与小数乘法一样, 应考虑符号位对结果小数点的影响。所以应对商右移一位,得到正确的有符号数。其详细代码如下:ldtemp1,Tmpytemp2,Aldtemp2,BabsBstlB,temp2T 寄存器A 寄存器temp2 装入 B 寄存器的低 16位;求绝对值B 寄存器的低16 位存回 temp2temp1 装入 B 寄存器的高16位ldtemp1,16, B ;将被除数absB ;求绝对值rpt#15subctemp2,band#0ffffh

15、,Bbcddiv_end,agtstlB,-1 , quot_fxorBsubquot_f,BstlB,quot_f;重复SUBC指令16次;使用SUBC指令完成除法运算;将B寄存器的高16位清为0。这时余数被丢弃,仅保留商;延时跳转,先执行下面两条指令,然后判断A,若A>0,则;跳转到标号div_end,结束除法运算;将商右移一位后存入变量quot_f,右移是为了修正符号位;若两数相乘的结果为负,则商也应为负。先将B寄存器清0;将商反号;存回变量quot_f中div_end:注意,上面的 C54X的16位定点有符号小数除法通用程序没有保留余数,商保存在变量temp3 中。举一个例子,当

16、 temp1=2cccH (十进制的 0.35), temp2=55c2H (十进制的 0.67), 两数相除的结果为 temp3=42dcH (十进制的0x42dc + 215 =0.52233)。五、实验目的:用定点DS际现16位定点加、减、乘、除运算的基本方法和编程技巧。六、实验内容:本实验需要使用 C54X汇编语言实现加、减、乘、除的基本运算,并通过DES的存贮器显示窗口观察结果。实验分两步完成:(1) .编写实验程序代码本实验的汇编源程序代码主要分为六个部分:加法、减法、整数乘法、小数乘法、整数 除法和小数除法。每个部分后面都有一条需要加断点的标志语句:nop当执行到这条加了断点的语

17、句时,程序将自动暂停。这时你可以通过“存贮器窗口”检查计算结果。当然你看到的结果都是十六进制的数。实验源程序请参见第5部分。(2) .在simulator上调试运行,并观察结果七、实验器材(设备、元器件):Windows7系统计算机,CCS软件3.3版本八、实验步骤:在完成实验程序代码的输入,并使用汇编批处理ASM.BAT进行编译并连接后,就可以在simulator上调试运行。步骤如下:a.启动simulator实验系统软件 sim54Xw.exe。b.在调试界面的左下脚命令行栏输入load exerl.out,或单击菜单栏下面的"Load"选项,并在弹出的File Nam

18、e对话框中键入exelout装入基本算术运算实验程序,这时应能在“反汇编”窗口看到程序代码。c.用鼠标选中"Memory”窗口,并在其中选择要查看的存贮器地址段:0x080 0x08e。d.在反汇编窗口中在每个“ nop”指令处都设一个断点,方法有两种:1.用鼠标单击该指令将其点亮即可。2.在菜单栏中选择“ Break" " Add'然后在弹出的对话框中键入欲加断 点的地址即可。e.单击菜单栏下的“ Run=F5”按钮,启动执行基本算术运算程序,程序在执行完加法 运算后自动暂停。通过“ CPU”窗口可以看到寄存器 AHL的内容为0x46,这正是加法运算 的

19、结果。同样,在“Memory窗口中,可以看到0x81,0x82,0x88的内容为分别为 0012,0034,0x46。执行加法运算后,将 0x81和0x82的内容相力口,结果放在0x88单元。f.在“Memory ”窗口中用鼠标左键双击 0x81单元,这时可以修改该内存单元的内容。 输入新的数据 0x0ffee (十进制的-18),编辑内容时请直接输入FFEE (十六进制),然后回车确认,便完成对 0x81单元的修改。g.在“CPU”窗口中修改PC值,方法也是鼠标左键双击PC寄存器的内容,输入新的PC值0x1805 (编辑内容时直接输入1805),并用回车键确认。h.单击菜单栏下的“Run=F

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

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

22、: 8192*52=425984 ( 0x68000) 。此时将无法用一个16位的存贮单元来保存A寄存器中的结果。k. 单击“ Run=F5 ”按钮,程序从当前PC 继续运行,完成小数乘法运算。当程序再次暂停时(断点位于0x1826 ) ,可以看到 0x83 和 0x84 单元的内容分别为 4000 和 b548 , A 寄存器的内容为40000000,乘法的结果在 B寄存器中为daa40000,这正是我们希望的结果:0.5*(-0.58374)=-0.29187(0x0daa4) 。对于小数乘法,一般情况都可以用 1 个 16 位的内容单元将 B 寄存器的高16保存(如存入 0x8c 单元)

23、 。1 .单击“ 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.8565457(

24、0x6da3) 。n. 如果以上程序运行不正确,请检查代码是否输入正确,还可以在源代码中插入断点调试,注意对中间结果的观察。八、思考题( 1 )在减法操作中使用了辅助寄存器ar2 , ar3 ,请说明在执行完减法计算后辅助寄存器ar2和 ar3 的值为多少?答:观察寄存器 ar2 , ar3 其值均为都为 0084( 2 )在小数乘法中使用了置FRCT 标志为 1 的指令。如果将该语句取消,那么 B 寄存器的结果是多少?想想什么时候应该设置FRCT 标志?答:取消该语句以后结果为 FFED520000 , FRCT 标志需要在小数乘法的时候设置。( 3 )如何实现无符号数的乘法?代码如下:st

25、 #1000h,temp1st #8000h,temp2rsbx FRCT1d temp1,Tmpyu temp2,aA=0008000000( 4 )请利用本实验程序计算以下算式的结果?0.25*0.58374=0x12adQ15st #2000h,temp3st #0x4AB7,temp40.5/0.25 = 0x7ff7 Q14st #2000h,temp1st #1000h,temp2; init temp1 & temp2,0.5/0.58374=0.8565457(0x6da3)4653/345 =0xdst #4653,temp1st #345,temp2; init temp1 & temp2,52/-18= -2(0xfffe) mod 16(0x10)0. 789687/0.876 =0x7363Q15九、实验结论:通过本实验,初步的了解到在DSP中一个16进制数的表示方法,以及如何对数进行定点运算。并且利用C54X定点DSPS行小数,整数的加、减、乘、除等基本运算,掌握了基本方法和如何使用编程语言进行计算。十、总结及心得体会: 无十二、对本实验过程及方法、手段的改进建议:无报告评分:指导教师签字:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


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