dsp实验1-基本算数运算

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电子科技大学通信与信息工程学院标准实验报告

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

电子科技大学教务处制表

电 子 科 技 大 学

实 验 报 告

一、实验室名称:DSP 实验室

二、实验项目名称:基本算术运算

三、实验学时:4

四、实验原理:

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

C54X 是16位的定点DSP 。一个16位的二进制数既可以表示一个整数,也可以表示一个小数。当它表示一个整数时,其最低位(D0)表示02,D1位表示12,次高位(D14)表示142。如果表示一个有符号数时,最高位(D15)为符号位,0表示正数,1表示负数。例如,07FFFH 表示最大的正数32767(十进制),而0FFFFH 表示最大的负数-1(负数用2的补码方式显示)。当需要表示小数时,小数点的位置始终在最高位后,而最高位(D15)表示符号位。这样次高位(D14)表示12-,然后是22-,最低位(D0)表示152

-。所以04000H 表示小数0.5,01000H 表示小数125.02

3=-,而0001H 表示16位定点DSP 能表示的最小的小数(有符号)152-=0.8125。在后面的实验中,除非有特别说明,我们指的都是有符号数。

在C54X 中,将一个小数用16位定点格式来表示的方法是用152乘以该小数,然后取整。

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

(2) 实现16定点加法

C54X 中提供了多条用于加法的指令,如ADD ,ADDC ,ADDM 和ADDS 。其中ADDS 用于无符号数的加法运算,ADDC 用于带进位的加法运算(如32位扩展精度加法),而ADDM

专用于立即数的加法。ADD指令的寻址方式很多,其详细使用说明请参考《TMS320C54X 实用教程》。在本实验中,我们使用下列代码来说明加法运算:

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

add temp2,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指令一样,有许多的寻址方式,其详细使用说明请参考《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)实现16定点整数乘法

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

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

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

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

例如,当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 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

例如,temp1=temp2=4000H(十进制的0.5),两数相乘后结果为20000000(十进制的2

2 =0.25)。再如,temp1=0ccdH(十进制的0.1),temp2=0599aH(十进制的0.7),两数相乘后B寄存器的容为08f5f0a4H(十进制的0.857)。如果仅保存结果的高16位08f5H(十进制的0.063)。有时为了提高精度,可以使用RND或使用MPYR指令对低16位做四舍五入的处理。

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

在C54X中没有提供专门的除法指令,一般有两种方法来完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。另一种方法是使用SUBC指令,重复16次减法完成除法运算。下面我们以temp1/temp2为例,说明如何使用SUBC指令实现整数除法。其中变量temp1为被除数,temp2为除数,结果即商存放在变量temp3中。在完成整数除法时,先判断结果的符号。方法是将两数相乘,保存A或B的高16位以便判断结果的符号。然后只做两个正数的除法,最后修正结果的符号。为了实现两个数相除,先将被除数装入A或B的低16位,接着重复执行SUBC指令,用除数重复减16次后,除法运算的商在累加器的低16位,余数在高16位。详细代码如下:

相关文档
最新文档