DSP原理及应用滤波器的设计文档格式.docx
《DSP原理及应用滤波器的设计文档格式.docx》由会员分享,可在线阅读,更多相关《DSP原理及应用滤波器的设计文档格式.docx(56页珍藏版)》请在冰点文库上搜索。
![DSP原理及应用滤波器的设计文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/3d22deea-1e24-4b40-a8d5-e2a66188fd57/3d22deea-1e24-4b40-a8d5-e2a66188fd571.gif)
-mexample1.map/*声明链接产生的存储器映射文件*/
-estart/*声明主程序入口*/
MEMORY/*关键字加一对{},存储器配置*/
{
PAGE0:
/*程序存储区*/
EPROM:
org=00A0Hlen=0F70H/*定义EPROM区,起始地址0090H,长度0F70H*/
VECS:
org=0080Hlen=0010H/*定义VECS区,起始地址0080H,长度0010H*/
PAGE1:
/*数据存储区*/
SPRAM:
org=1010Hlen=1000H/*定义SPRAM区,起始地址1000H,长度1000H*/
DARAM:
org=2010Hlen=2000H/*定义DARAM区,起始地址2000H,长度2000H*/
}
SECTIONS/*关键字加一对{},定位段*/
.text:
EPROMPAGE0/*将.text段映射或定位到PAGE0的EPROM区*/
.data:
.bss:
STACK:
DARAMPAGE1/*将.text段映射或定位到PAGE1的DARAM区*/
.vectors:
VECSPAGE0/*将.vectors段映射或定位到PAGE0的VECS区*/
12.改变主程序example2.asm中x1~x5的值(自定),重新执行9~11①。
记录x1~x5、y的值并验算。
.title"
example1.asm"
;
伪指令。
用于格式化输出清单文件,声明在每页的顶部打印文件标题
.mmregs;
声明CPU寄存器名称
STACK.usect"
STACK"
10H;
自定义未初始化段STACK及大小(10H个字),最左边的STACK是标号
.bssx,5;
声明数组x,5个字
.bssy,1;
声明变量y,1个字
.defstart;
声明本文件中的标号start能被别的文件(程序)引用
.data;
伪指令,指示下面的代码为数据段,通常包含初始化的数据(常数)。
table:
.word1,2,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;
指示汇编结束
实验二算术运算与数据操作的汇编语言程序设计实验
6、编制程序,计算y=a1x1+a2x2+…+a10x10,其中数据均为小数(aixi的值自己定义)。
.title"
test.asm"
.mmregs
STACK.usect"
10H
.bssa,10
.bssx,10
.bssy,1
.defstart
.data
.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
.word1*32768/10;
.text
SSBXFRCT
STM#a,AR1
RPT#19
MVPDtable,*AR1+
STM#x,AR2
STM#a,AR3
RPTZA,#9
MAC*AR2+,*AR3+,A
STHA,*(y)
Bend
.end
8、编写浮点乘法程序,计算x1×
x2×
x3=0.2×
(-0.4)×
0.25。
注:
(1)x1:
被乘数,m1:
被乘数的尾数m2:
乘数的尾数,x2:
乘数,m3:
乘数的尾数,x3:
乘数ep:
乘积的指数,e1:
被乘数的指数
(2)mp:
乘积的尾数,m1:
被乘数的尾数,product:
乘积,e2:
乘数的指数,temp:
暂存单元
.title"
sy27.asm"
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
.word2*32768/10;
.word-4*32768/10;
.word25*32768/100;
0.25
.text
STM#STACK+100,SP;
设置堆栈指针
LD#x1,DP;
设置DP指针为x1所在页
MVPDtable,@x1;
将x1和x2和x3传送到数据存储器
MVPDtable+1,@x2
MVPDtable+2,@x3
LD@x1,16,A;
将x1规格化为浮点数
EXPA
STT,@e1;
保存x1的指数
NORMA
STHA,@m1;
保存x1的尾数
LD@x2,16,A;
将x2规格化为浮点数
STT,@e2;
保存x2的指数
NORMA
STHA,@m2;
保存x2的尾数
LD@x3,16,A;
将x3规格化为浮点数
STT,@e3;
保存x3的指数
STHA,@m3;
保存x3的尾数
CALLMULT;
调用浮点乘法子程序
Bend
MULT:
SSBXFRCT
SSBXSXM
LD@e1,A;
指数相加
ADD@e2,A
ADD@e3,A
STLA,@ep;
乘积指数->
ep
LD@m1,T;
尾数相乘
MPY@m2,A
STLA,@m1
LD@m1,T
MPY@m3,A;
乘积尾数在累加器A中
EXPA;
对尾数乘积规格化
STT,@temp;
规格化时产生的指数->
temp
STHA,@mp;
保存乘积尾数在mp中
LD@temp,A;
修正乘积指数
ADD@ep,A;
(ep)+(temp)->
保存乘积指数在ep中
NEGA;
将浮点乘积转换成定点数
STLA,@temp;
乘积指数反号,并且加载到T寄存器
LD@temp,T;
再将尾数按T移位
LD@mp,16,A
STHA,@product;
保存定点乘积
RET
.end
实验三信号发生器设计
1.设DSP的CPU主时钟频率为100MHz,指令周期为10ns,请说明产生频率为100KHz的周期三角波信号时,应该如何修改主程序。
2.如果在查找表中放置正弦波一个周期内的360个离散值(在MATLAB中产生),请重写产生正弦波的主程序并仿真。
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
.word35,40,44,49,53,57,62,66
.word70,75,79,83,87,91,96,100
.word104,108,112,116,120,124,128,131
.word135,139,143,146,150,153,157,160
.word164,167,171,174,177,180,183,186
.word190,192,195,198,201,204,206,209
.word211,214,216,219,221,223,225,227
.word229,231,233,235,236,238,240,241
.word243,244,245,246,247,248,249,250
.word251,252,253,253,254,254,254,255
.word255,255,255,255,255,255,254,254
.word254,253,253,252,251,250,249,248
.word247,246,245,244,243,241,240,238
.word236,235,233,231,229,227,225,223
.word221,219,216,214,211,209,206,204
.word201,198,195,192,190,186,183,180
.word177,174,171,167,164,160,157,153
.word150,146,143,139,135,131,127,124
.word120,116,112,108,104,100,96,91
.word87,83,79,75,70,66,62,57
.word53,49,44,40,35,31,27,22
.word18,13,9,4,0,-4,-9,-13
.word-18,-22,-27,-31,-35,-40,-44,-49
.word-53,-57,-62,-66,-70,-75,-79,-83
.word-87,-91,-96,-100,-104,-108,-112,-116
.word-120,-124,-127,-131,-135,-139,-143,-146
.word-150,-153,-157,-160,-164,-167,-171,-174
.word-177,-180,-183,-186,-190,-192,-195,-198
.word-201,-204,-206,-209,-211,-214,-216,-219
.word-221,-223,-225,-227,-229,-231,-233,-235
.word-236,-238,-240,-241,-243,-244,-245,-246
.word-247,-248,-249,-250,-251,-252,-253,-253
.word-254,-254,-254,-255,-255,-255,-255,-255
.word-255,-255,-254,-254,-254,-253,-253,-252
.word-251,-250,-249,-248,-247,-246,-245,-244
.word-243,-241,-240,-238,-236,-235,-233,-231
.word-229,-227,-225,-223,-221,-219,-216,-214
.word-211,-209,-206,-204,-201,-198,-195,-192
.word-190,-186,-183,-180,-177,-174,-171,-167
.word-164,-160,-157,-153,-150,-146,-143,-139
.word-135,-131,-128,-124,-120,-116,-112,-108
.word-104,-100,-96,-91,-87,-83,-79,-75
.word-70,-66,-62,-57,-53,-49,-44,-40
.word-35,-31,-27,-22,-18,-13,-9,-4
.word-0,0,0,0,0,0,0,0
.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,#359;
DA_NUM与359比较
BCSINLOOP,NTC;
一个周期内的360个点还没D/A完继续
BLOOP;
一个周期内的360个点已经D/A完,进入周期循环
.end
Memory.cmd
/*-e_c_int00*/
-msensor.map
MEMORY
PAGE0:
PROG:
origin=0x2000,len=0x0f80
VECT:
origin=0x2f80,len=0x80/*128word*/
PAGE1:
DRAM:
origin=0x3000,len=0x200
SECTIONS
.progsys:
load=PROGPAGE0
.vectors:
load=VECTPAGE0
.data:
load=DRAMPAGE1align16
.bss:
load=DRAMPAGE1
实验四IIR滤波器的DSP实现
思考题:
对参考程序,编写实现四阶或更高阶数的低通、高通、带通、带阻IIR数字滤波器的DSP程序并仿真。
提示:
滤波器系数一般通过MATLAB仿真得到。
4阶低通:
IIR.asm"
.mmregs
.defstart
x4.usect"
x"
1
x3.usect"
x2.usect"
x1.usect"
x0.usect"
COEF.usect"
COEF"
9
indata.usect"
buffer"
outdata.usect"
*PA0.set10
*PA1.set1
table
.word0;
x(n-1)
x(n-2)
.word0;
x(n-3)
x(n-4)
分子系数B3=0
.word15*32768/10000;
B3=0.0015
.word78*32768/10000;
分子系数B2=0.0078
.word25*32768/10000;
分子系数B1=0.0025
分子系数B0=0
.word3783*32768/10000;
分母系数A4=0.3783
.word-6258*32768/10000;
分母系数A3=-1.8776/3
.word88705*32768/100000;
分母系数A2=3.5482/4
.word-826775*32768/1000000;
分母系数A1=-3.0372/4
SSBXFRCT
STM#x4,AR1
RPT#3
MVPD#table,*AR1+
STM#indata,AR5
STM#outdata,AR2
STM#COEF,AR1
RPT#8
MVPD#table+2,*AR1+
STM#x2,AR3
STM#COEF+9,AR4;
AR4-->
A1
MVMMAR4,AR1;
保存地址值在AR1中
STM#5,BK;
设置循环缓冲区长度
STM#-1,AR0;
设置变址寻址步长
IIR2:
PORTRPA1,*AR3;
从PA1口输入数据x(n)
MVDD*AR5,*AR3;
在这里设置断点与探针
LD*AR3+0%,16,A;
计算反馈通道,A=x(n)
MAC*AR3,*AR4,A;
A=x(n)+A1*x1
A=x(n)+2A1*x1
A=x(n)+3A1*x1
MAC*AR3+0%,*AR4-,A;
A=x(n)+3*A1*x1+A1*x1
A=x(n)+4*A1*x1+A2*x2
A=x(n)+4*A1*x1+2*A2*x2
A=x(n)+4*A1