ImageVerifierCode 换一换
格式:DOCX , 页数:62 ,大小:510.52KB ,
资源ID:9563574      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9563574.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(DSP技术实验指导.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

DSP技术实验指导.docx

1、DSP技术实验指导 实验一 基本算术运算一实验目的加、减、乘、除是数字信号处理中最基本的算术运算。DSP中提供了大量的指令来实现这些功能。本实验学习使用定点DSP实现16位定点加、减、乘、除运算的基本方法和编程技巧。二实验原理1定点DSP中数据表示方法 C54X是16位的定点DSP。一个16位的二进制数既可以表示一个整数,也可以表示一个小数。当它表示一个整数时,其最低位(D0)表示,D1位表示,次高位(D14)表示。如果表示一个有符号数时,最高位(D15)为符号位,0表示正数,1表示负数。例如,07FFFH表示最大的正数32767(十进制),而0FFFFH表示最大的负数-1(负数用2的补码方式

2、显示)。当需要表示小数时,小数点的位置始终在最高位后,而最高位(D15)表示符号位。这样次高位(D14)表示,然后是,最低位(D0)表示。所以04000H表示小数0.5,01000H表示小数,而0001H表示16位定点DSP能表示的最小的小数(有符号)=0.000030517578125。在后面的实验中,除非有特别说明,我们指的都是有符号数。在C54X中,将一个小数用16位定点格式来表示的方法是用乘以该小数,然后取整。 从上面的分析可以看出,在DSP中一个16进制的数可以表示不同的十进制数,或者是整数,或者是小数(如果表示小数,必定小于1),但仅仅是在做整数乘除或小数乘除时,系统对它们的处理才

3、是有所区别的,而在加减运算时,系统都当成整数来处理。 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

4、中。注意,这里完成计算temp3=temp1+temp2,我们没有特意考虑temp1和temp2是整数还是小数,在加法和下面的减法中整数运算和定点的小数运算都是一样的。3实现16位定点减法C54X中提供了多条用于减法的指令,如SUB,SUBB,SUBC和SUBS。其中SUBS用于无符号数的减法运算,SUBB用于带进位的减法运算(如32位扩展精度的减法),而SUBC为移位减,DSP中的除法就是用该指令来实现的。SUB指令与ADD指令一样,有许多的寻址方式,其详细使用说明请参考TMS320C54X实用教程。在本实验中,我们使用下列代码来说明减法运算: stm #temp1,ar3 ;将变量temp

5、1的地址装入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实用教程。

6、在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位的结果,需要两个内存

7、单元来存放结果: 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_l5实现16定点小数乘法 在C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。C54X中提供了一个状态位F

8、RCT,将其设置为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=te

9、mp2=4000H(十进制的0.5),两数相乘后结果为20000000(十进制的=0.25)。再如,temp1=0ccdH(十进制的0.1),temp2=0599aH(十进制的0.7),两数相乘后B寄存器的内容为08f5f0a4H(十进制的0.07000549323857)。如果仅保存结果的高16位08f5H(十进制的0.06997680664063)。有时为了提高精度,可以使用RND或使用MPYR指令对低16位做四舍五入的处理。6实现16定点整数除法 在C54X中没有提供专门的除法指令,一般有两种方法来完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种

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

11、p2,A ;除数与被除数相乘,结果放入A寄存器 ld temp2,B ;将除数temp2装入B寄存器的低16位 abs B ;求绝对值 stl B,temp2 ;将B寄存器的低16位存回temp2 ld temp1,B ;将被除数temp1装入B寄存器的低16位 abs B ;求绝对值 rpt #15 ;重复SUBC指令16次 subc temp2,b ;使用SUBC指令完成除法运算 bcd div_end,agt ;延时跳转,先执行下面两条指令,然后判断A,若A0,则;跳转到标号div_end,结束除法运算 stl B,quot_i ;将商(B寄存器的低16位)存入变量quot_i sth

12、B,remain_i ;将余数(B寄存器的高16位)存入变量remain_i xor B ;若两数相乘的结果为负,则商也应为负。先将B寄存器清0 sub quot_i,B ;将商反号 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

13、(在B寄存器的高16位)。7实现16定点小数除法 在C54X中实现16位的小数除法与前面的整数除法基本一致,也是使用循环的SUBC指令来完成。但有两点需要注意:第一,小数除法的结果一定是小数(小于1),所以被除数一定小于除数。这与整数除法正好相反。所以在执行SUBC指令前,应将被除数装入A或B寄存器的高16位,而不是低16位。其结果的格式与整数除法一样,A或B寄存器的高16位为余数,低16位为商。第二,与小数乘法一样,应考虑符号位对结果小数点的影响。所以应对商右移一位,得到正确的有符号数。其详细代码如下: ld temp1,T ;将被除数装入T寄存器 mpy temp2,A ;除数与被除数相乘

14、,结果放入A寄存器 ld temp2,B ;将除数temp2装入B寄存器的低16位 abs B ;求绝对值 stl B,temp2 ;将B寄存器的低16位存回temp2 ld temp1,16,B ;将被除数temp1装入B寄存器的高16位 abs B ;求绝对值 rpt #15 ;重复SUBC指令16次 subc temp2,b ;使用SUBC指令完成除法运算 and #0ffffh,B ;将B寄存器的高16位清为0。这时余数被丢弃,仅保留商 bcd div_end,agt ;延时跳转,先执行下面两条指令,然后判断A,若A0,则;跳转到标号div_end,结束除法运算 stl B,-1,qu

15、ot_f ;将商右移一位后存入变量quot_f,右移是为了修正符号位 xor B ;若两数相乘的结果为负,则商也应为负。先将B寄存器清0sub quot_f,B ;将商反号 stl B,quot_f ;存回变量quot_f中div_end: 注意,上面的C54X的16位定点有符号小数除法通用程序没有保留余数,商保存在变量temp3中。举一个例子,当temp1=2cccH(十进制的0.35),temp2=55c2H(十进制的0.67),两数相除的结果为temp3=42dcH(十进制的0x42dc0.52233)。三实验仪器PC机 DES5402PP-U实验系统四实验内容及步骤 本实验需要使用C5

16、4X汇编语言实现加、减、乘、除的基本运算,并通过DES的存贮器显示窗口观察结果。实验分两步完成:(1).编写实验程序代码本实验的汇编源程序代码主要分为六个部分:加法、减法、整数乘法、小数乘法、整数除法和小数除法。每个部分后面都有一条需要加断点的标志语句: nop当执行到这条加了断点的语句时,程序将自动暂停。这时你可以通过“存贮器窗口”检查计算结果。当然你看到的结果都是十六进制的数。实验源程序请参见第5部分。 (2).在simulator上调试运行,并观察结果 在完成实验程序代码的输入,并使用汇编批处理ASM.BAT进行编译并连接后,就可以在simulator上调试运行。步骤如下: a. 启动s

17、imulator实验系统软件sim54Xw.exe。b. 在调试界面的左下脚命令行栏输入load exer1.out,或单击菜单栏下面的“Load”选项,并在弹出的File Name对话框中键入exer1.out装入基本算术运算实验程序,这时应能在“反汇编”窗口看到程序代码。c. 用鼠标选中“Memory”窗口,并在其中选择要查看的存贮器地址段:0x0800x08e。d. 在反汇编窗口中在每个“nop”指令处都设一个断点,方法有两种:1.用鼠标单击该指令将其点亮即可。2.在菜单栏中选择“Break”Add”,然后在弹出的对话框中键入欲加断点的地址即可。e. 单击菜单栏下的“Run=F5”按钮,

18、启动执行基本算术运算程序,程序在执行完加法运算后自动暂停。通过“CPU”窗口可以看到寄存器AHL的内容为0x46,这正是加法运算的结果。同样,在“Memory”窗口中,可以看到0x81,0x82,0x88的内容为分别为0012,0034,0x46。执行加法运算后,将0x81和0x82的内容相加,结果放在0x88单元。f. 在“Memory”窗口中用鼠标左键双击0x81单元,这时可以修改该内存单元的内容。输入新的数据0x0ffee(十进制的-18),编辑内容时请直接输入FFEE(十六进制),然后回车确认,便完成对0x81单元的修改。 g. 在“CPU” 窗口中修改PC值,方法也是鼠标左键双击PC

19、寄存器的内容,输入新的PC值0x1805(编辑内容时直接输入1805),并用回车键确认。h. 单击菜单栏下的“Run=F5”按钮,程序从当前PC继续运行,重新计算0x81和0x82的和,结果在0x88中。当程序再次暂停时,可以看到AHL寄存器和0x88的内容为0x22(十进制的34),这正是我们希望的结果:-18+52=34。 i. 单击“Run=F5”按钮,程序从当前PC继续运行,完成减法运算。当程序再次暂时(断点位于0x1813),可以看到0x83和0x84单元的内容分别为FFEE和0012,B寄存器的内容为ffdc0000,而0x89的内容为ffdc(十进制-36),这正是我们希望的结果

20、:。注意,该减法操作使用了辅助寄存器寻址,所以计算结果在B寄存器的高16位。 j. 单击“Run=F5”按钮,程序从当前PC继续运行,完成整数乘法运算。当程序再次暂时(断点位于0x181d),可以看到0x81和0x82单元的内容分别为0012和0034,A寄存器的内容为000003A8,这正是我们希望的结果:18*52=936(0x3a8)。这时我们可以用1个16位的内容单元来保存结果,如将A寄存器的低16位存入0x8b单元。但如果将0x81的内容修改为0x2000(十进制的8192),在“CPU窗口”中将PC修改为1818,然后继续运行,重新计算乘法。当程序完成乘法暂停时,可以看到A寄存器的

21、内容为00068000,这也是一个正确的结果:8192*52=425984(0x68000)。此时将无法用一个16位的存贮单元来保存A寄存器中的结果。 k. 单击“Run=F5”按钮,程序从当前PC继续运行,完成小数乘法运算。当程序再次暂停时(断点位于0x1826),可以看到0x83和0x84单元的内容分别为4000和b548,A寄存器的内容为40000000,乘法的结果在B寄存器中为daa40000,这正是我们希望的结果:0.5*(-0.58374)=-0.29187(0x0daa4)。对于小数乘法,一般情况都可以用1个16位的内容单元将B寄存器的高16保存(如存入0x8c单元)。 l. 单

22、击“Run=F5”按钮,程序从当前PC继续运行,完成整数除法运算。当程序再次暂时(断点位于0x183b),可以看到0x81,0x82,0x8d和0x8e单元的内容分别为0034,0012,FFFE和0010,这正是我们希望的结果:52除以-18,商为-2(0xfffe) ,余数为16(0x10)。 m. 单击“Run=F5”按钮,程序从当前PC继续运行,完成小数除法运算。当程序再次暂停时(断点位于0x1852),可以看到0x81,0x82和0x8f单元的内容分别为4000,4ab8和6da3,这正是我们希望的结果:0.5/0.58374=0.8565457(0x6da3)。n. 如果以上程序运

23、行不正确,请检查代码是否输入正确,还可以在源代码中插入断点调试,注意对中间结果的观察。五试验报告要求 1画出实验算法流程图;2编写实验程序代码;3写出本次实验的心得体会。六思考题 (1)在减法操作中使用了辅助寄存器ar2,ar3,请说明在执行完减法计算后辅助寄存器ar2和ar3的值为多少? (2)在小数乘法中使用了置FRCT标志为1的指令。如果将该语句取消,那么B寄存器的结果是多少?想想什么时候应该设置FRCT标志? (3)如何实现无符号数的乘法? (4)请利用本实验程序计算以下算式的结果? 0.25*0.58374=?0.5/0.25 = ?4653/345 =?1. 789687/0.87

24、6 =?结果: 实验二 用定时器实现数字振荡器一实验目的 在数字信号处理中,会经常使用到正弦/余弦信号。通常的方法是将某个频率的正弦/余弦值预先计算出来后制成一个表,DSP工作时仅作查表运算即可。在本实验中将介绍另一种获得正弦/余弦信号的方法,即利用数字振荡器用叠代方法产生正弦信号。 本实验除了学习数字振荡器的DSP实现原理外,同时还学习C54X定时器使用以及中断服务程序编写。另外,在本实验中我们将使用汇编语言和C语言分别完成源程序的编写。本实验利用定时器产生一个2kHz的正弦信号。定时器被设置成每25uS产生一次中断(等效于采样速率为40K)。利用该中断,在中断服务程序中用叠代算法计算出一个

25、SIN值,并利用CCS的图形显示功能查看波形。二实验原理(1) 数字振荡器原理设一个传递函数为正弦序列sinkT,其z变换为 H(z)= 其中,A=2cosT, B=-1, C=sinT。设初始条件为0,求出上式的反Z变换得: yk=Ayk-1+Byk-2+Cxk-1这是一个二阶差分方程,其单位冲击响应即为sinkT。利用单位冲击函数xk-1的性质,即仅当k=1时,xk-1=1,代入上式得: k=0 y0 = Ay-1 + By-2 + 0 = 0 k=1 y1 = Ay0 + By-2 + c = c k=2 y2 = Ay1 + By0 + 0 = Ay1 k=3 y3 = Ay2 + B

26、y1 . . k=n yn= Ayn-1 + Byn-2在k2以后,yk能用yk-1和yk-2算出,这是一个递归的差分方程。 根据上面的说明,我们可以开始数字振荡器的设计。设该振荡器的频率为2kHz,采样率为40kHz(通过定时器设置,每隔25us中断一次,即产生一个yn),则递归的差分方程系数为: A=2cosT=2cos (2 x PI x 2000 / 40000)=2 x 0.95105652 B=-1 C=sinT=sin (2 x PI x 2000 / 40000)=0.30901699为了便于定点DSP处理,我们将所有的系数除以2,然后用16位定点格式表示为:这便是本实验中产生

27、2KHz正弦信号的三个系数。在本实验中,主程序在初始化时先计算出y1和y2,然后开放定时器中断。以后每次进入定时器中断服务程序时,利用前面的y1和y2,计算出新的有y0,通过CCS提供的图形显示工具,我们将在图形窗口中看到一个正弦信号波形。下面是初始化和中断服务程序代码片段:初始化y1和y2: ssbx FRCT ;置FRCT=1,准备进行小数乘法运算 st #INIT_A,AA ;将常数A装入变量AA st #INIT_B,BB ;将常数B装入变量BB st #INIT_C,CC ;将常数C装入变量CC pshd CC ;将变量CC压入堆栈 popd y2 ;初始化y2=CC ld AA,

28、T ;装AA到T寄存器 mpy y2,a ;y2乘系数A,结果放入A寄存器 sth a,y1 ;将A寄存器的高16位存入变量Y1中断服务程序片段: ld BB,T ;将系数B装入T寄存器 mpy y2,a ;y2乘系数B,结果放入A寄存器 ltd y1 ;将y1装入T寄存器,同时复制到y2 mac AA,a ;完成新正弦数据的计算,a寄存器中为 ; y1*AA+y2*BBsth a,1,y1 ;将新数据存入y1,因所有系数都除过2,所以在保;存结果时转移一位,恢复数据正常大小。 sth a,1,y0 ;将新正弦数据存入y0 (2)C54X的定时器操作 C54X的片内定时器利用CLKOUT时钟计

29、数,用户使用三个寄存器(TIM,PRD,TCR)来控制定时器,参见表3-1。在表3-2中列出了定时器控制寄存器的各个比特位的具体定义。VC5402的另一个定时器(定时器1)的控制寄存器分别为:0x30(TIM1),0x31(PRD1),0x32(TCR1)。 表3-1 VC5402定时器0的相关寄存器寄存器地址名称用途0024hTIM定时器寄存器,每计数一次自动减10025hPRD定时器周期寄存器,当TIM减为0后,CPU自动将PRD的值装入TIM0026hTCR定时器控制寄存器表3-2 定时器控制寄存器(TCR)bit概要比特 名称 功 能15-12 保留 读出时为011 Soft 该比特位

30、与10位配合使用以决定定时器在使用仿真调试时的状态。 Soft=0 当进入仿真调试时,定时器立即停止工作。 Soft=1 当计数器被减为0后,停止工作。10 Free 该比特位与11位配合使用以决定定时器在使用仿真调试时的状态。 Free=0 根据11比特位决定定时器状态。 Free=1 忽略11比特位,定时器不受影响。9-6 PSC 定时器预置计数器。当PSC减为0后,CPU自动将TDDR装入,然后TIM开始减1。5 TRB 定时器复位。当TRB=1时,CPU将PRD寄存器的值装入TIM寄存器,将TDDR的值 装入PSC4 TSS 定时器停止状态。当系统复位时,TSS被清除,定时器立刻开始工作。 TSS=0 表示启动定时器 TSS=1 表示停止定时器0-3 TDDR 定时器扩展周期。当PSC减到0后,CPU自动将TDDR的值装入PSC,然后TIM减 1。所以整个定时器的周期寄存器可以有20个比特(PRD+TDDR)。 从上面的介绍可以看到定时器实际上可以有20个比特的周期寄存器。它对CL

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1