dsp报告
- 格式:doc
- 大小:9.30 MB
- 文档页数:22
0 目 录
第一章、基本算术运算 ..................................... 1
1.1、实验目的和要求 ................................... 1
1.2、实验原理 ......................................... 1
1.3、实验内容 ......................................... 2
第二章、C54X的汇编语言程序设计 ........................... 7
2.1、实验目的和要求 ................................... 7
2.2、实验原理 ......................................... 7
2.3、实验内容 ......................................... 8
第三章 、FFT算法的实现 .................................. 13
3.1、实验目的和要求 .................................. 13
3.2、实验原理 ........................................ 13
3.3、实验内容 ........................................ 14
第四章 、ASK、PSK、FSK调制的实现 ........................ 16
4.1、实验目的 ........................................ 16
4.2、实验原理 ........................................ 16
4.3、实验内容 ........................................ 16
心得体会 ................................................ 20
1 第一章、基本算术运算
1.1、实验目的和要求
加、减、乘、除是数字信号处理中最基本的算术运算。DSP 中提供了大量的指令来
实现这些功能。本实验学习使用定点DSP 实现16 位定点加、减、乘、除运算的基本方法
和编程技巧。
1.2、实验原理
(1)、定点 DSP 中的数据表示方法
54X 是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 表示小数32 = 0.125 ,而0001H 表示16 位定点(DSP 能表示的最小的小数(有符号)152 =0.000030517578125。在后面的实验中,除非有特别说明,我们指的都是有符号数。在C54X 中,将一个小数用16 位定点格式来表示的方法是用152乘以该小数,然后取整。
从上面的分析可以看出,在DSP 中一个16 进制的数可以表示不同的十进制数,或
者是整数,或者是小数(如果表示小数,必定小于1),但仅仅是在做整数乘除或小数乘
除时,系统对它们的处理才是有所区别的,而在加减运算时,系统都当成整数来处理。
(2)实现 16 位定点加法
C54X 中提供了多条用于加法的指令,如ADD,ADDC,ADDM 和ADDS。其中
ADDS 用于无符号数的加法运算,ADDC 用于带进位的加法运算(如32 位扩展精度加
法),而ADDM 专用于立即数的加法。
(3)实现 16 位定点减法
C54X 中提供了多条用于减法的指令,如SUB,SUBB,SUBC 和SUBS。其中SUBS
用于无符号数的减法运算,SUBB 用于带进位的减法运算(如32 位扩展精度的减法),
而SUBC 为移位减,DSP 中的除法就是用该指令来实现的。SUB 指令与ADD 指令一样,
有许多的寻址方式。
(4)实现 16 位定点整数乘法
2 在C54X 中提供了大量的乘法运算指令,其结果都是32 位,放在A 或B 寄存器
中。乘数在C54X 的乘法指令很灵活,可以是T 寄存器、立即数、存贮单元和A 或B
寄存器的高16 位。有关乘法指令的详细使用说明请参考《TMS320C54X 实用教程》。
在C54X 中,一般对数据的处理都当做有符号数,如果是无符号数乘时,要使用MPYU
指令。这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。
5) 实现 16 位定点小数乘法
在 C54X 中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,
其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。C54X
中提供了一个状态位FRCT,将其设置为1 时,系统自动将乘积结果左移一位。但注意
整数乘法时不能这样处理,所以上面的实验中一开始便将FRCT 清除。两个小数(16 位)
相乘后结果为32 位,如果精度允许的话,可以只存高16 位,将低16 位丢弃,这样仍可
得到16 位的结果。
(6) 实现 16 位定点整数除法
在 C54X 中没有提供专门的除法指令,一般有两种方法来完成除法。一种是用乘法
来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于
除以常数特别适用。另一种方法是使用SUBC 指令,重复16 次减法完成除法运算。下
面我们以temp1/temp2 为例,说明如何使用SUBC 指令实现整数除法。其中变量temp1为被除数,temp2 为除数,结果即商存放在变量temp3 中。在完成整数除法时,先判断
结果的符号。方法是将两数相乘,保存A 或B 的高16 位以便判断结果的符号。然后只
做两个正数的除法,最后修正结果的符号。为了实现两个数相除,先将被除数装入A 或
B 的低16 位,接着重复执行SUBC 指令,用除数重复减16 次后,除法运算的商在累加
器的低16 位,余数在高16 位。
(7) 实现 16 位定点小数除法
在 C54X 中实现16 位的小数除法与前面的整数除法基本一致,也是使用循环的
SUBC 指令来完成。但有两点需要注意:第一,小数除法的结果一定是小数(小于1),
所以被除数一定小于除数。这与整数除法正好相反。所以在执行SUBC 指令前,应将被
除数装入A 或B 寄存器的高16 位,而不是低16 位。其结果的格式与整数除法一样,A
或B 寄存器的高16 位为余数,低16 位为商。第二,与小数乘法一样,应考虑符号位对
结果小数点的影响。所以应对商右移一位,得到正确的有符号数。
1.3、实验内容
本实验需要使用C54X汇编语言实现加、减、乘、除的基本运算,并通过DES的存
贮器显示窗口观察结果。实验分两步完成:
(1) 编写实验程序代码
本实验的汇编源程序代码主要分为六个部分:加法、减法、整数乘法、小数乘法
整数除法和小数除法。每个部分后面都有一条需要加断点的标志语句:nop
当执行到这条加了断点的语句时,程序将自动暂停。这时你可以通过“存贮器窗口”检
查计算结果。当然你看到的结果都是十六进制的数。实验源程序请参见附录。
(2)用ccs simulator调试运行并观察结果
在完成实验程序代码的输入,并使用ccs进行编译并连接,得到out文件后,就可
以在simulator 上调试运行。
调试步骤如下:
a. 启动ccs simulator。
3 b. 点击file ->load program,找到exer1.out(在产品光盘的code\base_operation\debug下)并装入。这时可在反汇编窗口看到程序代码。
c. 打开“Memory”窗口,并在其中选择要查看的存贮器地址段:0x080-0x08e。
d. 在反汇编窗口中在每个“nop”指令处都设一个断点,方法有两种:1.用鼠标双击该
指令将其点亮即可。2.在菜单栏中选择debugÆbreakpoint,然后在弹出的对话框中
键入欲加断点的地址即可(注意地址的格式)。
e. 单击Run快捷键(或者F5按钮),启动执行基本算术运算程序,程序在执行完加法
运算后自动暂停。通过register window窗口可以看到寄存器A的内容为0x46,这 正是加法运算的结果。(注意,若在硬件仿真器环境下调试,受DSP指令流水线的影响,断点处可能看不到A寄存器的变化。)同样,在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继续运行,完成整数乘法运算。
当程序再次暂时(断点位于0x109d),可以看到0x81和0x82单元的内容分别为0012和0034,A寄存器的内容为000003A8,这正是我们希望的结果:18*52=936(0x3a8)。这时我们可以用1个16位的内容单元来保存结果,如将A寄存器的低16位存入0x8b单元。
实验结果如下: