DSP原理与应用实验指导书.docx
- 文档编号:6577033
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:66
- 大小:1.30MB
DSP原理与应用实验指导书.docx
《DSP原理与应用实验指导书.docx》由会员分享,可在线阅读,更多相关《DSP原理与应用实验指导书.docx(66页珍藏版)》请在冰豆网上搜索。
DSP原理与应用实验指导书
2010秋季学期“DSP技术与实验”实验教学资料
实验一CCS集成环境的熟悉---2学时
实验二算术运算与数据操作的汇编语言程序设计---2学时
实验三信号发生器的设计---2学时
实验四IIR滤波器的DSP实现---2学时
实验五FIR滤波器的DSP实现---2学时
实验六FFT的DSP实现---2学时
实验七综合实验暨实验考查---4学时
实验一 CCS集成开发环境的熟悉
一、实验内容及步骤
通过编写程序计算y=x1+x2+x3+x4+x5练习CCS2(‘C5000)的使用。
1.在D盘或E盘建立一个自己的文件夹,如e:
\05136101,该文件夹用英文或数字命名。
后面所有与实验内容有关的工程与程序都在此文件夹下保存或操作。
2.运行CCS2(‘C5000)进入CCS集成开发环境。
以下操作如无特殊声明一般都在此环境下操作。
3.新建工程。
点击主菜单Project-New,会出现图1-1所示的ProjectCreation对话框。
参照图1-1按如下顺序进行设置或操作:
Location:
e:
\05136101
Project:
example2
点击完成按钮即可。
4.新建并保存主程序文件、链接命令文件和中断向量表文件。
本次实验三个文件的参考名称为:
主程序文件example2.asm、链接命令文件example2.cmd、中断向量表文件vectors.asm。
点击菜单File-New-SourceFile打开文本编辑窗口Untitled1,如图1-2。
用File-Save功能将其保存到e:
\05136101\example2中,其中文件名称为example2,保存类型为*.asm,如图1-3。
用同样的方法新建并保存文件example2.cmd和vectors.asm。
5.为新建工程添加主程序文件、中断向量表文件和链接命令文件。
在工程管理器中(图1-2中的红色方框处)右键单击example2.pjt,选择AddFilestoProject,在出现的如图1-4所示的AddFilestoProject对话框中查找并选中刚才建立的三个文件example2.asm,example2.cmd,vectors.asm,点击打开按钮将它们一起添加到该工程中去。
6.编写主程序文件。
单击工程管理器中的工程example2.pjt左边的+号展开example2.pjt工程,如图1-5。
找到并双击example2.asm,在出现的example2.asm文本编辑窗口中输入或复制文件内容(注释部分可不输入)。
文件内容如下:
*******计算y=x1+x2+x3+x4+x5的程序**********************************************
.title"example2.asm";伪指令。
用于格式化输出清单文件,声明在每页的顶部打印文件标题
.mmregs;伪指令。
声明CPU寄存器名称
STACK.usect"STACK",10H;伪指令。
自定义未初始化段STACK及大小(10H个字),最左边的STACK是标号
.bssx,5;伪指令。
声明数组x,5个字
.bssy,1;伪指令。
声明变量y,1个字
.defstart;伪指令。
声明本文件中的标号start能被别的文件(程序)引用
.data;伪指令,指示下面的代码为数据段,通常包含初始化的数据(常数)。
table:
.word10,20,3,4,5;伪指令。
声明5个16位整数类型的常数。
table是标号。
.text;伪指令,指示下面的代码为文本段,通常包含可执行的代码。
start:
STM#0,SWWSR;SWWSR=0,插入0个等待状态。
start是标号。
STM#STACK+10H,sp;sp=#STACK+10H,设置堆栈指针指向堆栈段的底部
STM#x,AR1;AR1=#x或AR1指向数组x
RPT#4;下一条指令重复执行4+1=5次
MVPDtable,*AR1+;数据传送。
程序存储器中的table数据表→AR1+指向的数据存储器
LD#0,A;累加器A清零
CALLSUM;调用求和子程序SUM
end:
Bend;无条件转移到标号end所在地方执行程序
SUM:
;标号,指示求和子程序SUM从这里开始
STM#x,AR3;AR3指向数组x
STM#4,AR2;AR2=4
loop:
ADD*AR3+,A;*AR3+A→A,然后AR3=AR3+1。
loop是标号。
BANZloop,*AR2-;如果AR2的值不为0,AR2=AR2-1,跳转到loop处执行;否则执行下一条指令
STLA,*(y);y=AL
RET;子程序返回
.end;伪指令。
指示汇编结束
7)编写链接命令文件。
在工程管理器中双击example2.pjt工程中的example2.cmd,将出现example2.cmd文本编辑窗口。
在该文本编辑窗口中输入或复制文件内容。
文件内容如下:
vectors.obj/*声明要链接的文件---中断向量表文件的目标文件*/
example2.obj/*声明要链接的文件---主程序文件的目标文件*/
-oexample2.out/*声明链接产生的可执行文件名称,默认为a.out*/
-mexample2.map/*声明链接产生的存储器映射文件*/
-estart/*声明主程序入口*/
MEMORY/*关键字加一对{},存储器配置*/
{
PAGE0:
/*程序存储区*/
EPROM:
org=0090Hlen=0F70H/*定义EPROM区,起始地址0090H,长度0F70H*/
VECS:
org=0080Hlen=0010H/*定义VECS区,起始地址0080H,长度0010H*/
PAGE1:
/*数据存储区*/
SPRAM:
org=1000Hlen=1000H/*定义SPRAM区,起始地址1000H,长度1000H*/
DARAM:
org=2000Hlen=2000H/*定义DARAM区,起始地址2000H,长度2000H*/
}
SECTIONS/*关键字加一对{},定位段*/
{
.text:
>EPROMPAGE0/*将.text段映射或定位到PAGE0的EPROM区*/
.data:
>EPROMPAGE0/*将.text段映射或定位到PAGE0的EPROM区*/
.bss:
>SPRAMPAGE1/*将.text段映射或定位到PAGE1的SPRAM区*/
STACK:
>DARAMPAGE1/*将.text段映射或定位到PAGE1的DARAM区*/
.vectors:
>VECSPAGE0/*将.vectors段映射或定位到PAGE0的VECS区*/
}
8.编写中断向量表文件。
在工程管理器中双击example2.pjt工程中的vectors.asm,将出现vectors.asm文本编辑窗口。
在该文本编辑窗口中输入或复制文件内容。
文件内容如下:
.title"vectors.asm"
.refstart;伪指令。
声明要引用其他程序中定义的标号start
.sect".vectors";伪指令。
定义初始化的段名.vectors,这一种伪指令声明的段与.data和.text功能一致
Bstart;无条件转移到标号start所在的地方执行程序
.end
9.对工程中的文件进行编译和链接。
点击菜单Project-RebuildAll,对工程中的所有文件进行编译、链接。
工程中的文件如果编译链接成功,会生成example2.out文件;如果不成功,会出现出错信息,这时应按照提示的出错信息对文件进行修改,然后再RebuildAll。
10.装载可执行文件。
要让程序代码在DSP内部运行必需将生成的*.out文件装载到DSP内部。
点击菜单File-LoadPrograme,选择并双击刚才生成的example2.out文件将程序装载到DSP的内部存储器中。
11.运行程序,查看并记录相关结果。
点击菜单Debug-Run运行程序。
①查看数据的保存情况。
点击菜单View-Memory,会出现图1-6(a)所示的“MemoryWindowOptions”对话框,按图1-6(a)设置Address=0x1000(为什么?
),Page=Data。
点击OK按钮,观察出现的如图1-6(b)所示的“Memory”对话框,这个对话框显示的是变量在数据存储器中的地址(是如何确定的?
)与值。
图1-6(a)(b)
②查看程序的保存情况。
点击菜单View-Memory,按图1-7(a)设置Address=0x0090(为什么?
),Page=Program。
点击OK按钮,观察出现的如图1-7(b)所示的“Memory”对话框,这个对话框显示的是可执行程序在程序存储器中的地址(是如何确定的?
)与指令代码。
图1-7(a)(b)
③查看寄存器的状况。
第一步:
点击菜单View-Registers-CPURegisters。
基本界面如图1-8。
图1-8
第二步:
点击菜单File-LoadProgram。
第三步:
点击菜单Debug-StepInto或按F8,观察程序在单步运行时,CPURegisters的变化。
④查看指令代码。
装载并运行程序,点击菜单View-Disassembly,查看并记录指令及其对应的指令代码并进行理解。
图1-9
12.改变程序中x1~x5的值(自定),重新执行9~11①。
记录x1~x5、y的值并验算。
13.修改example2.cmd(自定),重新执行9~11②。
记录程序、数据、标号、中断矢量的地址空间。
二、实验习题---见实验步骤11、12、13的要求。
实验二算术运算与数据操作的汇编语言程序设计实验
一、实验内容与步骤(2、3、4、5、7选做,6、8必做)
1、运行CCS。
2、编写程序,计算y=x1+x2+…+x10(xi的值自己定义)。
3、编写程序,计算z=x+y-w、y=mx+bx、y=x1×a2-x2×a2(自变量的值自己定义)。
4、编写程序,计算y=a1x1+a2x2+…+a40x40(aixi的值自己定义)。
5、编写程序,用长字运算指令实现Z32=X32+Y32,用并行运算指令实现z=x+y和f=e+d。
6、编制程序,计算y=a1x1+a2x2+…+a10x10,其中数据均为小数(aixi的值自己定义)。
7、分别编写程序,计算(-0.24)÷0.48和1024÷128。
8、编写浮点乘法程序,计算x1×x2×x3=0.2×(-0.4)×0.25。
上述每个实验内容基本操作步骤与要求同实验一的步骤3~11①。
二、实验习题---编写浮点乘法程序,用调用子程序的方法计算x1×x2×x3×x4=0.2×(-0.4)×0.25×0.66。
三、参考程序
1)用单操作数指令计算y=(a1*x1+a2*x2+···a19*x19+a20*x20)
.title"sy21.asm"
.mmregs
STACK.usect"STACK",30H
.bssa,20
.bssx,20
.bssy,2
.data
table:
.word1,2,3,4,5,6,7,8,9,10,11
.word12,13,14,15,16,17,18,19,20
.word21,22,23,24,25,26,27,28
.word29,30,1,2,3,4,5,6,7,8,9,10
.defstart
.text
start:
STM#a,AR1
RPT#39
MVPDtable,*AR1+
LD#0,B
STM#a,AR2
STM#x,AR3
STM#19,BRC
RPTBdone-1
LD*AR2+,T;单操作数指令
MPY*AR3+,A;单操作数指令
ADDA,B
done:
STHB,*(y)
STLB,*(y+1)
end:
Bend
.end
2)用"长字运算"实现32位加法运算Z=X+Y
.title"sy22.asm"
.mmregs
STACK.usect"STACK",10H
.bssxhi,2,1,1
.bssyhi,2,1,1
.bsszhi,2,1,1
.defstart
.data
table:
.long16782345H,10200345H
.text
start:
STM#0,SWWSR
STM#STACK+10H,SP
STM#xhi,AR1
RPT#3
MVPDtable,*AR1+
DLD*(xhi),A
DADD*(yhi),A
DSTA,*(zhi)
end:
Bend
.end
3)用并行指令计算z=x+y,f=e+d
.title"sy23.asm"
.mmregs
STACK.usect"STACK",10H
.bssx,3
.bssd,3
.defstart
.data
table:
.word0123H,1027H,0,1020H,0345H,0
.text
start:
STM#0,SWWSR
STM#STACK+10H,SP
STM#x,AR1
RPT#5
MVPDtable,*AR1+
STM#x,AR5
STM#d,AR2
LD#0,ASM
LD*AR5+,16,A
ADD*AR5+,16,A
STA,*AR5;并行指令
||LD*AR2+,B
ADD*AR2+,16,B
STHB,*AR2
end:
Bend
.end
4)小数运算。
计算y=a1*x1+a2*x2+a3*x3+a4*x410组
*********a1=0.1,a2=0.2,a3=-0.3,a4=0.4,x1=0.8,x2=0.6,x3=-0.4,x4=-0.2****************
.title"sy24.asm"
.mmregs
STACK.usect"STACK",10H
.bssa,4
.bssx,4
.bssy,1
.defstart
.data
table:
.word1*32768/10;0.1
.word2*32768/10;0.2
.word-3*32768/10;-0.3
.word4*32768/10;0.4
.word8*32768/10;0.8
.word6*32768/10;0.6
.word-4*32768/10;-0.4
.word-2*32768/10;-0.2
.text
start:
SSBXFRCT
STM#a,AR1
RPT#7
MVPDtable,*AR1+
STM#x,AR2
STM#a,AR3
RPTZA,#3
MAC*AR2+,*AR3+,A
STHA,*(y)
end:
Bend
.end
5)除法运算。
|被除数|<|除数|,商为小数。
计算0.4÷(-0.8)的值。
.title"sy25.asm"
.mmregs
STACK.usect"STACK",10H
.bssnum,1;分子
.bssden,1;分母
.bssquot,1;商
.data
table:
.word4*32768/10;-128
.word-8*32768/10;1024
.defstart
.text
start:
LD#0020H,DP;设置数据页指针,使DP指向第31页(1000H处)
STM#num,AR1
RPT#1
MVPDtable,*AR1+;传送2个数据至分子、分母
LD@den,16,A;将分母移到累加器A(31~16)
MPYA@num;(num)*(A(31~16))->B,获取商的符号
;(在累加器B中)
ABSA;分母取绝对值
STHA,@den;分母取绝对值存回原处
LD@num,16,A;将分子移到累加器A(32~16)
ABSA;分子取绝对值
RPT#14;15次减法循环,完成除法
SUBC@den,A
XC1,BLT;如果B<0(商为负数),则需要变号
NEGA
STLA,@quot;保存商
end:
Bend
.end
6)除法运算。
|被除数|>=|除数|,商为整数。
计算16384÷512的值。
.title"sy26.asm"
.mmregs
STACK.usect"STACK",10H
.bssnum,1;分子
.bssden,1;分母
.bssquot,1;商
.data
table:
.word66*32768/100;16384
.word-33*32768/100;512
.defstart
.text
start:
LD#0020H,DP;指定数据页指针
STM#num,AR1
RPT#1
MVPDtable,*AR1+;传送2个数据至分子、分母
LD@den,16,A;将分母移到累加器A(31~16)
MPYA@num;(num)*(A(31~16))->B,获取商的符号
;(在累加器B中)
ABSA;分母取绝对值
STHA,@den;分母取绝对值存回原处
LD@num,A;将分子移到累加器A(32~16)
ABSA;分子取绝对值
RPT#15;16次减法循环,完成除法
SUBC@den,A
XC1,BLT;如果B<0(商为负数),则需要变号
NEGA
STLA,@quot;保存商
end:
Bend
.end
7)浮点运算。
计算x1*x2=0.3*(-0.8)
***x1:
被乘数,m2:
乘数的尾数,x2:
乘数,ep:
乘积的指数,e1:
被乘数的指数******************
***mp:
乘积的尾数,m1:
被乘数的尾数,product:
乘积,e2:
乘数的指数,temp:
暂存单元***
.title"sy27.asm"
.mmregs
.defstart
STACK.usect"STACK",100
.bssx1,1
.bssx2,1
.bsse1,1
.bssm1,1
.bsse2,1
.bssm2,1
.bssep,1
.bssmp,1
.bssproduct,1
.bsstemp,1
.data
table:
.word3*32768/10;0.3
.word-8*32768/10;-0.8
.text
start:
STM#STACK+100,SP;设置堆栈指针
LD#x1,DP;设置DP指针
MVPDtable,@x1;将x1和x2传送到数据存储器
MVPDtable+1,@x2
LD@x1,16,A;将x1规格化为浮点数
EXPA
STT,@e1;保存x1的指数
NORMA
STHA,@m1;保存x1的尾数
LD@x2,16,A;将x2规格化为浮点数
EXPA
STT,@e2;保存x2的指数
NORMA
STHA,@m2;保存x2的尾数
CALLMULT;调用浮点乘法子程序
end:
Bend
MULT:
SSBXFRCT
SSBXSXM
LD@e1,A;指数相加
ADD@e2,A
STLA,@ep;乘积指数->ep
LD@m1,T;尾数相乘
MPY@m2,A;乘积尾数在累加器A中
EXPA;对尾数乘积规格化
STT,@temp;规格化时产生的指数->temp
NORMA
STHA,@mp;保存乘积尾数在mp中
LD@temp,A;修正乘积指数
ADD@ep,A;(ep)+(temp)->ep
STLA,@ep;保存乘积指数在ep中
NEGA;将浮点乘积转换成定点数
STLA,@temp;乘积指数反号,并且加载到T寄存器
LD@temp,T;再将尾数按T移位
LD@mp,16,A
NORMA
STHA,@product;保存定点乘积
RET
.end
8)链接配置文件参照实验一中的example2.cmd,但要作简单修改。
中断向量表文件参照实验一中的vectors.asm,可不作修改。
实验三信号发生器设计
一、实验原理
采用查找表的方法产生周期信号。
在DSP的内部RAM中放上一个周期的正弦波数据表,通过程序按一定时间间隔将表中的数据写到D/A端口,在D/A输出端就可以得到周期性的正弦波信号。
更改查找表的数据,就可以在D/A输出端得到不同的周期信号。
二、实验内容与步骤
1、运行CCS。
2、采用查找表的方式产生正弦波、方波、三角波等常见波形。
1)在CCS环境下新建DA工程和五个文件main.asm、c54init.asm、C54.inc、memory.cmd、vectors.asm。
2)分别编辑五个文件并将他们添加到DA工程中。
参考程序如下。
①主程序main.asm
.mmregs
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 原理 应用 实验 指导书