dsp实验1-基本算数运算

  • 格式:docx
  • 大小:24.34 KB
  • 文档页数:10

电子科技大学通信与信息工程学院 标准实验报告 实验)课程名称 DSP 设计与实现

电子科技大学教务处制表 电子科技大学 实验报告

一、实验室名称: DSP 实验室 二、实验项目名称: 基本算术运算 三、实验学时: 4 四、实验原理: (1) 定点 DSP 中数据表示方法 C54X 是 16 位的定点 DSP。一个 16 位的二进制数既可以表示一个整数,也可以表示一 个小数。当它表示一个整数时,其最低位( D0)表示 20,D1 位表示 21 ,次高位( D14)表

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

如,07FFFH表示最大的正数 32767(十进制),而 0FFFFH表示最大的负数 -1(负数用 2 的补 码方式显示) 。当需要表示小数时,小数点的位置始终在最高位后,而最高位( D15)表示符

号位。这样次高位( D14)表示 2 1,然后是 2 2 ,最低位( D0)表示 2 15 。所以 04000H

表 示小数 0.5 ,01000H表示小数 2 3 0.125 ,而 0001H表示 16 位定点 DSP能表示的最小的

小数(有符号) 2 15 =0.000030517578125 。在后面的实验中,除非有特别说明,我们指的 都

是有符号数。 在 C54X中,将一个小数用 16 位定点格式来表示的方法是用 215 乘以该小数,

然后取整。 从上面的分析可以看出,在 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 实用教程》。在本实验中,我们使用 下列代码来说明减法运算:

;将变量 temp3 左移 16 位同时变量 temp1 也左移 16 位,然后 ;相减,结果放入寄存器 B(高 16 位)中,同时 ar2 加 1。 ;将相减的结果(高 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

stm #temp1,ar3 ;将变量 temp1 的地址装入 ar3 寄存器 stm #temp3,ar2 ;将变量 temp3 的地址装入 ar3 寄存器 sub * ar2+, *ar3,b

sth b,sub_result 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 2 =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 位。 详细代码如下: ;将被除数装入 T 寄存器 ;除数与被除数相乘,结果放入 A 寄存器 ;将除数 temp2 装入 B 寄存器的低 16 位 ;求绝对值 ;将 B 寄存器的低 16 位存回 temp2

;将被除数 temp1 装入 B 寄存器的低 16 位 ;求绝对值 ;重复 SUBC 指令 16 次 ;使用 SUBC 指令完成除法运算 ;延时跳转,先执行下面两条指令,然后判断 A,若 A>0 ,则 ;跳转到标号 div_end ,结束除法运算 ;将商( B 寄存器的低 16 位)存入变量 quot_i

;将余数( B 寄存器的高 16 位)存入变量 remain_i ;若两数相乘的结果为负,则商也应为负。先将 B 寄存器清 0 ;将商反号 ;存回变量 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 temp1,T ;将被除数装入 T 寄存器 mpy temp2,A ;除数与被除数相乘,结果放入 A 寄存器 ld temp2,B ;将除数 temp2 装入 B 寄存器的低 16 位 abs B ;求绝对值

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

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