DSP实验与技术报告.docx

上传人:b****6 文档编号:8587122 上传时间:2023-01-31 格式:DOCX 页数:89 大小:1.01MB
下载 相关 举报
DSP实验与技术报告.docx_第1页
第1页 / 共89页
DSP实验与技术报告.docx_第2页
第2页 / 共89页
DSP实验与技术报告.docx_第3页
第3页 / 共89页
DSP实验与技术报告.docx_第4页
第4页 / 共89页
DSP实验与技术报告.docx_第5页
第5页 / 共89页
点击查看更多>>
下载资源
资源描述

DSP实验与技术报告.docx

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

DSP实验与技术报告.docx

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;设

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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