《DSP原理与应用》实验指导书11102精Word下载.docx
《《DSP原理与应用》实验指导书11102精Word下载.docx》由会员分享,可在线阅读,更多相关《《DSP原理与应用》实验指导书11102精Word下载.docx(46页珍藏版)》请在冰豆网上搜索。
![《DSP原理与应用》实验指导书11102精Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/25/d64e9a82-3e1a-484e-ab6a-8c9669f0d4e8/d64e9a82-3e1a-484e-ab6a-8c9669f0d4e81.gif)
6.编写主程序文件。
单击工程管理器中的工程example2.pjt左边的+号展开example2.pjt工程,再单
击文件夹Source左边的+号,如图1-5。
找到并双击example2.asm,在界面右边出现的example2.asm文本编辑窗口中输入或复制主程序(注释部分可不输入)。
文件内容如下:
1-5
-2-
*******计算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:
.bss:
SPRAMPAGE1/*将.text段映射或定位到PAGE1的SPRAM区*/
STACK:
DARAMPAGE1/*将.text段映射或定位到PAGE1的DARAM区*/
.vectors:
VECSPAGE0/*将.vectors段映射或定位到PAGE0的VECS区*/
8.编写中断向量表文件。
在工程管理器中双击example2.pjt工程中的vectors.asm,将出现vectors.asm文本编辑窗口。
vectors.asm"
.refstart;
声明要引用其他程序中定义的标号start
.sect"
.vectors"
定义初始化的段名.vectors,这一种伪指令声明的段与.data和.text功能一致
Bstart;
无条件转移到标号start所在的地方执行程序
.end
-3-
9.对工程中的文件进行编译和链接。
点击菜单Project-RebuildAll,对工程中的所有文件进行编译、链
接。
工程中的文件如果编译链接成功,会生成example2.out文件;
如果不成功,会出现出错信息,这时应按照提示的出错信息对文件进行修改,然后再RebuildAll。
10.装载可执行文件。
要让程序代码在DSP内部运行必需将生成的*.out文件装载到DSP内部。
点击菜单File-LoadPrograme,选择并双击刚才生成的example2.out文件将程序装载到DSP的内部存储器中。
11.运行程序,查看并记录相关结果。
点击菜单Debug-Run或按功能键F5运行程序。
①查看数据的保存情况。
点击菜单View-Memory,会出现图1-6(a)所示的“MemoryWindowOptions”对话框,按图1-6(a)设置Address=0x1000(为什么要设置成Address=0x1000?
),Page=Data。
点击OK按钮,观察出现的如图1-6(b)所示的“Memory”对话框,这个对话框显示的是变量在数据存储器中的地址与值。
请思考:
为什么.bss的地址是0x1000,变量y的地址是0x1005,变量x的地址又是多少呢?
图1-6(a)(b)
②查看程序的保存情况。
点击菜单View-Memory,按图1-7(a)设置Address=0x0090(为什么要设置成Address=0x0090?
),Page=Program。
点击OK按钮,观察出现的如图1-7(b)所示的“Memory”对话框,这个对话框显示的是可执行程序在程序存储器中的地址与指令代码。
为什么.text段的地址是0x0090?
标号end的地址是0x009C?
标号SUM的地址是0x009E?
标号loop的地址是0x00A2?
.data段的地址是0x00A8?
图1-7(a)(b)
③查看寄存器的状况。
第一步:
点击菜单View-Registers-CPURegisters。
基本界面如图1-8。
-4-
图1-8
第二步:
点击菜单File-LoadProgram重新装载可执行程序*.out。
第三步:
点击菜单Debug-StepInto或按F8,观察程序在单步运行时(单步运行指的是按一次F8程序执行一步,再按一次F8程序再执行一步),CPURegisters的变化。
单步运行有助于进一步了解程序运行机理及用于程序调试。
④查看指令代码。
再一次装载并运行程序,点击菜单View-Disassembly,查看并记录指令及其对应的指令代码并进行理解。
图1-9
12.改变主程序example2.asm中x1~x5的值(自定),重新执行9~11①。
记录x1~x5、y的值并验算。
13.修改example2.cmd(自定义存储器配置及段的定位),重新执行9~11②。
记录程序、数据、标号、中断矢量的地址空间。
二、思考题---见实验步骤11、12、13的要求。
-5-
实验二算术运算与数据操作的汇编语言程序设计实验
一、实验内容与步骤(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×
x3×
x4=0.2×
(-0.4)×
0.25×
0.66。
三、参考程序
1)用单操作数指令计算y=(a1*x1+a2*x2+·
·
a19*x19+a20*x20)
sy21.asm"
.mmregs
30H.bssa,20.bssx,20.bssy,2.datatable:
.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.textstart:
STM#a,AR1
done:
end:
RPT#39
MVPDtable,*AR1+LD#0,BSTM#a,AR2STM#x,AR3STM#19,BRCRPTBdone-1LD*AR2+,TMPY*AR3+,AADDA,BSTHB,*(y)STLB,*(y+1)Bend.end
;
单操作数指令;
单操作数指令
2)用"
长字运算"
实现32位加法运算Z=X+Y
.titleSTACKtable:
"
sy22.asm"
.mmregs.usect"
10H.bssxhi,2,1,1.bssyhi,2,1,1.bsszhi,2,1,1.defstart.data
.long16782345H,10200345H.text
STM#0,SWWSR
STM#STACK+10H,SPSTM#xhi,AR1RPT#3MVPDtable,*AR1+DLD*(xhi),ADADD*(yhi),ADSTA,*(zhi)Bend.end
3)用并行指令计算z=x+y,f=e+d
.titleSTACK
sy23.asm"
10H.bssx,3.bssd,3.defstart.data
start:
.word0123H,1027H,0,1020H,0345H,0
.text
STM#STACK+10H,SPSTM#x,AR1RPT#5MVPDtable,*AR1+
-6-
STM#x,AR5STM#d,AR2LD#0,ASMLD*AR5+,16,AADD*AR5+,16,ASTA,*AR5
并行指令
||LDADDSTHB.end
*AR2+,B*AR2+,16,BB,*AR2end
4)小数运算。
计算y=a1*x1+a2*x2+a3*x3+a4*x4
*********a1=0.1,a2=0.2,a3=-0.3,a4=0.2,x1=0.8,x2=0.6,x3=-0.4,x4=-0.2****************.title"
sy24.asm"
.word-4*32768/10;
-0.4.mmregs.word-2*32768/10;
-0.2STACK.usect"
10H.text.bssa,4start:
SSBXFRCT.bssx,4STM#a,AR1.bssy,1RPT#7.defstartMVPDtable,*AR1+.dataSTM#x,AR2table:
.word1*32768/10;
0.1STM#a,AR3.word2*32768/10;
0.2RPTZA,#3.word-3*32768/10;
-0.3MAC*AR2+,*AR3+,A.word4*32768/10;
0.4STHA,*(y).word8*32768/10;
0.8end:
Bend.word6*32768/10;
0.6.end
5)除法运算。
|被除数|<
|除数|,商为小数。
计算0.4÷
(-0.8)的值。
.title.mmregsSTACK.usect.bss.bss.bss.datatable:
.word.word.def.textstart:
LD
STM
RPTMVPDLDMPYAABSSTHLDABSRPTSUBCXCNEGASTLend:
B.end
STACK
sy25.asm"
10Hnum,1;
分子den,1;
分母quot,1;
商4*32768/10-8*32768/10start#0020H,DP#num,AR1#1
table,*AR1+@den,16,A@numAA,@den@num,16,AA#14@den,A1,BLTA,@quotend
-128;
1024
设置数据页指针,使DP指向第31页(1000H处)
传送2个数据至分子、分母;
将分母移到累加器A(31~16)
(num)*(A(31~16))->
B,获取商的符号;
(在累加器B中);
分母取绝对值
分母取绝对值存回原处
将分子移到累加器A(32~16);
分子取绝对值
15次减法循环,完成除法;
如果B<
0(商为负数),则需要变号;
保存商
6)除法运算。
|被除数|>
=|除数|,商为整数。
计算16384÷
512的值。
.title
sy26.asm"
10H
-7-
.bssnum,1
.bssden,1
.bssquot,1
.data
.word66*32768/100
.word-33*32768/100
.defstart
LD#0020H,DP
STM#num,AR1
RPT#1
MVPDtable,*AR1+
LD@den,16,A
MPYA@num
ABSA
STHA,@den
LD@num,A
RPT#15
SUBC@den,A
XC1,BLT
NEGA
STLA,@quot
Bend
分子;
分母;
商;
16384;
512;
指定数据页指针;
将分母移到累加器A(31~16);
分母取绝对值;
分母取绝对值存回原处;
分子取绝对值;
16次减法循环,完成除法;
7)浮点运算。
计算x1*x2=0.3*(-0.8)
***x1:
被乘数,m2:
乘数的尾数,x2:
乘数,ep:
乘积的指数,e1:
被乘数的指数******************
***mp:
乘积的尾数,m1:
被乘数的尾数,product:
乘积,e2:
乘数的指数,temp:
暂存单元***
sy27.asm"
EXPA
.mmregsSTT,@e2;
保存x2的指数.defstartNORMA
100STHA,@m2;
保存x2的尾数
.bssx1,1CALLMULT;
调用浮点乘法子程序.bssx2,1end:
.bsse1,1MULT:
SSBXFRCT
.bssm1,1SSBXSXM
.bsse2,1LD@e1,A;
指数相加
.bssm2,1ADD@e2,A
.bssep,1STLA,@ep;
乘积指数->
ep.bssmp,1LD@m1,T;
尾数相乘
.bssproduct,1MPY@m2,A;
乘积尾数在累加器A中.bsstemp,1EXPA;
对尾数乘积规格化.dataSTT,@temp;
规格化时产生的指数->
temptable:
.word3*32768/10;
0.3NORMA
.word-8*32768/10;
-0.8STHA,@mp;
保存乘积尾数在mp中.textLD@temp,A;
修正乘积指数start:
STM#STACK+100,SP;
设置堆栈指针ADD@ep,A;
(ep)+(temp)->
ep
LD#x1,DP;
设置DP指针为x1所在页STLA,@ep;
保存乘积指数在ep中MVPDtable,@x1;
将x1和x2传送到数据存储器NEGA;
将浮点乘积转换成定点数MVPDtable+1,@x2STLA,@temp;
乘积指数反号,并且加载到T寄存器LD@x1,16,A;
将x1规格化为浮点数LD@temp,T;
再将尾数按T移位EXPALD@mp,16,A
STT,@e1;
保存x1的指数NORMA
NORMASTHA,@product;
保存定点乘积STHA,@m1;
保存x1的尾数RET
LD@x2,16,A;
将x2规格化为浮点数.end
8)链接配置文件参照实验一中的example2.cmd,但要作简单修改。
中断向量表文件参照实验一中的vectors.asm,可不作修改。
-8-
实验三信号发生器设计
一、实验原理
采用查找表的方法产生周期信号。
在DSP的内部RAM中放上一个周期的正弦波数据表,通过程序按一定时间间隔将表中的数据写到D/A端口,在D/A输出端就可以得到周期性的正弦波信号。
更改查找表的数据,就可以在D/A输出端得到不同的周期信号。
二、实验内容与步骤
2、采用查找表的方式产生正弦波、方波、三角波等常见波形。
1)在CCS环境下新建DA工程和五个文件main.asm、c54init.asm、C54.inc、memory.cmd、vectors.asm。
2)分别编辑五个文件并将他们添加到DA工程中。
参考程序如下。
①主程序main.asm
DA_ADDR.set0x0002;
定义符号DA_ADDR表示D/A端口地址
.data.word255,254,252,249,245,239,233,225.word217,207,197,186,174,162,150,137.word.word.word.word124,112,99,87,75,64,53,4334,26,19,13,8,4,1,00,1,4,8,13,19,26,3443,53,64,75,87,99,112,124sin_table:
在这里放置一个周期的正弦波的64个离散值.mmregs.def_c_int00.includec54.inc.refc54init.word137,150,162,174,186,197,207,217.word225,233,239,245,249,252,254,255
.bssDA_DATA,1;
声明变量DA_DATA作D/A缓冲区
.bssDA_NUM,1;
声明变量DA_NUM作D/A计数器
progsys"
自定义初始化段progsys
.align0x10;
调整SPC,下面的程序代码放置在存储器中时,起始地址对准16字的