DSP实验指导书.docx
《DSP实验指导书.docx》由会员分享,可在线阅读,更多相关《DSP实验指导书.docx(54页珍藏版)》请在冰豆网上搜索。
DSP实验指导书
《DSP技术及其应用》
实验指导书
邢海涛,郑佳春编著
集美大学信息工程学院
通信技术实验室
2011年5月4日
目录
实验一CCS集成开发环境2
实验二汇编语言程序设计9
实验三FIR数字滤波器的‘C54X实现11
实验四C程序设计实验14
实验五TIDSPUSB开发系统和XM5402评估板的使用19
实验六中断系统实验22
实验七综合应用实验27
*实验八设计实验37
实验一CCS集成开发环境
一、实验目的
1.熟悉CCS开发软件的环境界面;学会开发环境的设置;
2.掌握DSP开发的构建工程,程序的编辑、编译、链接、运行、调试的方法;
3.学会数据的输入和结果分析、查看。
二、实验内容
1、CCS配置
单击桌面上的“CCSsetup”图标,打开CCS开发环境设置界面如图1-1,对于软件仿真,仅选择软件仿真器即可(图中选择的是芯片为5409的仿真器),点击“Import”导入系统,点击“saveandquit”保存退出设置界面,启动CCS即可进入编辑界面。
图1-1CCS配置对话框
2、建立工程文件
(1)工程的创建、打开和关闭。
选择菜单“Project\New”,弹出如图1-2对话框,在Project后的文本框里输入工程名即可创建新工程(这里设定工程名为lab1)。
在实验中我们规定文件名统一选为“姓_学号”(用拼音)。
选择菜单“Project\Open”和“Project\Close”,即可完成工程的打开和关闭。
(2)在工程中添加/删除文件
在当前工程窗口,以下任一操作都能添加文件到工程中:
a、选择命令ProjectAddFilestoproject...
b、在工程视图中右键单击调出关联菜单,选择AddFiles...
在工程视图中右键单击要删除的文件名,选择Removefromproject即可删除文件。
图1-2创建工程对话框
3、构建工程
工程所需文件编辑完成后,可以对该工程进行编译链接,产生可执行文件,为调试作准备。
(1)编译文件:
命令ProjectCompile或单击工程工具条“编译当前文件”按钮,仅编译当前文件,不进行链接。
(2)增量构建:
单击工程工具条“增量构建”按钮则只编译那些自上次构建后修改过的文件。
增量构建(incrementalbuild)只对修改过的源程序进行编译,先前编译过、没有修改的程序不再编译。
(3)重新构建:
命令ProjectRebuild或单击工程工具条“重新构建”按钮重新编译链接当前工程。
(4)停止构建:
命令ProjectStopBuild或单击工程工具条“停止构建”按钮停止当前的构建进程。
4、调试
(1)载入可执行程序
命令FileLoadProgram载人编译链接好的可执行程序。
用户也可以修改“ProgramLoad”属性,使得在构建工程后自动装入可执行程序。
设置方法为选择命令OptionsProgramLoad。
(2)使用反汇编工具
用户的执行程序(不论是C程序或是汇编程序)载入到目标板或仿真器时,CCS调试器自动打开一个反汇编窗口。
对每一条可反汇编的语句,反汇编窗口显示对应的反汇编指令(某些C语句一条可能对应于几条反汇编指令),语句所处地址和操作码(即二进制机器指令)。
当前程序指针PC(ProgramPoint)所在语句用彩色高亮表示。
(3)程序执行控制
A.复位——4种方法
(1)ResetDSP:
DebugResetDSP命令初始化所有的寄存器内容并暂停运行中的程序。
如果目标板不响应命令,并且用户正在使用一基于核的设备驱动,则DSP核可能被破坏,用户需要重新装入核代码。
对仿真器,CCS复位所有寄存器到其上电状态。
(2)LoadKernel:
如果用户使用一基于核的调试器(不是JTAG),则DSP核应负责与主机的通信。
若DSP核被破坏,则设备驱动程序将无法与目标板通信。
在这种情况下,用户应当重新装入DSP核。
命令:
DebugLoadKernel。
(3)Restart:
DebugRestart命令将PC恢复到当前载入程序的人口地址。
此命令不执行当前程序。
(4)GoMain:
DebugGoMain命令在主程序入口处设置一临时断点,然后开始执行。
当程序被暂停或遇到一个断点时,临时断点被删除。
此命令提供了一快速方法来运行用户应用程序。
B.执行——4种程序执行操作
(1)执行程序。
命令为DebugRun或单击调试工具条“执行”按钮,程序运行直到遇见断点为止。
(2)暂停执行。
命令为DebugHalt或单击调试工具条上的“暂停执行”按钮。
(3)动画执行。
命令为Debug,Animate或单击调试工具条上的“动画执行”按钮。
用户可以反复运行执行程序,直到遇到断点为止。
(4)自由运行。
命令为DebugRunFree。
此命令禁止所有断点,包括探针断点和Profile
断点,然后运行程序。
C.单步执行操作
(1)单步进入(快捷键F8)。
命令为DebugStepInto或单击调试工具条上的“单步进入”按钮。
当调试语句不是最基本的汇编指令时,此操作将进入语句内部(如子程序或软件中断)调试。
(2)单步执行(快捷键F1O)。
命令为DebugStepOver或单击调试工具条上的“单步执行”按钮。
此命令将函数或子程序当作一条语句执行,不进其内部调试。
(3)单步跳出(快捷键Shift+F7)。
命令为DebugStepOut或单击调试工具条上的“单步跳出”按钮。
此命令将从子程序中跳出。
(4)执行到当前光标处(快捷键Ctrl+F10)。
命令为DebugRuntoCursor或单击调试工具条上的“执行到当前光标处”按钮。
此命令使程序运行到光标所在的语句处。
5、内存、寄存器操作
(1)查看、编辑内存
CCS允许显示特定区域的内存单元数据。
方法为:
选择ViewMemory或单击调试工具条上的“显示内存数据”按钮。
在弹出对话框中输入内存变量名(或对应地址)、显示方式即可显示指定地址的内存单元。
编辑某一内存单元的方法为:
在内存窗口中鼠标左键双击需要修改的内存单元,或者选择命令EditMemoryEdit,在对话框中指定需要修改的内存单元地址和内存空间类型,并输入新的数据值即可。
注意输人数据前面加前缀“0x”为十六进制,否则为十进制。
查看:
程序代码;变量位置。
编辑链接命令文件,加入工程;重新构建工程;重复上述过程。
比较结果,体会链接命令文件的作用。
(2)CPU寄存器
选择命令ViewCPURegistersCPURegister或单击调试工具条上的CCS将在CCS窗口下方弹出一寄存器查看窗口。
有3种方法可以修改寄存器的值:
a、命令EditEditRegister。
b、在寄存器窗口双击需要修改的寄存器。
c、在寄存器窗口单击右键,从弹出的菜单中选择需要修改的寄存器。
三种方法都将弹出一编辑对话框,在对话框中指定寄存器(如果在“Register"栏中不是所期望的寄存器)和新的数值即可。
6、调试一个程序
试调试乘法累加运算程序(教材例4P95)。
(1)创建一个工程;
(2)在工程里编辑源程序文件、中断向量文件、链接命令文件,加入到工程并保存;
(3)编译、查错、链接生成可执行文件,并加载文件;
(4)查看列表文件、存储器映像文件,体会它们的作用。
(5)单步运行程序,在反汇编窗口观察程序的运行情况;观察程序的控制和转移以及加、减、乘运算;同时从存储器窗口、CPU寄存器窗口查看、分析程序运行结果,并判断结果是否正确。
(6)系统复位,观察程序的运行情况。
(7)若算法中滤波器的系数改变为:
0.9,0.7,0.5,0.3
请问:
程序如何修改?
调试程序,查看运行结果。
(8)若算法中滤波器的阶数改变为7阶,系数为:
0.9,0.8,0.7,0.6,0.5,0.4,0.3
请问:
程序如何修改?
调试程序,查看运行结果,分析判断结果的正确性。
三、实验报告要求
1.简述实验目的;
2.按实验内容附上实验结果,并对结果进行分析;
3.附上修改后的程序代码;
4.实验进行总结和讨论。
四、思考题
1.实验时你的程序代码和变量加载在什么存储器的什么位置?
2.简述列表文件和存储器映像文件包含哪些信息?
3.简述链接命令文件的作用。
附录一:
链接命令文件
*************************************************
*******dspsy1.cmd*******
*************************************************
-odsp_ccs.out
-mdsp_ccs.map
-estart
MEMORY
{
PAGE0:
EPROM1:
org=0FF80h,len=80h
EPROM2:
org=0E000h,len=100h
PAGE1:
SPRAM:
org=0060h,len=0020h
DARAM:
org=0080h,len=100h
}
SECTIONS
{
VECTOR:
>EPROM1PAGE0
.text:
>EPROM2PAGE0
.bss:
>SPRAMPAGE1
.data:
>DARAMPAGE1
STACK:
>DARAMPAGE1
}
附录二:
中断向量文件
*************************************************
******dspsy_vect.asm******
*************************************************
;========vectors.asm========
;PlugintheentrypointatRESETintheinterruptvectortable
;========unused========
.sect"VECTOR"
.refstart;Centrypoint
RESET:
;resetvector
BDstart;branchtoCentrypoint
NOP
NOP;stacksizeof200
nmi:
RETE;enableinterruptsandreturnfromone
NOP
NOP
NOP;NMI~
;softwareinterrupts
sint17.space4*16
sint18.space4*16
sint19.space4*16
sint20.space4*16
sint21.space4*16
sint22.space4*16
sint23.space4*16
sint24.space4*16
sint25.space4*16
sint26.space4*16
sint27.space4*16
sint28.space4*16
sint29.space4*16
sint30.space4*16
int0:
RETE
NOP
NOP
NOP
int1:
RETE
NOP
NOP
NOP
int2:
RETE
NOP
NOP
NOP
tint:
RETE
NOP
NOP
NOP
rint0:
RETE
NOP
NOP
NOP
xint0:
RETE
NOP
NOP
NOP
rint1:
RETE
NOP
NOP
NOP
xint1:
RETE
NOP
NOP
NOP
int3:
RETE
NOP
NOP
NOP
.end
实验二汇编语言程序设计
一、实验目的
1.在熟悉工程创建调试的基础上,进一步熟悉汇编语言程序结构、编写方法;
2.学会程序的控制、转移、子程序调用;
3.学会加、减、乘运算的编程和实现。
4.学会使用CCS的图形显示工具。
二、实验内容
1.熟悉汇编命令
熟悉2-1中常用的汇编命令,熟练区分块的类别(未初始化块、已初始化块、自定义块等)。
表2-1常用的汇编命令
汇编命令
作用
举例
.title
紧跟其后的是用双引号括起的源程序名
.title“lab2.asm”
.end
结束汇编命令
放在汇编语言源程序的最后
.text
紧随其后的是汇编语言的正文
例程中,.text段是源程序正文。
经汇编后,紧随.text后的是可执行程序代码
.data
紧跟其后的是已初始化数据
有两种数据形式:
.int和.word
.int
.int用来设置16位无符号整型量常数
table:
.word1,2,3,4
.word8,6,4,2
表示在程序存储器标号为table开始的8个单元中存放初始化数据1,2,3,4,8,6,4,2
.word
.word用来设置16位带符号整型量常数
.bss
为未初始化变量保留存储空间
.bssx,4表示在数据存储器中空出4个存储单元存放:
x1,x2,x3,x4
.sect
建立包含代码和数据的自定义段
.sect“vectors”定义向量表,紧随其后的是复位和中断向量,名为vectors
.usect
为未初始化变量保留存储空间的子定义段
STACK.usect“STACK”,10h在数据存储器中保留出16个单元作为堆栈区,名为STACK
2.程序设计
编写程序实现:
利用子程序计算0~45度(间隔0.5度)的正余弦值,再利用倍角公式求出0~90度(间隔1度)的正弦值;然后,通过复制,获得0~360度的正弦值,以获得正弦波。
3.调试程序
单步运行程序,在反汇编窗口观察程序的运行情况;体会程序的控制和转移以及加、减、乘运算;同时从存储器窗口、CPU寄存器窗口查看、分析程序运行结果是否正确。
4.图形显示结果
利用CCS的图形显示工具显示得到的正弦波。
三、提高实验
*1.完成浮点乘法运算
调试教材P96例5程序。
四、实验报告要求
1.简述实验目的;
2.按实验内容附上实验结果,并对结果进行分析;
3.对实验进行总结和讨论。
4.回答思考题。
五、思考题
1.如果要将.text定位到2000H,程序如何修改?
2.如果将.data定位到Page1程序能正常运行吗?
如果不能,请问如何修改,以调试出正确结果?
3.子程序调用时,压入堆栈的是什么内容?
实验三FIR数字滤波器的‘C54X实现
一、实验目的
1.学会FIR滤波器的DSP程序设计和实现。
二、实验内容
1.程序算法
系数对称的FIR滤波器,由于具有线性相位特性,因此应用很广,特别是对相位失真要求很高的场合,如调制解调器(MODEM)。
一个N=8的FIR滤波器,若a(n)=a(N-1-n),就是对称FIR滤波器,其输出方程为:
y(n)=aox(n)+alx(n-1)+a2x(n-2)+a3x(n-3)+a4x(n-4)+a5x(n-5)+a6x(n-6)+a7x(n-7)
总共有8次乘法和7次加法。
如果改写成:
y(n)=ao[x(n)+x(n-7)]+al[x(n-1)+x(n-6)]+a2[x(n-2)+x(n-5)]+a3[X(n-3)+x(n-4)]
变成4次乘法和7次加法。
可见乘法运算的次数减少了一半。
这是对称FIR的又一个优点。
对称FIR滤波器’C54x,实现要点如下:
(1)在数据存储器中开辟两个循环缓冲区:
New循环缓冲区存放N/2=4个新数据;
O1d循环缓冲区中存放老数据。
循环缓冲区的长度为N/2。
(2)设置循环缓冲区指针:
AR2指向New缓冲区中最新的数据;AR3指向O1d缓冲区中最老的数据。
(3)在程序存储器中设置系数表。
数据存储器程序存储器
New循环缓冲区O1d循环缓冲区系数表
80hx(n)←AR288hx(n-4)COFFa0低地址
81hx(n-3)89hx(n-5)a1
82hx(n-2)8Ahx(n-6)a2
83hx(n-1)8Bhx(n-7)←AR3a3高地址
(4)(AR2)+(AR3)→AH(累加器A的高位)
(AR2)-1→AR2,(AR3)-1→AR3
(5)将累加器B清零,重复执行4次(i=0,1,2,3,):
(AH)*系数ai+(B)→B,系数指针(PAR)加1,
(AR2)+(AR3)→AH,AR2和AR3减1
(6)保存和输出结果(结果在BH中)。
(7)修正数据指针,让AR2和AR3分别指向New缓冲区最新数据和O1d缓冲区中最老的数据。
(8)用New缓冲区中最老的数据替代Old缓冲区中最老的数据。
O1d缓冲区指针减1。
(9)输入一个新数据替代NeW缓冲区中最老的数据。
重复执行第(4)~(9)步。
2.程序代码
在编程中要用到FIRS(对称有限冲激响应滤波器)指令,其操作如下:
FIRxmem,Ymem,Pmad
执行Pmad→PAR
当(RC)≠0
(B)+(A(31~16))×(由PAR寻址Pmem)→B
((Xmem)+(Ymem))<<16→A
(PAR)+1→PAR
(RC)-1→RC
FIRS指令在同一个机器周期内,通过C和D总线读2次数据存储器,同时通过D总线读一个系数。
对称FIR滤波器(N=8)的源程序清单如下:
.mmregs
.defstart
.bssy,1
x_new.usect“DATAl”,4
x_o1d.usect“DATA2”,4
size.set4
PA0.set0
PAl.set1
.data
COEF.word1*32768/10,2*32768/10
.word3*32768/10,4*32768/10
.text
Start:
LD#y,DP
SSBXFRCT
STM#x_new,AR2;AR2指向新缓冲区第1个单元
STM#x_o1d+(size-1),AR3;AR3指向老缓冲区最后1个单元
STM#size,BK;循环缓冲区长度=Size
STM#-1,AR0;仿效*ARn-%
LD#x_new,DP
PORTRPAl,#x_new;输入X(n)
FIR:
ADD*AR2+0%,*AR3+0%,A;AH=x(n)+x(n-7)(第一次)
RPTZB,#(size-1);B=0,下条指令执行size次
FIRS*AR2+0%,*AR3+0%,COEF;B+=AH*a0,AH=X(n-1)+x(n-6),…
STHB,@y;保存结果
PORTW@y,PA0;输出结果
MAR*+AR2
(2)%;修正AR2,指向NEW缓冲区最老的数据
MAR*AR3+%;修正AR3,指向OLD缓冲区最老的数据
MVDD*AR2,*AR3+0%;新缓冲区向老缓冲区传送一个数
BDFIR
PORTRPAl,*AR2;输入新数据至新缓冲区
.END
3.试用窗函数法设计一线性相位数字低通滤波器,其技术指标为:
3dB截止频率为:
0.2PI;
阻带截止频率为:
0.4PI;阻带最小衰减为-30dB;
并编程用DSP实现。
要求:
1)设计出FIR滤波器,并制成DSP可用的数据文件;(可使用MATLAB)
2)编写出所有的DSP程序(.asm、.cmd等);
3)生成输入数据;(可使用MATLAB)
4)调试程序,显示滤波结果,验证结果的正确性。
三、实验报告要求
1.简述实验目的;
2.按实验内容附上实验结果,并对结果进行分析;
3.实验进行总结和讨论。
4.回答思考题。
四、思考题
1.如何对设计出FIR滤波器的系数处理成在DSP可用的数据文件?
写出处理步骤。
2.如果设计结果滤波器的阶数N为100,请问程序应如何修改?
3.写出以下指令的具体操作:
RPTZB,#(size-1)
FIRS*AR2+0%,*AR3+0%,COEF
MAR*+AR2
(2)
实验四C程序设计实验
一、实验目的
1.学会DSP的C语言程序设计的基本方法;
2.学会DSP的C语言程序初始化。
3.学会DSP的C语言程序中断编程及调试方法。
二、实验内容
1.C程序中断、定时器实验
编写程序实现外部中断、定时器中断响应,中断响应时输出提示信息。
2.如果要将中断向量要配置到:
2080~20FFh,请问程序如何修改?
请修改程序,调试出正确的结果。
3.如果要使用外部中断1,实现输出:
“你的学号、姓名”,请修改程序,调试出正确的结果。
4.修改程序实现10000微妙的定时,请修改程序,调试出正确的结果。
*5.FFTC编程实现
离散付氏变换DFT是可以用数字方式来实现的时域到频域的变换,FFT是DFT的一种高效运算方法,它把N2次运算减少为(n/2)log2N。
使DFT的运算大大简化,运算时间一般可以缩短一、二个数量级。
一般情况下,都假定输入序列为复数。
本实验主要是编写一个可以执行8~1024复数点FFT的实用程序并上机调试。
用C语言编程实现FFT,调试、分析结果。
三、实验报告要求
1.简述实验目的;
2.按实验内容附上实验结果,并对结果进行分析;
3.实验进行总结和讨论。
四、思考题
1.如果要使用软件中断#18,实现输出:
“你的学号、姓名”,请问如何修改程序代码?
写出程序代码。
2.如果要实现1秒定时,请问如何修改程序代码?
写出程序代码。
主要参考程序清单:
***************************************************************************
/*cexam.C*/
/*TMS320C5409DSP*/
/*INT2INTERRUPTff80~ffffH*/
/*PROGRAMDARAM5000H*/
/*DATADARAM1000H*/
/***************************************************************************/
#include
#defineSWWSR(volatileunsignedint*)0x0028
#defineBSCR(volatileunsignedint*)0x0029
#definePRD(volatileunsignedint*)0x0025
interruptvoidint2_handler()
{
longintj;
puts("INT