基本算术运算.docx

上传人:b****1 文档编号:2528261 上传时间:2023-05-03 格式:DOCX 页数:13 大小:101.18KB
下载 相关 举报
基本算术运算.docx_第1页
第1页 / 共13页
基本算术运算.docx_第2页
第2页 / 共13页
基本算术运算.docx_第3页
第3页 / 共13页
基本算术运算.docx_第4页
第4页 / 共13页
基本算术运算.docx_第5页
第5页 / 共13页
基本算术运算.docx_第6页
第6页 / 共13页
基本算术运算.docx_第7页
第7页 / 共13页
基本算术运算.docx_第8页
第8页 / 共13页
基本算术运算.docx_第9页
第9页 / 共13页
基本算术运算.docx_第10页
第10页 / 共13页
基本算术运算.docx_第11页
第11页 / 共13页
基本算术运算.docx_第12页
第12页 / 共13页
基本算术运算.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基本算术运算.docx

《基本算术运算.docx》由会员分享,可在线阅读,更多相关《基本算术运算.docx(13页珍藏版)》请在冰点文库上搜索。

基本算术运算.docx

基本算术运算

电子科技大学通信学院

 

标准实验报告

 

(实验)课程名称DSP设计与实践

 

电子科技大学教务处制表

 

电子科技大学

实验报告

学生姓名:

学号:

指导教师:

向超

实验地点:

实验时间:

1、实验室名称:

科研楼B-341

二、实验项目名称:

基本算术运算

三、实验学时:

4

四、实验原理:

(1)定点DSP中数据表示方法

C54X是16位的定点DSP。

一个16位的二进制数既可以表示一个整数,也可以表示一个小数。

当它表示一个整数时,其最低位(D0)表示

,D1位表示

,次高位(D14)表示

如果表示一个有符号数时,最高位(D15)为符号位,0表示正数,1表示负数。

例如,07FFFH表示最大的正数32767(十进制),而0FFFFH表示最大的负数-1(负数用2的补码方式显示)。

当需要表示小数时,小数点的位置始终在最高位后,而最高位(D15)表示符号位。

这样次高位(D14)表示

,然后是

,最低位(D0)表示

所以04000H表示小数0.5,01000H表示小数

,而0001H表示16位定点DSP能表示的最小的小数(有符号)

=0.000030517578125。

在后面的实验中,除非有特别说明,我们指的都是有符号数。

在C54X中,将一个小数用16位定点格式来表示的方法是用

乘以该小数,然后取整。

从上面的分析可以看出,在DSP中一个16进制的数可以表示不同的十进制数,或者是整数,或者是小数(如果表示小数,必定小于1),但仅仅是在做整数乘除或小数乘除时,系统对它们的处理才是有所区别的,而在加减运算时,系统都当成整数来处理。

(2)实现16定点加法

C54X中提供了多条用于加法的指令,如ADD,ADDC,ADDM和ADDS。

其中ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算(如32位扩展精度加法),而ADDM专用于立即数的加法。

ADD指令的寻址方式很多,其详细使用说明请参考《TMS320C54X实用教程》。

在本实验中,我们使用下列代码来说明加法运算:

ldtemp1,a;将变量temp1装入寄存器A

addtemp2,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中的除法就是用该指令来实现的。

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。

sthb,sub_result;将相减的结果(高16位)存入变量sub_result。

(4)实现16定点整数乘法

在C54X中提供了大量的乘法运算指令,其结果都是32位,放在A或B寄存器中。

乘数在C54X的乘法指令很灵活,可以是T寄存器、立即数、存贮单元和A或B寄存器的高16位。

有关乘法指令的详细使用说明请参考《TMS320C54X实用教程》。

在C54X中,一般对数据的处理都当做有符号数,如果是无符号数乘时,请使用MPYU指令。

这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。

在本实验中,我们使用下列代码来说明整数乘法运算:

