实验二基本算数运算

  • 格式:doc
  • 大小:499.50 KB
  • 文档页数:9

实验二基本算数运算

2.1 实验目的和要求

加、减、乘、除是数字信号处理中最基本的算术运算。DSP 中提供了大量的指令来实现这些功能。本实验学习使用定点DSP 实现16 位定点加、减、乘、除运算的基本方法和编程技巧。本实验的演示文件为exer1.out。

2.2 实验原理

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

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

2) 实现 16 位定点加法

C54X 中提供了多条用于加法的指令,如ADD,ADDC,ADDM 和ADDS。其中ADDS 用于无符号数的加法运算,ADDC 用于带进位的加法运算(如32 位扩展精度加法),而ADDM 专用于立即数的加法。加法运算:ld temp1,a ;将变量temp1 装入寄存器Aadd temp2,a ;将变量temp2

与寄存器A 相加,结果放入A 中stl a,add_result ;将结果(低16

位)存入变量add_result 中。

3) 实现 16 位定点减法

C54X 中提供了多条用于减法的指令,如SUB,SUBB,SUBC 和SUBS。其中SUBS用于无符号数的减法运算,SUBB 用于带进位的减法运算(如32 位扩展精度的减法),而SUBC 为移位减,DSP 中的除法就是用该指令来实现的。

减法运算:

stm #temp1,ar3 ;将变量temp1 的地址装入ar3 寄存器

stm #temp3,ar2 ;将变量temp3 的地址装入ar2 寄存器

sub *ar2+, *ar3,b ;将变量temp3 左移16 位同时变量temp1 也左移16 位,然后;相减,结果放入寄存器 B(高16 位)中,同时ar2 加1。

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

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

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

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

寄存器的高16 位。

整数乘法运算:

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

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

mpy temp2,a ;完成temp2*temp1,结果放入A 寄存器

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

在 C54X 中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,

其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。C54X

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

整数乘法时不能这样处理,所以上面的实验中一开始便将FRCT 清除。两个小数(16 位)

相乘后结果为32 位,如果精度允许的话,可以只存高16 位,将低16

位丢弃,这样仍可

得到16 位的结果。

小数乘法运算:

ssbx FRCT ;FRCT=1,准备小数乘法

ld temp1,16,a ;将变量temp1 装入寄存器A 的高16 位

mpya temp2 ;完成temp2 乘寄存器A 的高16 位,结果在B 中,同时

;将 temp2 装入T 寄存器

sth b,mpy_f ;将乘积结果的高16 位存入变量mpy_f

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

在 C54X 中没有提供专门的除法指令,一般有两种方法来完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。另一种方法是使用SUBC 指令,重复16 次减法完成除法运算。

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

在 C54X 中实现16 位的小数除法与前面的整数除法基本一致,也是使用循环的SUBC 指令来完成。但有两点需要注意:第一,小数除法的结果一定是小数(小于1),所以被除数一定小于除数。这与整数除法正好相反

2.3 实验内容

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

1) 编写实验程序代码

本实验的汇编源程序代码主要分为六个部分:加法、减法、整数乘法、小数乘法、整数除法和小数除法。每个部分后面都有一条需要加断点的标志语句: nopDES320PP-U 数字信号处理仿真/教学实验系统使用与实验指导 32当执行到这条加了断点的语句时,程序将自动暂停。这时你可以通过“存贮器窗口”检查计算结果。当然你看到的结果都是十六进制的数。实验源程序请参见附录。

2) 用 ccs simulator 调试运行并观察结果

在完成实验程序代码的输入,并使用 ccs 进行编译并连接,得到out 文件后,就可以在simulator 上调试运行。步骤如下:

a. 启动 ccs simulator。

b. 点击 file ->load program,找到exer1.out 并装入。这时可在反汇编窗口看到程序代码。

c. 打开“Memory”窗口,并在其中选择要查看的存贮器地址段:0x080-0x08e。

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

指令将其点亮即可。2.在菜单栏中选择debugbreakpoint,然后在弹出的对话框中

键入欲加断点的地址即可(注意地址的格式)。

e. 单击 Run 快捷键(或者F5 按钮),启动执行基本算术运算程序,程序在执行完加法

