《DSP原理与应用》实验指导书11102精Word下载.docx

上传人:b****6 文档编号:20692770 上传时间:2023-01-25 格式:DOCX 页数:46 大小:1.14MB
下载 相关 举报
《DSP原理与应用》实验指导书11102精Word下载.docx_第1页
第1页 / 共46页
《DSP原理与应用》实验指导书11102精Word下载.docx_第2页
第2页 / 共46页
《DSP原理与应用》实验指导书11102精Word下载.docx_第3页
第3页 / 共46页
《DSP原理与应用》实验指导书11102精Word下载.docx_第4页
第4页 / 共46页
《DSP原理与应用》实验指导书11102精Word下载.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

《DSP原理与应用》实验指导书11102精Word下载.docx

《《DSP原理与应用》实验指导书11102精Word下载.docx》由会员分享,可在线阅读,更多相关《《DSP原理与应用》实验指导书11102精Word下载.docx(46页珍藏版)》请在冰豆网上搜索。

《DSP原理与应用》实验指导书11102精Word下载.docx

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字的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

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

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