DSP技术与实验思考题答案.docx
《DSP技术与实验思考题答案.docx》由会员分享,可在线阅读,更多相关《DSP技术与实验思考题答案.docx(15页珍藏版)》请在冰豆网上搜索。
![DSP技术与实验思考题答案.docx](https://file1.bdocx.com/fileroot1/2022-12/8/4d649e09-62db-4eab-b34f-cec84456627b/4d649e09-62db-4eab-b34f-cec84456627b1.gif)
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.