运算后自动暂停。通过register window 窗口可以看到寄存器A

的内容为0x46,这正

是加法运算的结果。同样,在Memory 窗口中,可以看到0x81,0x82,0x88 的内容为

分别为0012,0034,0x46。执行加法运算后,将0x81 和0x82 的内容相加,结果放在

0x88 单元。

f. 在 Memory 窗口中用鼠标左键双击0x81 单元,这时可以修改该内存单元的内容。输

入新的数据0x0ffee(十进制的-18),编辑内容时请直接输入FFEE(十六进制),然

后回车确认,便完成对0x81 单元的修改。

g. 在 register window 窗口中修改PC 值,方法也是鼠标左键双击PC 寄存器的内容,输

入新的PC 值0x1085(编辑内容时直接输入1805),并用回车键确认。

h. 单击 Run 快捷键(或者F5 按钮),程序从当前PC 继续运行,重新计算0x81 和0x82

的和,结果在0x88 中。当程序再次暂停时,可以看到A 寄存器和0x88 的内容为0x22

(十进制的34),这正是我们希望的结果:-18+52=34。

i. 单击“Run=F5”按钮,程序从当前PC 继续运行,完成减法运算。当程序再次暂停

时(断点位于0x1093),可以看到0x83 和0x84 单元的内容分别为FFEE 和0012,B

寄存器的内容为ffdc0000,而0x89 的内容为0xffdc(十进制-36),__________这正是我们希望

的结果:−18 −18 = −36。注意,该减法操作使用了辅助寄存器寻址,所以计算结

果在B 寄存器的高16 位。

j. 单击 Run 快捷键(或者F5 按钮),程序从当前PC 继续运行,完成整数乘法运算。

DES320PP-U 数字信号处理仿真/教学实验系统使用与实验指导

33

当程序再次暂时(断点位于0x109d),可以看到0x81 和0x82 单元的内容分别为0012

和0034,A 寄存器的内容为000003A8,这正是我们希望的结果:18*52=936(0x3a8)。

这时我们可以用1 个16 位的内容单元来保存结果,如将A寄存器的低16 位存入0x8b

单元。但如果将0x81 的内容修改为0x2000(十进制的8192),在register window 中

将PC 修改为1098,然后继续运行,重新计算乘法。当程序完成乘法暂停时,可以

看到A 寄存器的内容为00068000,这也是一个正确的结果:8192*52=425984

(0x68000)。此时将无法用一个16 位的存贮单元来保存A 寄存器中的结果。

k. 单击 Run 快捷键或者(F5 按钮),程序从当前PC 继续运行,完成小数乘法运算。

当程序再次暂停时(断点位于0x10A6),可以看到0x83 和0x84 单元的内容分别为

4000 和b548,A 寄存器的内容为40000000,乘法的结果在B 寄存器中为daa40000,

这正是我们希望的结果:0.5*(-0.58374)=-0.29187(0x0daa4)。对于小数乘法,一般情

况都可以用1 个16 位的内容单元将B 寄存器的高16 保存(如存入0x8c 单元)。

l. 单击 Run 快捷键(或者F5 按钮),程序从当前PC 继续运行,完成整数除法运算。

当程序再次暂时(断点位于0x10bb),可以看到0x81,0x82,0x8d

和0x8e 单元的内容

分别为0034,0012,FFFE 和0010,这正是我们希望的结果:52 除以-18,商为

-2(0xfffe) ,余数为16(0x10)。

m. 单击 Run 快捷键(或者F5 按钮),程序从当前PC 继续运行,完成小数除法运算。

当程序再次暂停时(断点位于0x10d2),可以看到0x81,0x82 和0x8f 单元的内容分别为4000,4ab8 和6da3,这正是我们希望的结果0.5/0.58374=0.8565457(0x6da3)。

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

2.4 思考题

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

ar2 和ar3 的值为多少?

2) 在小数乘法中使用了置 FRCT 标志为1 的指令。如果将该语句取消,那么B 寄存器

的结果是多少?想想什么时候应该设置FRCT 标志?

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

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

0.25*0.58374 0.5/0.25 4653/345 0.789687/0.876