rsbxFRCT;清FRCT标志,准备整数乘

ldtemp1,T;将变量temp1装入T寄存器

mpytemp2,a;完成temp2*temp1,结果放入A寄存器(32位)

例如,当temp1=1234H(十进制的4660),temp2=9876H(十进制的-26506),乘法的结果在A寄存器中为0F8A343F8H(十进制的-123517960)。

这是一个32位的结果,需要两个内存单元来存放结果:

stha,mpy_I_h;将结果(高16位)存入变量mpy_I_h

stla,mpy_I_l;将结果(低16位)存入变量mpy_I_l

当temp1=10H(十进制的16),temp2=05H(十进制的5),乘法结果在A寄存器中为00000050H(十进制的80)。

对于这种情况,仅仅需要保存低16位即可:

stla,mpy_I_l;将结果(低16位)存入变量mpy_I_l

(5)实现16定点小数乘法

在C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。

C54X中提供了一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移移位。

但注意整数乘法时不能这样处理,所以上面的实验中一开始便将FRCT清除。

两个小数(16位)相乘后结果为32位,如果精度允许的话,可以只存高16位,将低16位丢弃,这样仍可得到16位的结果。

在本实验中,我们使用下列代码来说明小数乘法运算:

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(十进制的

=0.25)。

再如,temp1=0ccdH(十进制的0.1),temp2=0599aH(十进制的0.7),两数相乘后B寄存器的内容为08f5f0a4H(十进制的0.07000549323857)。

如果仅保存结果的高16位08f5H(十进制的0.06997680664063)。

有时为了提高精度,可以使用RND或使用MPYR指令对低16位做四舍五入的处理。

(6)实现16定点整数除法

在C54X中没有提供专门的除法指令,一般有两种方法来完成除法。

一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。

这种方法对于除以常数特别适用。

另一种方法是使用SUBC指令,重复16次减法完成除法运算。

下面我们以temp1/temp2为例,说明如何使用SUBC指令实现整数除法。

其中变量temp1为被除数,temp2为除数,结果即商存放在变量temp3中。

在完成整数除法时,先判断结果的符号。

方法是将两数相乘,保存A或B的高16位以便判断结果的符号。

然后只做两个正数的除法,最后修正结果的符号。

为了实现两个数相除,先将被除数装入A或B的低16位,接着重复执行SUBC指令,用除数重复减16次后,除法运算的商在累加器的低16位,余数在高16位。

详细代码如下:

ldtemp1,T;将被除数装入T寄存器

mpytemp2,A;除数与被除数相乘,结果放入A寄存器

ldtemp2,B;将除数temp2装入B寄存器的低16位

absB;求绝对值

stlB,temp2;将B寄存器的低16位存回temp2

ldtemp1,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_i

sthB,remain_i;将余数(B寄存器的高16位)存入变量remain_i

xorB;若两数相乘的结果为负,则商也应为负。

先将B寄存器清0

subquot_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(在B寄存器的高16位)。

(7)实现16定点小数除法

在C54X中实现16位的小数除法与前面的整数除法基本一致,也是使用循环的SUBC指令来完成。

但有两点需要注意:

第一,小数除法的结果一定是小数(小于1),所以被除数一定小于除数。

这与整数除法正好相反。

所以在执行SUBC指令前,应将被除数装入A或B寄存器的高16位,而不是低16位。

其结果的格式与整数除法一样,A或B寄存器的高16位为余数,低16位为商。

第二,与小数乘法一样,应考虑符号位对结果小数点的影响。

所以应对商右移一位,得到正确的有符号数。

其详细代码如下:

ldtemp1,T;将被除数装入T寄存器

mpytemp2,A;除数与被除数相乘,结果放入A寄存器

ldtemp2,B;将除数temp2装入B寄存器的低16位

absB;求绝对值

stlB,temp2;将B寄存器的低16位存回temp2

ldtemp1,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,-1,quot_f;将商右移一位后存入变量quot_f,右移是为了修正符号位

