DSP实验与技术报告.docx
《DSP实验与技术报告.docx》由会员分享,可在线阅读,更多相关《DSP实验与技术报告.docx(89页珍藏版)》请在冰豆网上搜索。
DSP实验与技术报告
DSP技术与实验报告
报告人:
陈哲
学号:
2009111109
专业:
电子信息工程
实验一
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.为什么要设置成Address=0x1000?
由文件test1.cmd中的:
SPRAM:
org=1000Hlen=1000H/*定义SPRAM区,起始地址1000H,长度1000H*/
可知地址的起始地址为0x1000;
2.为什么.bss的地址是0x1000,变量y的地址是0x1005,变量x的地址又是多少呢?
.bss的地址是由test1.cmd文件设定的,x的地址是0x1000,0x1001,0x1002,0x1003,,0x1004.
2+20+200+2000+20000=22222(16进制56EC)
③查看寄存器的状况。
第一步:
点击菜单View-Registers-CPURegisters。
基本界面如图1-8
第二步:
点击菜单File-LoadProgram重新装载可执行程序*.out。
第三步:
点击菜单Debug-StepInto或按F8,观察程序在单步运行时(单步运行指的是按一次F8程序执行一步,再按一次F8程序再执行一步),CPURegisters的变化。
单步运行有助于进一步了解程序运行机理及用于程序调试。
④查看指令代码。
再一次装载并运行程序,点击菜单View-Disassembly,查看并记录指令及其对应的指令代码并进行理解。
12.改变主程序example2.asm中x1~x5的值(自定),重新执行9~11①。
记录x1~x5、y的值并验算。
13.修改example2.cmd(自定义存储器配置及段的定位),重新执行9~11②。
记录程序、数据、标号、中断矢量的地址空间。
实验二
2、编写程序,计算y=x1+x2+…+x10(xi的值自己定义)。
答:
主程序文件task2_2.asm:
*****************计算y=x1+x2+x3+x4+x5+x6+x7+x8+x9+x10的程序*****************
.title"task2_2.asm";伪指令。
用于格式化输出清单文件,声明在每页的顶部打印文件标题
.mmregs;伪指令。
声明CPU寄存器名称
STACK.usect"STACK",10H;伪指令。
自定义未初始化段STACK及大小(10H个字),最左边的STACK是标号
.bssx,10;伪指令。
声明数组x,10个字
.bssy,1;伪指令。
声明变量y,1个字
.defstart;伪指令。
声明本文件中的标号start能被别的文件(程序)引用
.data;伪指令,指示下面的代码为数据段,通常包含初始化的数据(常数)。
table:
.word1,2,3,4,5,6,7,8,9,10;伪指令。
声明10个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#10;下一条指令重复执行4+1=5次
MVPDtable,*AR1+;数据传送。
程序存储器中的table数据表→AR1+指向的数据存储器
LD#0,A;累加器A清零
CALLSUM;调用求和子程序SUM
end:
Bend;无条件转移到标号end所在地方执行程序
SUM:
;标号,指示求和子程序SUM从这里开始
STM#x,AR3;AR3指向数组x
STM#9,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;伪指令。
指示汇编结束
4、编写程序,计算y=a1x1+a2x2+…+a40x40(aixi的值自己定义)
答:
主程序文件task2_4.asm:
.title"sy21.asm"
.mmregs
STACK.usect"STACK",60H
.bssa,40
.bssx,40
.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,29,30
.word31,32,33,34,35,36,37,38,39,40
.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,29,30
.word31,32,33,34,35,36,37,38,39,40
.defstart
.text
start:
STM#a,AR1
RPT#79
MVPDtable,*AR1+
LD#0,B
STM#a,AR2
STM#x,AR3
STM#39,BRC
RPTBdone-1
LD*AR2+,T;单操作数指令
MPY*AR3+,A;单操作数指令
ADDA,B
done:
STHB,*(y)
STLB,*(y+1)
end:
Bend
.end
寄存器:
6、编制程序,计算y=a1x1+a2x2+…+a10x10,其中数据均为小数(aixi的值自己定义)。
答:
主程序为task2_6.asm
*********a1=0.1,a2=0.2,a3=-0.3,a4=0.4,a5=0.1,a6=0.2,a7=0.3,a8=0.8,a9=0.4,a10=0.4*******
*********x1=0.8,x2=0.6,x3=-0.4,x4=-0.2,x5=-0.1,x6=0.8,x7=-0.4,x8=-0.2,x9=0.3,x10=0.3****
.title"task2_6.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
.word1*32768/10;0.1
.word2*32768/10;0.2
.word3*32768/10;0.3
.word8*32768/10;0.8
.word4*32768/10;0.4
.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
.word-1*32768/10;-0.1
.word8*32768/10;0.8
.word-4*32768/10;-0.4
.word-2*32768/10;-0.2
.word3*32768/10;0.3
.word3*32768/10;0.3
.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
内存的情况:
8、编写浮点乘法程序,计算x1×x2×x3=0.2×(-0.4)×0.25
主程序为:
task2_8.asm:
**x1:
被乘数,m2:
乘数的尾数,x2:
乘数,ep:
乘积的指数,e1:
被乘数的指数**********
***mp:
乘积的尾数,m1:
被乘数的尾数,product:
乘积,e2:
乘数的指数,temp:
暂存单元****
.title"task2_8.asm"
.mmregs
.defstart
STACK.usect"STACK",100
.bssx1,1
.bssx2,1
.bssx3,1
.bsse1,1
.bssm1,1
.bsse2,1
.bssm2,1
.bsse3,1
.bssm3,1
.bssep,1
.bssmp,1
.bssproduct,1
.bsstemp,1
.data
table:
.word4*32768/10;0.4
.word-4*32768/10;-0.4
.word-25*32768/100;-0.25
.text
start:
STM#STACK+100,SP;设置堆栈指针
LD#x1,DP;设置DP指针为x1所在页
MVPDtable,@x1;将x1和x2传送到数据存储器
MVPDtable+1,@x2
MVPDtable+2,@x3
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;调用浮点乘法子程序
LD@x3,16,A;将x3规格化为浮点数
EXPA
STT,@e3;保存x3的指数
NORMA
STHA,@m3;保存x3的尾数
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
内存的情况:
实验三
1.设DSP的CPU主时钟频率为100MHz,指令周期为10ns,请说明产生频率为100KHz的周期三角波信号时,应该如何修改主程序。
答:
主程序main.asm中标号SINLOOP的RPT1000修改为RPT3.
2.如果在查找表中放置正弦波一个周期内的360个离散值(在MATLAB中产生),请重写产生正弦波的主程序并仿真。
答:
vectors.asm文件:
.title"vectors.asm"
.refstart;伪指令。
声明要引用其他程序中定义的标号start
.sect".vectors";伪指令。
定义初始化的段名.vectors,这一种伪指令声明的段与.data和.text功能一致
Bstart;无条件转移到标号start所在的地方执行程序
.end
主程序main.asm为:
.mmregs
.def_c_int00
.includec54.inc
.refc54init
DA_ADDR.set0x0002;定义符号DA_ADDR表示D/A端口地址
.data
sin_table:
;在这里放置一个周期的正弦波的360个离散值
.word0,4,9,13,18,22,27,31,35,40,44,49,53,57,62,66
.word70,75,79,83,87,91,96,100,104,108,112,116,120,124,127,131
.word135,139,143,146,150,153,157,160,164,167,171,174,177,180,183,186
.word190,192,195,198,201,204,206,209,211,214,216,219,221,223,225,227
.word229,231,233,235,236,238,240,241,243,244,245,246,247,248,249,250
.word251,252,253,253,254,254,254,255,255,255,255,255,255,255,254,254
.word254,253,253,252,251,250,249,248,247,246,245,244,243,241,240,238
.word236,235,233,231,229,227,225,223,221,219,216,214,211,209,206,204
.word201,198,195,192,190,186,183,180,177,174,171,167,164,160,157,153
.word150,146,143,139,135,131,127,124,120,116,112,108,104,100,96,91
.word87,83,79,75,70,66,62,57,53,49,44,40,35,31,27,22
.word18,13,9,4,0,-4,-9,-13,-18,-22,-27,-31,-35,-40,-44,-49
.word-53,-57,-62,-66,-70,-75,-79,-83,-87-91-96-100,-104,-108,-112,-116
.word-120,-124,-128,-131,-135,-139,-143,-146,-150,-153,-157,-160,-164,-167,-171,-174
.word-177,-180,-183,-186,-190,-192,-195,-198,-201,-204,-206,-209,-211,-214,-216,-219
.word-221,-223,-225,-227,-229,-231,-233,-235,-236,-238,-240,-241-243,-244,-245,-246
.word-247,-248,-249,-250,-251,-252,-253,-253,-254,-254,-254,-255-255,-255,-255,-255
.word-255,-255,-254,-254,-254,-253,-253,-252,-251,-250,-249,-248,-247,-246,-245,-244
.word-243,-241,-240,-238,-236,-235,-233,-231,-229,-227,-225,-223,-221,-219,-216,-214
.word-211,-209,-206,-204,-201,-198,-195,-192,-190,-186,-183,-180,-177,-174,-171,-167
.word-164,-160,-157,-153,-150,-146,-143,-139,-135,-131,-128,-124,-120,-116,-112,-108
.word-104,-100,-96,-91,-87,-83,-79,-75,-70,-66,-62,-57,-53,-49,-44,-40
.word-35,-31,-27,-22,-18,-13,-9,-4
.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;下面的一条指令执行101次
NOP;空操作,在这里起延时作用
ADDM#1,*(DA_NUM);DA_NUM循环计数
CMPM*(DA_NUM),#360;DA_NUM与359比较
BCSINLOOP,NTC;一个周期内的64个点还没D/A完继续
BLOOP;一个周期内的360个点已经D/A完,进入周期循环
.end
实验四
IIR的4阶低通滤波器:
vectors.asm文件同上
IIR_ditong.cmd文件如下:
vectors.obj
IIR_ditong.obj
-oIIR_ditong.out
-mIIR_ditong.map
-estart
MEMORY
{
PAGE0:
EPROM:
org=0090H,len=0F70H
VECS:
org=0080H,len=0010H
PAGE1:
SPRAM:
org=1000H,len=1000H
DARAM:
org=2000H,len=2000H
}
SECTIONS
{
.text:
>EPROMPAGE0
.data:
>EPROMPAGE0
.bss:
>SPRAMPAGE1
x:
align(8){}>DARAMPAGE1
COEF:
align(16){}>DARAMPAGE1
buffer:
>DARAMPAGE1
.vectors:
>VECSPAGE0
}
主程序IIR4_ditong.asm为:
****************************************************************************
*用双操作数指令实现二阶低通IIR滤波器*
*反馈通道:
x0=w(n)=x(n)+A1*x1+A2*x2+A3*x3+A4*x4
前向通道:
y(n)=B0*x0+B1*x1+B2*x2+B3*x3+B4*x4*
.title"IIR4_ditong.asm"
.mmregs
.defstart
x4.usect"x",1
x3.usect"x",1
x2.usect"x",1
x1.usect"x",1
x0.usect"x",1
COEF.usect"COEF",9
indata.usect"buffer",1
outdata.usect"buffer",1
*PA0.set10
*PA1.set1
.data
table.word0
.word0
.word0
.word0
.word0
.word4*32768/10000;分子系数B4=0.0676
.word17*32768/10000;分子系数B3=0.1352
.word25*32768/10000;分子系数B2=0.0676
.word17*32768/10000;分子系数B1=0.1352
.word4*32768/10000;分子系数B0=0.0676
.word-1096*32768/10000;分母系数A4=-0.4142
.word5280*32768/10000;分母系数A3=0.0707
.word-9653*32768/10000;分母系数A2=-0.4142
.word7952*32768/10000;分母系数A1=0.0707
.text
start:
SSBXFRCT
STM#x4,AR1
RPT#4
MVPD#table,*AR1+
STM#indata,AR5
STM#outdata,AR2
STM#COEF,AR1
RPT#8
MVPD#table+5,*AR1+
STM#COEF+8,AR4;AR4-->A1
MVMMAR4,AR1;保存地址值在AR1中
STM#5,BK;设