DSP技术与实验思考题答案.docx

上传人:b****6 文档编号:4753654 上传时间:2022-12-08 格式:DOCX 页数:15 大小:249.73KB
下载 相关 举报
DSP技术与实验思考题答案.docx_第1页
第1页 / 共15页
DSP技术与实验思考题答案.docx_第2页
第2页 / 共15页
DSP技术与实验思考题答案.docx_第3页
第3页 / 共15页
DSP技术与实验思考题答案.docx_第4页
第4页 / 共15页
DSP技术与实验思考题答案.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

DSP技术与实验思考题答案.docx

《DSP技术与实验思考题答案.docx》由会员分享,可在线阅读,更多相关《DSP技术与实验思考题答案.docx(15页珍藏版)》请在冰豆网上搜索。

DSP技术与实验思考题答案.docx

DSP技术与实验思考题答案

DSP实验报告

实验一 CCS集成开发环境的熟悉

思考一:

为什么要设置成Address=0x0090?

1、主程序中的bss段如下:

.bssx,5;伪指令。

声明数组x,5个字

.bssy,1;伪指令。

声明变量y,1个字

2、数据存储区分配如下:

PAGE1:

/*数据存储区*/

SPRAM:

org=1000Hlen=1000H/*定义SPRAM区,起始地址1000H,长度1000H*/

3、段分配如下:

.bss:

>SPRAMPAGE1/*将.text段映射或定位到PAGE1的SPRAM区*/

所以数组x的五个存储单元地址为1000H~1004H。

4、数据表分配如下:

table:

.word10,20,3,4,5;伪指令。

声明5个16位整数类型的常数。

table是标号

5、下面的操作是将table中的五个数据装载到变量x中,即存储空间1000H~1004H中

STM#x,AR1;AR1=#x或AR1指向数组x

RPT#4;下一条指令重复执行4+1=5次

MVPDtable,*AR1+;将程序存储器中的table数据表→AR1+指向的数据存储器

由以上存储结构可知,查看Data的地址空间1000H的内容就是查看数组x中的五个数:

10,20,3,4,5在数据存储器中的存储情况。

思考二:

为什么.bss的地址是0x1000,变量y的地址是0x1005,变量x的地址又是多少呢?

因为.bss段分配到SPRAMPAGE1,而SPRAMPAGE1的起始地址为1000H,所以.bss的地址为0x1000;变量x最先声明,变量y接着声明,而变量x是长度为5的数组,所以变量x占地址0x1000~0x1004五个地址单元,变量y的地址为0x1005.

思考三:

为什么要设置成Address=0x0090?

1、程序存储区地址分配如下:

PAGE0:

/*程序存储区*/

EPROM:

org=0090Hlen=0F70H/*定义EPROM区,起始地址0090H,长度0F70H*/

2、段分配如下:

.text:

>EPROMPAGE0/*将.text段映射或定位到PAGE0的EPROM区*/

由以上程序结构可知,.text段的起始地址为0090H,查看Program的地址空间中0090H中的的内容就是查看主程序在程序存储其中的内容。

思考四:

为什么.text段的地址是0x0090?

标号end的地址是0x009C?

标号SUM的地址是0x009E?

标号loop的地址是0x00A2?

.data段的地址是0x00A8?

因为.text段被分配到EPROMPAGE0存储区,而存储区EPROMPAGE0的首地址被定义为0090H,所以.text段的地址是0x0090;指令STM#0,SWWSR、STM#STACK+10H,sp、STM#x,AR1各占两个字节,指令RPT#4占一个字节,指令MVPDtable,*AR1+占两个字节,指令LD#0,A占一个字节,指令CALLSUM占两个字节,所以标号end的地址为0090H+2+2+2+1+2+1+2=009CH;指令Bend占两个字节,所以标号SUM的地址是009CH+2=009EH;指令STM#x,AR3、STM#4,AR2各占两个字节,所以标号loop的地址是009EH+2+2=00A2H;.data段被分配到EPROMPAGE0存储区,并且在.text后面被指定的,指令ADD*AR3+,A占一个字节,指令BANZloop,*AR2-占两个字节,指令STLA,*(y)占两个字节,指令RET占一个字节,所以.data段的地址是00A2H+1+2+2+1=00A8H。

思考五:

改变主程序example2.asm中x1~x5的值(自定),重新执行9~11①。

记录x1~x5、y的值并验算。

1、x1~x5的值修改如下:

2、运行结果y的值如下:

思考六:

修改example2.cmd(自定义存储器配置及段的定位),重新执行9~11②。

记录程序、数据、标号、中断矢量的地址空间。

1、存储器配置及段定位修改如下:

2、修改后数据存储器如下:

修改后程序存储器标号位置如下:

实验二算术运算与数据操作的汇编语言程序设计实验

编程练习一:

编写程序,计算y=x1+x2+…+x10(xi的值自己定义)。

编程练习二:

编写程序,计算y=a1x1+a2x2+…+a40x40(aixi的值自己定义)。

编程练习三:

编写程序,用长字运算指令实现Z32=X32+Y32;用并行运算指令实现z=x+y和f=e+d。

编程练习四:

编制程序,计算y=a1x1+a2x2+…+a10x10,其中数据均为小数(aixi的值自己定义)。

.title"example4.asm"

.mmregs

STACK.usect"STACK",10H

.bssa,10

.bssx,10

.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

.word5*32768/10;0.5

.word7*32768/10;0.7

.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

.word5*32768/10;0.5

.word7*32768/10;0.7

.text

start:

SSBXFRCT

STM#a,AR1

RPT#19

MVPDtable,*AR1+

STM#x,AR2

STM#a,AR3

RPTZA,#9

MAC*AR2+,*AR3+,A

STHA,*(y)

end:

Bend

.end

编程练习五:

分别编写程序,计算(-0.24)÷0.48和1024÷128。

1、计算(-0.24)÷0.48

.title"example5.asm"

.mmregs

STACK.usect"STACK",10H

.bssnum,1;分子

.bssden,1;分母

.bssquot,1;商

.data

table:

.word24*32768/100;-128

.word48*32768/100;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

2、计算1024÷128

.title"example6.asm"

.mmregs

STACK.usect"STACK",10H

.bssnum,1;分子

.bssden,1;分母

.bssquot,1;商

.data

table:

.word1024*32768/10000;

.word128*32768/10000;

.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

编程练习六:

编写浮点乘法程序,计算x1×x2×x3=0.2×(-0.4)×0.25。

***x1:

被乘数,m2:

乘数的尾数,x2:

乘数,ep:

乘积的指数,e1:

被乘数的指数******************

***mp:

乘积的尾数,m1:

被乘数的尾数,product:

乘积,e2:

乘数的指数,temp:

暂存单元***

.title"example7.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:

.word2*32768/10;0.2

.word-4*32768/10;-0.4

.word25*32768/100;0.25

.text

start:

STM#STACK+100,SP;设置堆栈指针

LD#x1,DP;设置DP指针为x1所在页

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;调用浮点乘法子程序

MVPDproduct,@x1;将x1和x2传送到数据存储器

MVPDtable+2,@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

实验三信号发生器设计

思考一:

设DSP的CPU主时钟频率为100MHz,指令周期为10ns,请说明产生频率为100KHz

的周期三角波信号时,应该如何修改主程序。

.mmregs

.def_c_int00

.includec54.inc

.refc54init

DA_ADDR.set0x0002;定义符号DA_ADDR表示D/A端口地址

.data

sin_table:

;在这里放置一个周期的正弦波的64个离散值

.word0,1,2,3,4,5,6,7

.word8,9,10,11,12,13,14,15

.word16,17,18,19,20,21,22,23

.word24,25,26,27,28,29,30,31

.word32,31,30,29,28,27,26,25

.word24,23,22,21,20,19,18,17

.word16,15,14,13,12,11,10,9

.word8,7,6,5,4,3,2,1

.bssDA_DATA,1;声明变量DA_DATA作D/A缓冲区

.bssDA_NUM,1;声明变量DA_NUM作D/A计数器

.sect"progsys";自定义初始化段progsys

.align0x10;调整SPC,下面的程序代码放置在存储器中时,起始地址对准16字的边界

_c_int00:

STM#0x0f80,SP;设置堆栈指针

CALLc54init;调整DSP初始化程序,硬件仿真时必须的部分

LD#sin_table,DP;设置数据页指针,DP指向sin_table所在的数据存储器页

LOOP:

;周期循环标号

ST#0,DA_NUM;计数变量清零

STM#sin_table,AR1;AR1指向查找表首地址

SINLOOP:

;一个周期内的D/A循环标号

MVDK*AR1+,DA_DATA;读查找表中的值放入到数据缓冲区DA_DATA中,软件仿真时在此处设置断点

PORTWDA_DATA,DA_ADDR;数据缓冲区DA_DATA中的值写到D/A端口,软件仿真时不起作用

RPT#1000;下面的一条指令执行1001次

NOP;空操作,在这里起延时作用

ADDM#1,DA_NUM;DA_NUM循环计数

CMPMDA_NUM,#63;DA_NUM与63比较

BCSINLOOP,NTC;一个周期内的64个点还没D/A完继续