xorB;若两数相乘的结果为负,则商也应为负。

先将B寄存器清0

subquot_f,B;将商反号

stlB,quot_f;存回变量quot_f中

div_end:

注意,上面的C54X的16位定点有符号小数除法通用程序没有保留余数,商保存在变量temp3中。

举一个例子,当temp1=2cccH(十进制的0.35),temp2=55c2H(十进制的0.67),两数相除的结果为temp3=42dcH(十进制的0x42dc

0.52233)。

五、实验目的:

加、减、乘、除是数字信号处理中最基本的算术运算。

DSP中提供了大量的指令来实现这些功能。

本实验学习使用定点DSP实现16位定点加、减、乘、除运算的基本方法和编程技巧。

六、实验内容:

本实验需要使用C54X汇编语言实现加、减、乘、除的基本运算,并通过DES的存贮器显示窗口观察结果。

(1).编写实验程序代码

本实验的汇编源程序代码主要分为六个部分:

加法、减法、整数乘法、小数乘法、整数除法和小数除法。

每个部分后面都有一条需要加断点的标志语句:

nop

当执行到这条加了断点的语句时,程序将自动暂停。

这时你可以通过“存贮器窗口”检查计算结果。

当然你看到的结果都是十六进制的数。

实验源程序请参见第5部分。

(2).在simulator上调试运行,并观察结果

在完成实验程序代码的输入,并使用汇编批处理ASM.BAT进行编译并连接后,就可以在simulator上调试运行。

七、实验器材(设备、元器件):

计算机

8、实验步骤:

a.启动simulator实验系统软件sim54Xw.exe。

b.在调试界面的左下脚命令行栏输入loadexer1.out,或单击菜单栏下面的“Load”选项,并在弹出的FileName对话框中键入exer1.out装入基本算术运算实验程序,这时应能在“反汇编”窗口看到程序代码。

c.用鼠标选中“Memory”窗口,并在其中选择要查看的存贮器地址段:

0x080-0x08e。

d.在反汇编窗口中在每个“nop”指令处都设一个断点,方法有两种:

1.用鼠标单击该指令将其点亮即可。

2.在菜单栏中选择“Break””Add”,然后在弹出的对话框中键入欲加断点的地址即可。

e.单击菜单栏下的“Run=F5”按钮,启动执行基本算术运算程序,程序在执行完加法运算后自动暂停。

通过“CPU”窗口可以看到寄存器AHL的内容为0x46,这正是加法运算的结果。

同样,在“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=F5”按钮,程序从当前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),这正是我们希望的结果:

注意,该减法操作使用了辅助寄存器寻址,所以计算结果在B寄存器的高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,这也是一个正确的结果:

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单元)。

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.8565457(0x6da3)。

n.如果以上程序运行不正确,请检查代码是否输入正确,还可以在源代码中插入断点调试,注意对中间结果的观察。

九、实验数据及结果分析:

1)在减法操作中使用了辅助寄存器ar2,ar3,请说明在执行完减法计算后辅助寄存器ar2和ar3的值为多少?

通过实验,发现ar2的值为FFEE,ar3的值为0012

2)在小数乘法中使用了置FRCT标志为1的指令。

如果将该语句取消,那么B寄存器

的结果是多少?

想想什么时候应该设置FRCT标志?

B寄存器的结果是FFDAA40000.

3)如何实现无符号数的乘法?

利用带符号的乘法可以实现无符号数的乘法

4)请利用本实验程序计算以下算式的结果

0.25*0.583740.25/0.54653/3450.789687/0.876

运行程序:

所以,0.25*0.58374=12AE

所以,0.25/0.5=7EEF

所以,4653/345=000D

所以,0.789687/0.876=7362

十、实验结论:

十一、总结及心得体会:

十二、对本实验过程及方法、手段的改进建议:

报告评分:

指导教师签字:

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2