10级DSP实验指导书.docx
- 文档编号:11805959
- 上传时间:2023-04-02
- 格式:DOCX
- 页数:38
- 大小:270.33KB
10级DSP实验指导书.docx
《10级DSP实验指导书.docx》由会员分享,可在线阅读,更多相关《10级DSP实验指导书.docx(38页珍藏版)》请在冰豆网上搜索。
10级DSP实验指导书
《DSP技术》实验指导书
2013年4月20日
实验一CCS基本操作
(一)实验目的
熟悉CCS2.0软件的使用
掌握使用DSP实现16位定点加、减、乘、除运算的编程方法
(二)实验设备
计算机
(三)实验原理
(1)定点DSP中数据表示方法
C54X是16位定点DSP。
一个16位在二进制既可表示一个整数,也可以表示一个小数。
当它表示一个整数据时,其最低位(D0)表示20,D1位表示21,次高位表示(D14)表示214。
如果表示一个有符号时,最高位(D15)为符号位,0表示正数,1表示负数。
例如,07FFFH表示最大的正整数32767(十进制),而0FFFH表示最大负数-1(负数用2的补码方式显示)。
当需要表示小数时,小数点的位置始终在最高位后,而最高位(D15)表示符号。
这样次高位(D14)表示1-1,,然后是2-2,最低位(D0)表示2-15,所以04000H表示小数0.5,01000H表示小数2-3=0.125,而0001H表示16位定点DSP能表示的最小数(有符号)2-15=0.000030517578125。
在后面的实验中,除非有特别的说明,我们指的是有符号数。
在C54x中,将一个小数用16位定点格式来表示的方法是用2-15乘以该小数,然后取整。
从上面的分析可以看出,在DSP中一个16进制的数可以表示不同的十进制数,或者是整数,或者是小数(如果表示小数,必定小于1)但仅仅是在做整数乘除或小数乘除时,系统对它们的处理才是有所区别的,而在加法运算时,系统都当成整数来处理。
(2)实现16位定点加法
C54x中提供了多条用于加法的指令,如ADD,ADDC,ADDM和
ADDS。
其中ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算(如32位扩展精度加法),而ADDM专用于立即数的加法。
在本实验中,我们使用下列代码说明加法运算:
LDTEMP1,A;将变量TEMP1装入寄存器A
ADDTEMP2,A;将变量TEMP2与寄存器A相加,将结果放入A
STLA,ADDRESULT;将结果(低16位)放入变量ADDRESULT中
注意,这里完成计算TEMP3=TEMP2+TEMP1,我们没有考虑TEMP1,TEMP2是整数还是小数,在加法和下面的减法中整数运算都是一样的。
(3)实现16位定点减法
C54X中提供了多条用于减法的指令,如SUB,SUBC,SUBM和SUBS。
其中SUBS用于无符号数的减法运算,SUBB用于带进位的减法运算(如32位扩展精度减法),而SUBC是移位减(有条件减法),DSP中除法就是用该条指令来实现的。
SUB和ADD指令一样寻址方式很多,其详细使用说明请参考《TMS320C54X》。
在本实验中,我们使用下列代码说明减法运算:
STM#TEMP1,AR3;将变量TEMP1的地址装入AR3寄存器
STM#TEMP3,AR2;将变量TEMP3的地址装入AR2寄存器
SUB*AR2+,AR3,B
STHB,SUBRESULT
(4)实现16定点整数乘法
在C54中提供大量的乘法运算指令,其结果都是的32位,放在A或B寄存器中。
乘法指令输入变量非常灵活,可以是T寄存器、立即数、存贮单元和A或B寄存器的高16位。
有关乘法指令的详细使用说明请参考《TMS320C54X实用教程》。
在C54X中,一般对数据的处理都当做有符号数,如果是无符号数乘时,请使用MPYU指令。
这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。
在本实验中,我们使用下列代码来说明整数乘法运算;
RSBXFRCT;请FRCT标志,准备整数乘
LDTEMP1,T;将变量TEMP1装入T寄存器
MPYTEMP2,A;完成TEMP2*TENPL,结果放入A寄存器(32)位
例如,当TEMP1=1234H(十进制的4660),TEMP2=9876H(十进制的-26506),乘法的结果在A寄存器中为0F8A343F8H(十进制的-123517960)。
这是一个32位的
结果,需要两个内存单元来存放结果;
STHA,MPY_1_H;将结果(高16位)存入变量MPY_1_H
STLA,MPY_1_H;将结果(低16位)存入变量MPY_1_L
当TEMP1=10H(十进制的16),TEMP2=05H(十进制的5),乘法结果在A寄存器中为00000050H(十进制的80)。
对于这种情况,仅仅需要保存低16位即可;
STLA,MPY_1_L;将结果(低16位)存放变量MPY-1-L
(5)实现16定点小数乘法
在C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。
C54X中提供了一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移移位。
但注意整数乘法时不能这样处理,所以上面的实验中一开始便将FRCT清除。
两个小数(16位)相乘后结果为32位,如果精度允许的话,可以只存放高16位,将低16位丢弃,这样仍可得到16位的结果。
在本实验中,我们使用下列代码来说明小数乘法运算:
SSBXFRCT;FRCT=1,准备小数乘法
LDTEMP1,16,A;将变量TEMPL装入寄存器A的高的16位
MPYATEMP2;完成TEMP2乘寄存器A的高的16位,结果在B
;中,
;同时将TEMP2装入T寄存器
STHB,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.07000549323857)。
如果仅保存结果的高16位08F5H(十进制的0.06997680664063)。
有时为了提高精度,可以使用RND或使用MPYR指令对低16位做四舍五入的处理。
(6)实现16定点整数除法
在C54X中没有提供专门的除法指令,一般有两种方法来完成除法。
一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。
这种方法对于除以常数特别适用。
另一种方法是使用SUBC指令,重复16次减法完成除法运算。
下面我们以TEMP1/TEMP2为例,说明如何使用SUBC指令实现整数除法,其中变量TMP1为被除数,TMP2为除数,结果即商存放在变量TEMP3中。
在完成整数除法时,先判断结果的符号。
方法是将两数相乘,保存A或B的高16位以便判断结果的符号。
然后只做两个正数的除法,最后修正结果的符号。
为了实现两个数相除,先将被除数装入A或B的低16位,接着重复执行SUBC指,用除数重复减16次后,除法运算的商在累加器的低16位,余数在高16位。
详细代码如下:
LDTEMP1,T;将被除数装入T寄存器
MPYTEMP2,A;除数与被除数相乘,结果放入A寄存器
LDTEMP2,B;将除数TEMP2装入B寄存器的低16位
ABSB;求绝对值
STLB,TEMP2;将B寄存器的低16位存回TEMP2
LDTEMP1,B;将被除数TEMP1装入B寄存器的低16位
ABSB;求绝对值
RPT#15;重复SUBC指令16次
SUBCTEMP2,B;使用SUBC指令完成除法运算
BCDDIV-END,AGT;延时跳转,先执行下面两条指令,然后判
;断A,若A大于0,则跳转到标号
;DIV-END,结束除法运算
STLB,QUOT-I;将商(B寄存器的低16位)存入变量QUOT-I
STHB,REMAIN-I;将余数(B寄存器的高16位)存入变量
;REMAIN-I
XORB,B;若两数相乘的结果为负,则商也应为负。
;先将B寄存器清0
SUBQUOT-I,B;将商反号
STLB,QUOT-I;存回变量QUOT-I中
DIV-END:
(7)实现16定点小数除法
下面给出的是小数除法与前面的整数除法基本一致,也是使用循环的SUBC指令来完成。
但有两点需要注意:
第一,小数除法的结果一定是小数(小于一),所以被除数一定小于除数。
这与整数除法正好相反。
所以在执行SUBC指令前,应将被除数装入A或B寄存器的高16位,而不是低16位。
其结果的格式与整数除法一样,A或B寄存器的高16位为余数,低16位商。
第二,与小数乘法一样,应考虑符号对结果小数点的影响。
所以应对商右移一位,得到正确的有符号数。
其详细代码如下:
LDTEMP1,T;将被除数装入T寄存器
MPYTEMP2,A;除数与被除数相乘,结果放入A寄存器
LDTEMP2,B;将除数TEMP2装入B寄存器的低16位
ABSB;求绝对值
STLB,TEMP2;将B寄存器的低16位存回TEMP2
LDTEMP1,B;将被除数TEMP1装入B寄存器的低16位
ABSB;求绝对值
RPT#15;重复SUBC指令16次
SUBCTEMP2,B;使用SUBC指令完成除法运算
AND#0FFFFH,B;将B寄存器的高16位清为0。
;这时余数被丢弃,仅保留商
BCDDIV-END,AGT;延时跳转,先执行下面两条指令,然后判
;断A,若A大于0,则跳转到标号DIV-END,
;结束除法运算
STLB-1,QUOT-F;将商右移
STLB-1,REMAIN-I;将余数(B寄存器的高16位)存
;入变量REMAIN-I
XORB,B;若两数相乘的结果为负,则商也应为负。
;先将B寄存器清0
SUBQUOT-I,B;将商反号
STLB,QUOT-I;存回变量QUOT-I中
DIV-END:
注意:
上面的C54X的16位定点有符号小数除法通用程序没有保留余数,商保存在变量TEMP3中。
举一个例子,当TEMP1=2CCCH(十进制0.35),TEMP2=55C2H(十进制的0.67),两数相除的结果为TEMP3=42DCH(十进制的0X42DC除以215=0.52233)。
(四)实验步骤
1.新建一个工程
1)如果你的CCS安装在C:
\ti目录下,请在d:
\下新建一个目录,名为sf
2)将C:
\DSP实验\C5402例程\a1suanfa下的.asm文件拷贝到新目录中
3)运行CCS程序
4)选择ProjectNew菜单
5)在窗口中,选择你新建的目录,键入sf作为工程文件名,然后单击完成。
CCS会给你新建一个叫sf.pjt的工程文件,他将保存你的工程文件设置,和工程引用相关文件。
2.往工程中加入文件
1)选择projectAddFilestoProject,选择sf.asm,加入工程中。
5.浏览代码
和Windows的资源管理器相似,只要打开+号展现下面的文件,然后双击文件的图标,在主窗口就会显示相应文件的原始代码。
6.编译/执行程序
1)选择ProjectRebuildAll或工具栏中的相应按钮。
2)编译成功后,选择FileLoadProgram。
选择你刚编译的可执行程序exp1.out。
3)选择DebugRun,或工具栏中的相应图标。
5.程序调试的环境应用
(1)跟踪/调试程序
1)选择DebutRestart,重新执行程序。
2)不全速运行,而是选择DebugStepInto或按F8,单步执行程序.
3)观察主要寄存器的变化ViewCPURegistersCPURegiste。
注:
对不熟悉的指令,可查找相应说明。
(2)断点的设置与取消。
(3)观察CPU寄存器、存储器及变量。
6.源程序如下
实验一:
CCS基本操作
************************************************
*FileName:
sf.asm*
*Description:
DSP指令实验*
*Copyright(C)SanZhiElectronic*
************************************************
.title"ex1"
.mmregs
.def_c_int00
DAT0.SET60H
DAT1.SET61H
DAT2.SET62H
DAT3.SET63H
.text
ADD3.MACROP1,P2,P3,ADDRP;三数相加宏定义:
ADDRP=P1+P2+P3
LDP1,A
ADDP2,A
ADDP3,A
STLA,ADDRP
.ENDM
_c_int00:
Bstart
start:
LD#00h,DP;置数据页指针
STM#1000h,SP;置堆栈指针
SSBXINTM;禁止中断
bk0:
ST#0012h,DAT0
LD#0023h,A
ADDDAT0,A;加法操作:
A=A+DAT0
NOP
NOP
NOP
NOP
bk1:
ST#0054h,DAT0
LD#0002h,A
SUBDAT0,A;减法操作:
A=A-DAT0
NOP
NOP
NOP
NOP
bk2:
ST#0345h,DAT0
STM#0002h,T
MPYDAT0,A;乘法操作:
A=DAT0*T
NOP
NOP
NOP
NOP
bk3:
ST#1000h,DAT0
ST#0041h,DAT1
RSBXSXM;无符号除法操作:
DAT0÷DAT1;结果:
DAT2:
商;DAT3:
余数
LDDAT0,A
RPT#15
SUBCDAT1,A
STLA,DAT2
STHA,DAT3
NOP
NOP
NOP
NOP
bk4:
ST#0333h,DAT0
SQURDAT0,A;平方操作:
A=DAT0*DAT0
NOP
NOP
NOP
NOP
bk5:
ST#0034h,DAT0
ST#0243h,DAT1
ST#1230h,DAT2
ADD3DAT0,DAT1,DAT2,DAT3;三数相加操作:
DAT3=DAT0+DAT1+DAT2
NOP
NOP
NOP
NOP
bk6:
Bbk0;循环执行
.end
实验二定时器实验
(一)实验目的
熟悉DSP的定时器
了解定时器中断的编程方法
学会使用定时器中断方式控制程序流程
(二)实验设备
计算机;DSP硬件仿真器;DSP实验开发平台
(三)实验原理及说明
VC5402上有2个CPU定时器,本程序主要对CPU定时器0进行操作,1ms产生一次中断,让DSP5402开发板上的D9发光二极管每500ms闪烁一次。
(四)实验步骤
1.新建一个工程
2.新建源文件
3.将源文件添加到工程
4.编译、执行程序
5.观察实验结果
实验三同步串口
(一)实验目的
了解DSP同步串口工作原理及程序的编写
了解AD50工作原理
(二)实验设备
计算机;DSP硬件仿真器;DSP实验开发平台;耳机、麦克风
(三)实验硬件设置
在做实验之前,需要接通该实验所需的硬件电路,本实验为:
先将实验箱右侧的船型开关往“I”方向打开电源,然后将系统主板的开关S33(主板左上角)往下拨接通+/-5V电源;将麦克风(红色端)插入语音输入插座(M1),将耳机(黑色端)插入语音输出插座(M3),然后开始做实验,注意在做DSP实验时开始按了RST硬件复位后,实验中不要再按RST键,以免实验由于DSP复位而失败。
如果实验中硬件工作不正常,可按RST键对整个系统硬件进行复位。
(四)实验原理
本实验是实现通过DSP的同步串口能向AD50发送控制字和数据或接收AD50发送的数据。
硬件原理图请参考语音处理模块,同步串口实验,主要是通过5402的同步串口0访问A/D芯片,使学生了解同步串口工作原理。
该实验所需的硬件主要是DSP、TMS320AD50、TLC2272,在实验过程中如果TLC320AD50C工作不正常,请按复位键(RST键)对实验仪硬件复位。
编写DSP同步串口程序访问AD50,语音信号从麦克风(红色)输入后经过TLC2272(双路低噪声)滤波,通过AD50的A/D将模拟信号转换为数字信号,通再数字信号发送到AD50的DAC通道中,最后信号由耳机(黑色)输出。
要在耳机里听到麦克风所输入的声音。
TLC320AD50和TMS320C54x的接口图
(五)实验程序框图
实验四FIR滤波器实验
(一)实验目的
熟悉数字滤波的基本原理和实现方法;
熟悉线性相位FIR数字滤波器特性;
通过观察对实际信号的滤波作用,获得对数字滤波的感性认识。
(二)实验设备
计算机;DSP硬件仿真器;DSP实验开发平台。
(三)实验硬件设置
在做实验之前,需要接通该实验所需的硬件电路,本实验为:
先将实验箱右侧的船型开关往“I”方向打开电源,然后将系统主板的开关S33(主板左上角)往下拨接通+/-5V电源;然后开始做实验,注意在做DSP实验时开始按了RST硬件复位后,实验中不要再按RST键,以免实验由于DSP复位而失败。
(四)实验原理
FIR滤波器算法的函数表达式:
shortoflag=fir(DATA*x,DATA*h,DATA*r,DATA**dbuffer,ushortnh,ushortnx)(定义于fir.asm)
参数
x[nx]
指向输入向量,长度为nx
h[nh]
指向系数向量,长度为nx
例如:
若nh=3:
则:
H=b0,b1,b2。
●内存对齐:
这是一个环行缓冲区,必须起始于k位边界上(就是说起始地址的k个LSB位必须为0)。
其中k为大于log2(nh)的整数,具体解释见TMS320C54XDSPReferenceSet第5-15页5.5.3.4小节。
r[nx]
指向输出向量,长度为nx
Dbuffer[nh]
延迟缓冲区
●在多重缓冲区方法中,该向量在进行第一次块操作时应该初始化为0;在后面的块操作中,延迟缓冲区保存着计算r所必须的输入值。
●内存对齐:
与h向量一致。
Nx
输入向量的长度
Nh
系数向量的长度
Oflag
溢出标志
●若oflag=1,则运算中产生32位溢出
●若oflag=0,运算中未产生32位溢出
说明
使用系数向量h,计算实数的FIR滤波。
输入数据存于向量x中。
该例程使用一个缓冲内存d,来保存前一次的输入值。
可以进行块滤波操作,或者单个数据滤波(nx=1)。
算法
r[j]=
0<=j<=nx
(五)实验步骤
(1)用MATLAB设计软件设计出FIR数据文件,可采用随机光盘里WAVE文件夹中的数据文件。
(2)启动CCS,编写实验程序代码(可参考随机光盘中的例程),进行编译并加载到DSP中。
(3)采用单步运行或执行到光标处,或全速运行,并打开波形观察窗口,跟踪观察其执行过程和滤波效果。
此处举例介绍随机光盘里的例程低通滤波器的程序运行,以及如何观察滤波效果:
①先打开项目,然后编译、加载实验程序,然后点击菜单debug—Gomain就进入实验程序test.c(如图一)。
图一程序
②然后我们打开波形观察窗口,路径是View—Graph—Time/Frequence,将出现如下图二所示的图形属性框,因为本程序编写的是输入向量放在x中,而滤波后的输出向量放在r中,因此图形属性框应选择:
在DisplayType一栏中选择DualTime项;InterleavedDataSources一栏中选择No项;StartAddress-upperdisplay一栏中输入x,
StartAddress-upperdisplay一栏中输入r;AcquistitionBufferSize一栏中输入256;DisplayDataSize一栏中输入256;DSPDataType一栏中选择16-bitsignedinteger项;其他为默认值,然后点击“OK”就可打开图形观察窗口如图三。
图二图形属性窗口
图三输入数据波形
③输入数据文件,路径是File—Data—Load,将WAVE文件夹的“fwave1k+500.dat数据文件载入,如图四所示设置。
然后就会出现如图三所示的输入波形窗口。
图四加载数据设置
④运行程序,就可观察到输入数据经过FIR滤波后的效果,如图五所示。
至此就可观察信号经过FIR滤波后的信号的改变。
图五FIR滤波后的输出数据
具体实验程序请参考:
随机光盘里的lpassfir文件夹。
(六)实验思考
根据上述低通FIR滤波器的设计方法设计出高通FIR滤波
附录:
参考程序清单
实验一:
CCS基本操作
************************************************
*FileName:
ex1.asm*
*Description:
DSP指令实验*
*Copyright(C)SanZhiElectronic*
************************************************
.title"ex1"
.mmregs
.def_c_int00
DAT0.SET60H
DAT1.SET61H
DAT2.SET62H
DAT3.SET63H
.text
ADD3.MACROP1,P2,P3,ADDRP;三数相加宏定义:
ADDRP=P1+P2+P3
LDP1,A
ADDP2,A
ADDP3,A
STLA,ADDRP
.ENDM
_c_int00:
Bstart
start:
LD#00h,DP;置数据页指针
STM#1000h,SP;置堆栈指针
SSBXINTM;禁止中断
bk0:
ST#0012h,DAT0
LD#0023h,A
ADDDAT0,A;加法操作:
A=A+DAT0
NOP
NOP
NOP
NOP
bk1:
ST#0054h,DAT0
LD#0002h,A
SUBDAT0,A;减法操作:
A=A-DAT0
NOP
NOP
NOP
NOP
bk2:
ST#03
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 DSP 实验 指导书