BLOOP;一个周期内的64个点已经D/A完,进入周期循环

.end

思考二:

如果在查找表中放置正弦波一个周期内的360个离散值(在MATLAB中产生),请重写产生正弦波的主程序并仿真。

.mmregs

.def_c_int00

.includec54.inc

.refc54init

DA_ADDR.set0x0002;定义符号DA_ADDR表示D/A端口地址

.data

sin_table:

;在这里放置一个周期的正弦波的64个离散值

.word255,259,264,268,273,277,282,286,290,295,299,304,308,312,317,321,325,330,334,338,342,346,351,355,359,363,367,371,375,379,383,386,390,394,398,401,405,408,412,415,419,422,426,429,432,435,438,441,445,447,450,453,456,459,461,464,466,469,471,474,476,478,480,482,484,486,488,490,491,493,495,496,498,499,500,501,502,503,504,505,506,507,508,508,509,509,509,510,510,510,510,510,510,510,509,509,509,508,508,507,506,505,504,503,502,501,500,499,498,496,495,493,491,490,488,486,484,482,480,478,476,474,471,469,466,464,461,459,456,453,450,447,445,441,438,435,432,429,426,422,419,415,412,408,405,401,398,394,390,386,383,379,375,371,367,363,359,355,351,346,342,338,334,330,325,321,317,312,308,304,299,295,290,286,282,277,273,268,264,259,255,251,246,242,237,233,228,224,220,215,211,206,202,198,193,189,185,180,176,172,168,164,159,155,151,147,143,139,135,131,128,124,120,116,112,109,105,102,98,95,91,88,84,81,78,75,72,69,65,63,60,57,54,51,49,46,44,41,39,36,34,32,30,28,26,24,22,20,19,17,15,14,12,11,10,9,8,7,6,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,6,7,8,9,10,11,12,14,15,17,19,20,22,24,26,28,30,32,34,36,39,41,44,46,49,51,54,57,60,63,65,69,72,75,78,81,84,88,91,95,98,102,105,109,112,116,120,124,127,131,135,139,143,147,151,155,159,164,168,172,176,180,185,189,193,198,202,206,211,215,220,224,228,233,237,242,246,251,255

.bssDA_DATA,1;声明变量DA_DATA作D/A缓冲区

.bssDA_NUM,1;声明变量DA_NUM作D/A计数器

.sect"progsys";自定义初始化段progsys

.align0x10;调整SPC,下面的程序代码放置在存储器中时,起始地址对准16字的边界

_c_int00:

STM#0x0f80,SP;设置堆栈指针

CALLc54init;调整DSP初始化程序,硬件仿真时必须的部分

LD#sin_table,DP;设置数据页指针,DP指向sin_table所在的数据存储器页

LOOP:

;周期循环标号

ST#0,DA_NUM;计数变量清零

STM#sin_table,AR1;AR1指向查找表首地址

SINLOOP:

;一个周期内的D/A循环标号

MVDK*AR1+,DA_DATA;读查找表中的值放入到数据缓冲区DA_DATA中,软件仿真时在此处设置断点

PORTWDA_DATA,DA_ADDR;数据缓冲区DA_DATA中的值写到D/A端口,软件仿真时不起作用

RPT#100;下面的一条指令执行1001次

NOP;空操作,在这里起延时作用

ADDM#1,DA_NUM;DA_NUM循环计数

CMPMDA_NUM,#359;DA_NUM与63比较

BCSINLOOP,NTC;一个周期内的64个点还没D/A完继续

BLOOP;一个周期内的64个点已经D/A完,进入周期循环

.end

实验四IIR滤波器的DSP实现

思考题一:

编写程序实现八阶低通IIR数字滤波器的DSP程序并仿真

****************************************************************************

*用双操作数指令实现二阶低通IIR滤波器*

*反馈通道:

x0=w(n)=x(n)+A1*x1+A2*x2前向通道:

y(n)=B0*x0+B1*x1+B2*x2*

.title"IIR_filter.asm"

.mmregs

.defstart

indata.usect"buffer",1

outdata.usect"buffer",1

x8.usect"x",1

x7.usect"x",1

x6.usect"x",1

x5.usect"x",1

x4.usect"x",1

x3.usect"x",1

x2.usect"x",1

x1.usect"x",1

x0.usect"x",1

COEF.usect"COEF",18

*PA0.set10

*PA1.set1

.data

table.word0;x(n-1)

.word0;x(n-2)

.word0

.word0

.word0

.word0

.word0

.word0

.word47*32768/10000;分子系数B2=0.0676

.word376*32768/10000;分子系数B1=0.

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

当前位置:首页 > 高中教育 > 其它课程

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

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