DSP实验指导书及其思考题答案(2)

2018-12-29 19:33

或小数乘除时,系统对它们的处理才是有所区别的,而在加减运算时,系统都当成整数来处理。 2﹑实现16定点加法

C54X中提供了多条用于加法的指令,如ADD,ADDC,ADDM和ADDS。其中ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算(如32位扩展精度加法),而ADDM专用于立即数的加法。在本实验中,我们可以使用下列代码来说明加法运算:

ld temp1,a add temp2,a

;将变量temp1装入寄存器A

;将变量temp2与寄存器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指令一样,有许多的寻址方式,其详细使用说明请查阅TI文档。在本实验中,我们可以使用下列代码来说明减法运算:

stm #temp1,ar3 stm #temp3,ar2

;将变量temp1的地址装入ar3寄存器 ;将变量temp3的地址装入ar3寄存器

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位。在C54X中,一般对数据的处理都当做有符号数,如果是无符号数乘时,请使用MPYU指令。这是一条专用于无符号数乘法运算的

2

指令,而其它指令都是有符号数的乘法。在本实验中,我们使用下列代码来说明整数乘法运算:

rsbx FRCT ld temp1,T mpy

;清FRCT标志,准备整数乘

;将变量temp1装入T寄存器

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

temp2,a

例如,当temp1=1234H(十进制的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 ;将结果(低16位)存入变量mpy_I_l

5﹑实现16定点小数乘法

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

ssbx ld mpya

FRCT

;FRCT=1,准备小数乘法

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

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

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

sth b,mpy_f

例如,temp1=temp2=4000H(十进制的0.5),两数相乘后结果为20000000(十进制的2=0.25)。再如,temp1=0ccdH(十进制的0.1),temp2=0599aH(十进制的0.7),两数相乘后B寄存器的内容为08f5f0a4H(十进制的0.07000549323857)。

3

?2

如果仅保存结果的高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位。详细代码如下:

ld mpy ld abs stl ld abs rpt subc bcd

temp1,T

;将被除数装入T寄存器

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

temp2,A

temp2,B B

;将除数temp2装入B寄存器的低16位 ;求绝对值

;将B寄存器的低16位存回temp2 ;将被除数temp1装入B寄存器的低16位 ;求绝对值

;重复SUBC指令16次

;使用SUBC指令完成除法运算

B,temp2 temp1,B B #15

temp2,b

div_end,agt ;延时跳转,先执行下面两条指令,然后判断A,

;若A>0,则跳转到标号div_end,结束除法运算

stl sth xor

B,quot_i ;将商(B寄存器的低16位)存入变量quot_i

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

;若两数相乘的结果为负,则商也应为负。先 ;将B寄存器清0

sub quot_i,B ;将商反号

4

stl B,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位为商。第二,与小数乘法一样,应考虑符号位对结果小数点的影响。所以应对商右移一位,得到正确的有符号数。其详细代码如下:

ld mpy ld abs stl ld abs rpt subc and

temp1,T

;将被除数装入T寄存器

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

temp2,A

temp2,B B

;将除数temp2装入B寄存器的低16位 ;求绝对值

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

;将被除数temp1装入B寄存器的高16位

B,temp2

temp1,16,B B #15

;求绝对值

;重复SUBC指令16次

;使用SUBC指令完成除法运算

;将B寄存器的高16位清为0。这时余数被 ;丢弃,仅保留商

temp2,b

#0ffffh,B

bcd div_end,agt ;延时跳转,先执行下面两条指令,然后判断A,

; 若A>0,则跳转到标号div_end,结束除法运算

stl B,-1,quot_f ;将商右移一位后存入变量quot_f,右移是为了

5

;修正符号位

xor

B

;若两数相乘的结果为负,则商也应为负。先将B ;寄存器清0

sub stl

quot_f,B B,quot_f

;将商反号

;存回变量quot_f中

div_end:

注意,上面的C54X的16位定点有符号小数除法通用程序没有保留余数,商保存在变量temp3中。举一个例子,当temp1=2cccH(十进制的0.35),temp2=55c2H(十进制的0.67),两数相除的结果为temp3=42dcH(十进制的

150x42dc?2?0.52233)。

四、实验条件

PC机, DES5402PP-U实验系统(若使用,需要将CCS配置为硬件仿真器) 五、实验步骤

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

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

本实验的汇编源程序代码主要分为六个部分:加法、减法、整数乘法、小数乘法、整数除法和小数除法。每个部分后面都有一条需要加断点的标志语句:

nop

当执行到这条加了断点的语句时,程序将自动暂停。这时你可以通过“存贮器窗口”检查计算结果。当然你看到的结果都是十六进制的数。

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

在完成实验程序代码的输入,并在CCS集成开发环境采用编译器对各模块进行编译并连接后,就可以在simulator上调试运行。步骤如下:

a. 将CCS配置为C5402 simulator,启动CCS。

b. 新建工程exer1.prj,将编写的主程序文件、CMD文件、中断向量表添加到

工程,对各模块进行编译,然后rebuild,生成.out输出文件。

c.在CCS界面单击菜单栏File下面的“Load”选项,并在弹出的File Name对话框中选择Debug文件夹下面的exer1.out装入基本算术运算实验程序,这时应

6


DSP实验指导书及其思考题答案(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2017-2023年中国通信继电器行业市场深度分析与投资规划咨询(目

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: