配色: 字号:
DSP技术与实验思考题答案
2012-12-23 | 阅:  转:  |  分享 
  
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?

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

PAGE0: /程序存储区/

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

段分配如下:

.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后面被指定的,指令ADDAR3+,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的值修改如下:



运行结果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

.bss a,10

.bss x,10

.bss y,1

.def start

.data

table: .word 132768/10;0.1

.word 232768/10;0.2

.word -332768/10;-0.3

.word 432768/10;0.4

.word 832768/10;0.8

.word 632768/10;0.6

.word -432768/10;-0.4

.word -232768/10;-0.2

.word532768/10;0.5

.word732768/10;0.7



.word 132768/10;0.1

.word 232768/10;0.2

.word -332768/10;-0.3

.word 432768/10;0.4

.word 832768/10;0.8

.word 632768/10;0.6

.word -432768/10;-0.4

.word -232768/10;-0.2

.word532768/10;0.5

.word732768/10;0.7

.text

start: SSBX FRCT

STM #a,AR1

RPT #19

MVPD table,AR1+

STM #x,AR2

STM #a,AR3

RPTZ A,#9

MAC AR2+,AR3+,A

STH A,(y)

end: B end

.end



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

1、计算(-0.24)÷0.48

.title "example5.asm"

.mmregs

STACK .usect "STACK",10H

.bss num,1 ;分子

.bss den,1 ;分母

.bss quot,1 ;商

.data

table: .word 2432768/100 ;-128

.word 4832768/100 ;1024

.def start

.text

start: LD #0020H,DP ;设置数据页指针,使DP指向第31页(1000H处)

STM #num,AR1

RPT #1

MVPD table,AR1+ ;传送2个数据至分子、分母

LD @den,16,A ;将分母移到累加器A(31~16)

MPYA @num ;(num)(A(31~16))->B,获取商的符号

;(在累加器B中)

ABS A ;分母取绝对值

STH A,@den ;分母取绝对值存回原处

LD @num,16,A ;将分子移到累加器A(32~16)

ABS A ;分子取绝对值

RPT #14 ;15次减法循环,完成除法

SUBC @den,A

XC 1,BLT ;如果B<0(商为负数),则需要变号

NEG A

STL A,@quot ;保存商

end: B end

.end

2、计算1024÷128

.title "example6.asm"

.mmregs

STACK .usect "STACK",10H

.bss num,1 ;分子

.bss den,1 ;分母

.bss quot,1 ;商

.data

table: .word 102432768/10000 ;

.word 12832768/10000 ;

.def start

.text

start: LD #0020H,DP ;指定数据页指针

STM #num,AR1

RPT #1

MVPD table,AR1+ ;传送2个数据至分子、分母

LD @den,16,A ;将分母移到累加器A(31~16)

MPYA @num ;(num)(A(31~16))->B,获取商的符号

;(在累加器B中)

ABS A ;分母取绝对值

STH A,@den ;分母取绝对值存回原处

LD @num,A ;将分子移到累加器A(32~16)

ABS A ;分子取绝对值

RPT #15 ;16次减法循环,完成除法

SUBC @den,A

XC 1,BLT ;如果B<0(商为负数),则需要变号

NEG A

STL A,@quot ;保存商

end: B end

.end



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

x1:被乘数,m2:乘数的尾数,x2:乘数,ep:乘积的指数,e1:被乘数的指数

mp:乘积的尾数,m1:被乘数的尾数, product:乘积,e2:乘数的指数, temp:暂存单元



.title "example7.asm"

.mmregs

.def start

STACK .usect "STACK",100

.bss x1,1

.bss x2,1

.bss e1,1

.bss m1,1

.bss e2,1

.bss m2,1

.bss ep,1

.bss mp,1

.bss product,1

.bss temp,1

.data

table:.word 232768/10 ;0.2

.word -432768/10 ;-0.4

.word 2532768/100 ;0.25

.text

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

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

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

MVPD table+1,@x2

LD @x1,16,A ;将x1规格化为浮点数

EXP A

ST T,@e1 ;保存x1的指数

NORM A

STH A, @m1 ;保存x1的尾数

LD @x2,16,A ;将x2规格化为浮点数

EXP A

ST T,@e2 ;保存x2的指数

NORM A

STH A,@m2 ;保存x2的尾数

CALL MULT ;调用浮点乘法子程序



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

MVPD table+2,@x2

LD @x1,16,A ;将x1规格化为浮点数

EXP A

ST T,@e1 ;保存x1的指数

NORM A

STH A, @m1 ;保存x1的尾数

LD @x2,16,A ;将x2规格化为浮点数

EXP A

ST T,@e2 ;保存x2的指数

NORM A

STH A,@m2 ;保存x2的尾数

CALL MULT ;调用浮点乘法子程序

end: B end

MULT:SSBX FRCT

SSBX SXM

LD @e1,A ;指数相加

ADD @e2,A

STL A,@ep ;乘积指数->ep

LD @m1,T ;尾数相乘

MPY @m2,A ;乘积尾数在累加器A中

EXP A ;对尾数乘积规格化

ST T,@temp;规格化时产生的指数->temp

NORM A

STH A,@mp ;保存乘积尾数在mp中

LD @temp,A ;修正乘积指数

ADD @ep,A ;(ep)+(temp)->ep

STL A,@ep ;保存乘积指数在ep中

NEG A ;将浮点乘积转换成定点数

STL A,@temp;乘积指数反号,并且加载到T寄存器

LD @temp,T ;再将尾数按T移位

LD @mp,16,A

NORM A

STH A,@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个离散值

.word 0,1,2,3,4,5,6,7

.word 8,9,10,11,12,13,14,15

.word 16,17,18,19,20,21,22,23

.word 24,25,26,27,28,29,30,31

.word 32,31,30,29,28,27,26,25

.word 24,23,22,21,20,19,18,17

.word 16,15,14,13,12,11,10,9

.word 8,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;设置堆栈指针

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

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

LOOP:;周期循环标号

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

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

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

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

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

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

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

ADDM#1,DA_NUM;DA_NUM循环计数

CMPM DA_NUM,#63 ;DA_NUM与63比较

BC SINLOOP,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个离散值

.word 255,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;设置堆栈指针

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

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

LOOP:;周期循环标号

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

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

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

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

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

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

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

ADDM#1,DA_NUM;DA_NUM循环计数

CMPM DA_NUM,#359 ;DA_NUM与63比较

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

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

.end



实验四IIR滤波器的DSP实现

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



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

反馈通道:x0=w(n)=x(n)+A1x1+A2x2前向通道:y(n)=B0x0+B1x1+B2x2



.title "IIR_filter.asm"

.mmregs

.def start

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 .set 10

PA1 .set 1

.data

table.word 0;x(n-1)

.word0;x(n-2)

.word0

.word0

.word0

.word0

.word0

.word0



.word4732768/10000;分子系数B2=0.0676

.word37632768/10000;分子系数B1=0.1352

.word131532768/10000;分子系数B0=0.0676

.word263032768/10000

.word328732768/10000

.word263032768/10000

.word131532768/10000

.word37632768/10000

.word4732768/10000



.word1000032768/1000000;分母系数A2=-0.4142

.word-7524332768/1000000;分母系数A1=0.0707

.word24956432768/1000000

.word-47649232768/1000000

.word57273132768/1000000

.word-44373732768/1000000

.word21639732768/1000000

.word-6072832768/1000000

.text

start: SSBX FRCT

STM #x8,AR1

RPT #7

MVPD #table,AR1+

STM #indata,AR5

STM #outdata,AR2

STM #COEF,AR1

RPT #16

MVPD #table+8,AR1+

STM #x0,AR3

STM #COEF+16,AR4 ;AR4-->A1

MVMM AR4,AR1 ;保存地址值在AR1中

STM #9,BK ;设置循环缓冲区长度

STM #-1,AR0 ;设置变址寻址步长

IIR2:

;PORTR PA1,AR3 ;从PA1口输入数据x(n)

MVDD AR5,AR3;在这里设置断点与探针

LD AR3,16,A ;计算反馈通道,A=x(n)

;MPY AR3+0%,AR4-,A ;A=x(n)+A1x1???

MAC AR3+0%,AR4-,A ;A=x(n)+A1x1+A1x1

MAC AR3+0%,AR4-,A;A=x(n)+2A1x1+A2x2

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

STH A,AR3 ;保存x0

MPY AR3+0%,AR4-,A ;计算前向通道,A=B0x0

MAC AR3+0%,AR4-,A ;A=B0x0+B1x1

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3,AR4,A ;B=B0x0+B1x1+B2x2=y(n)

STH A,AR3 ;保存y(n)

MVMM AR1,AR4 ;AR4重新指向A1

BD IIR2 ;循环

; PORTW AR3,PA0 ;向PA0口输出数据

MVDDAR3,AR2;在这里设置断点与探针

nop

.end



思考题二:编写程序实现八阶高通IIR数字滤波器的DSP程序并仿真



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

反馈通道:x0=w(n)=x(n)+A1x1+A2x2前向通道:y(n)=B0x0+B1x1+B2x2



.title "IIR_filter.asm"

.mmregs

.def start

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",5

indata .usect "buffer",1

outdata .usect "buffer",1

PA0 .set 10

PA1 .set 1

.data

table.word 0;x(n-1)

.word0;x(n-2)

.word0

.word0

.word0

.word0

.word0

.word0



.word38732768/100000;分子系数B2=0.0676

.word-309632768/100000;分子系数B1=0.1352

.word1083732768/100000;分子系数B0=0.0676

.word-2167432768/100000

.word2709332768/100000

.word-2167432768/100000

.word1083732768/100000

.word-309632768/100000

.word38732768/100000



.word127232768/100000;分母系数A2=-0.4142

.word-97732768/100000;分母系数A1=0.0707

.word421732768/100000

.word-539332768/100000

.word1667532768/100000

.word-2274132768/100000

.word3023232768/100000

.word-1966632768/100000

.text

start: SSBX FRCT

STM #x8,AR1

RPT #7

MVPD #table,AR1+

STM #indata,AR5

STM #outdata,AR2

STM #COEF,AR1

RPT #16

MVPD #table+8,AR1+

STM #x8,AR3

STM #COEF+16,AR4 ;AR4-->A1

MVMM AR4,AR1 ;保存地址值在AR1中

STM #9,BK ;设置循环缓冲区长度

STM #-1,AR0 ;设置变址寻址步长

IIR2:

;PORTR PA1,AR3 ;从PA1口输入数据x(n)

MVDD AR5,AR3;在这里设置断点与探针

LD AR3+0%,16,A ;计算反馈通道,A=x(n)

;MPY AR3,AR4,A ;A=x(n)+A1x1???

MAC AR3+0%,AR4-,A ;A=x(n)+A1x1+A1x1

MAC AR3+0%,AR4-,A;A=x(n)+2A1x1+A2x2

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

STH A,AR3 ;保存x0

MPY AR3+0%,AR4-,A ;计算前向通道,A=B0x0

MAC AR3+0%,AR4-,A ;A=B0x0+B1x1

MAC AR3+0%,AR4-,A ;B=B0x0+B1x1+B2x2=y(n)

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3,AR4-,A

STH A,AR3 ;保存y(n)

MVMM AR1,AR4 ;AR4重新指向A1

BD IIR2 ;循环

; PORTW AR3,PA0 ;向PA0口输出数据

MVDDAR3,AR2;在这里设置断点与探针

nop

.end



思考题三:编写程序实现八阶带通IIR数字滤波器的DSP程序并仿真



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

反馈通道:x0=w(n)=x(n)+A1x1+A2x2前向通道:y(n)=B0x0+B1x1+B2x2



.title "IIR_filter.asm"

.mmregs

.def start

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 .set 10

PA1 .set 1

.data

table.word 0;x(n-1)

.word0;x(n-2)

.word0

.word0

.word0

.word0

.word0

.word0



.word2932768/10000000;分子系数B2=0.0676

.word23232768/10000000;分子系数B1=0.1352

.word81432768/10000000;分子系数B0=0.0676

.word-162732768/10000000

.word203432768/10000000

.word162732768/10000000

.word81432768/10000000

.word23232768/10000000

.word2932768/10000000



.word696932768/1000000;分母系数A2=-0.4142

.word-5606132768/1000000;分母系数A1=0.0707

.word19951132768/1000000

.word-41027532768/1000000

.word53325832768/1000000

.word-44865132768/1000000

.word23865932768/1000000

.word7340932768/1000000

.text

start: SSBX FRCT

STM #x8,AR1

RPT #7

MVPD #table,AR1+

STM #indata,AR5

STM #outdata,AR2

STM #COEF,AR1

RPT #16

MVPD #table+8,AR1+

STM #x0,AR3

STM #COEF+16,AR4 ;AR4-->A1

MVMM AR4,AR1 ;保存地址值在AR1中

STM #9,BK ;设置循环缓冲区长度

STM #-1,AR0 ;设置变址寻址步长

IIR2:

;PORTR PA1,AR3 ;从PA1口输入数据x(n)

MVDD AR5,AR3;在这里设置断点与探针

LD AR3,16,A ;计算反馈通道,A=x(n)

;MPY AR3+0%,AR4-,A ;A=x(n)+A1x1???

MAC AR3+0%,AR4-,A ;A=x(n)+A1x1+A1x1

MAC AR3+0%,AR4-,A;A=x(n)+2A1x1+A2x2

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

STH A,AR3 ;保存x0

MPY AR3+0%,AR4-,A ;计算前向通道,A=B0x0

MAC AR3+0%,AR4-,A ;A=B0x0+B1x1

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3,AR4,A ;B=B0x0+B1x1+B2x2=y(n)

STH A,AR3 ;保存y(n)

MVMM AR1,AR4 ;AR4重新指向A1

BD IIR2 ;循环

; PORTW AR3,PA0 ;向PA0口输出数据

MVDDAR3,AR2;在这里设置断点与探针

nop

.end



思考题四:编写程序实现八阶带阻IIR数字滤波器的DSP程序并仿真

.



用双操作数指令实现二阶带阻IIR滤波器

反馈通道:x0=w(n)=x(n)+A1x1+A2x2前向通道:y(n)=B0x0+B1x1+B2x2



.title "IIR_filter.asm"

.mmregs

.def start

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 .set 10

PA1 .set 1

.data

table.word 0;x(n-1)

.word0;x(n-2)

.word0

.word0

.word0

.word0

.word0

.word0



.word431132768/1000000;分子系数B2=0.0676

.word-2632132768/1000000;分子系数B1=0.1352

.word7750532768/1000000;分子系数B0=0.0676

.word-14027932768/1000000

.word16978432768/1000000

.word-14027932768/1000000

.word7750532768/1000000

.word-2632132768/1000000

.word431132768/1000000



.word185932768/1000000;分母系数A2=-0.4142

.word-1367032768/1000000;分母系数A1=0.0707

.word4868532768/1000000

.word-10736332768/1000000

.word15962832768/1000000

.word-16361532768/1000000

.word11324432768/1000000

.word4855232768/1000000

.text

start: SSBX FRCT

STM #x8,AR1

RPT #7

MVPD #table,AR1+

STM #indata,AR5

STM #outdata,AR2

STM #COEF,AR1

RPT #16

MVPD #table+8,AR1+

STM #x0,AR3

STM #COEF+16,AR4 ;AR4-->A1

MVMM AR4,AR1 ;保存地址值在AR1中

STM #9,BK ;设置循环缓冲区长度

STM #-1,AR0 ;设置变址寻址步长

IIR2:

;PORTR PA1,AR3 ;从PA1口输入数据x(n)

MVDD AR5,AR3;在这里设置断点与探针

LD AR3,16,A ;计算反馈通道,A=x(n)

;MPY AR3+0%,AR4-,A ;A=x(n)+A1x1???

MAC AR3+0%,AR4-,A ;A=x(n)+A1x1+A1x1

MAC AR3+0%,AR4-,A;A=x(n)+2A1x1+A2x2

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

STH A,AR3 ;保存x0

MPY AR3+0%,AR4-,A ;计算前向通道,A=B0x0

MAC AR3+0%,AR4-,A ;A=B0x0+B1x1

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3+0%,AR4-,A

MAC AR3,AR4,A ;B=B0x0+B1x1+B2x2=y(n)

STH A,AR3 ;保存y(n)

MVMM AR1,AR4 ;AR4重新指向A1

BD IIR2 ;循环

; PORTW AR3,PA0 ;向PA0口输出数据

MVDDAR3,AR2;在这里设置断点与探针

nop

.end

实验五FIR滤波器的DSP实现

思考题一:编写程序实现39阶低通FIR数字滤波器的DSP程序并仿真

.title "fir.asm"

.mmregs

.def start



.bssindata,1;输入信号缓冲区(变量)

.bssoutdata,1;输出信号缓冲区(变量)

.bss y,1 ;保存滤波结果

xn .usect "xn",39;xn

h .usect "h",39 ;h

;PA0 .set 0002H ;D/A端口地址

;PA1 .set 0008H ;A/D端口地址

.data

table:

.word-14,-29,-52,-84,-123,-161,-187,-181

.word-125,0,206,499,871,1305,1771,2232

.word2649,2980,3193,3267,3193,2980,2649,2232

.word1771,1305,871,499,206,0,-125,-181

.word-187,-161,-123,-84,-52,-29,-14,0

.text

start:

SSBX FRCT ;小数乘法

STM #xn,AR1

RPT #38

ST #0,AR1+ ;把x(n)-x(n-79)赋始值0

STM #h,AR1

RPT #38

MVPD #table,AR1+ ;把参数表复制到数据存储区

STM #xn+38,AR3 ;AR3-->x(n-79)

STM #h+38,AR4 ;AR4-->h(n-79)

STM #39,BK ;循环缓冲区大小80

STM #-1,AR0 ;指针调整值-1

LD #xn,DP ;DP指向xn所在页

; PORTR PA1,@xn ;输入数据

LD #y,DP ;DP指向y所在页

FIR:

NOP

MVKD indata,AR3+0%;在这一行设置探针与断点用于从indata.dat文件中读输入数据

RPTZ A,#38

MAC AR3+0%,AR4+0%,A

STHA,@outdata;在这一行设置探针与断点用于将滤波结果写到文件outdata.dat中

NOP

;STH A,@y ;保存计算结果

;PORTW @y,PA0 ;硬件仿真时写D/A

B FIR ;跳转

;B FIR ;延迟跳转

;PORTR PA1,AR3+0% ;硬件仿真时读A/D,新数据覆盖最老的数据

.end





思考题二:编写程序实现39阶高通FIR数字滤波器的DSP程序并仿真



用循环缓冲区和双操作数寻址方法实现FIR滤波器

N=80,y(n)=h0x(n)+h1x(n-1)+...+h78x(n-78)+h79x(n-79)

先用matlab,选择80点汉明窗设计一个截止频率为0.2pi的低通滤波器



.title "fir.asm"

.mmregs

.def start



.bssindata,1;输入信号缓冲区(变量)

.bssoutdata,1;输出信号缓冲区(变量)

.bss y,1 ;保存滤波结果

xn .usect "xn",39;xn

h .usect "h",39 ;h

;PA0 .set 0002H ;D/A端口地址

;PA1 .set 0008H ;A/D端口地址

.data

table:

.word36,48,20,-52,-123,-100,72,294

.word328,-0,-542,-810,-334,809,1778,1385

.word-1016,-4840,-8391,22953,-8391,-4840,-1016,1385

.word1778,809,-334,-810,-542,-0,328,294

.word72,-100,-123,-52,20,48,36,0

.text

start:

SSBX FRCT ;小数乘法

STM #xn,AR1

RPT #38

ST #0,AR1+ ;把x(n)-x(n-79)赋始值0

STM #h,AR1

RPT #38

MVPD #table,AR1+ ;把参数表复制到数据存储区

STM #xn+38,AR3 ;AR3-->x(n-79)

STM #h+38,AR4 ;AR4-->h(n-79)

STM #39,BK ;循环缓冲区大小80

STM #-1,AR0 ;指针调整值-1

LD #xn,DP ;DP指向xn所在页

; PORTR PA1,@xn ;输入数据

LD #y,DP ;DP指向y所在页

FIR:

NOP

MVKD indata,AR3+0%;在这一行设置探针与断点用于从indata.dat文件中读输入数据

RPTZ A,#38

MAC AR3+0%,AR4+0%,A

STHA,@outdata;在这一行设置探针与断点用于将滤波结果写到文件outdata.dat中

NOP

;STH A,@y ;保存计算结果

;PORTW @y,PA0 ;硬件仿真时写D/A

B FIR ;跳转

;B FIR ;延迟跳转

;PORTR PA1,AR3+0% ;硬件仿真时读A/D,新数据覆盖最老的数据

.end





思考题三:编写程序实现39阶带通FIR数字滤波器的DSP程序并仿真



用循环缓冲区和双操作数寻址方法实现FIR滤波器

N=80,y(n)=h0x(n)+h1x(n-1)+...+h78x(n-78)+h79x(n-79)

先用matlab,选择80点汉明窗设计一个截止频率为0.2pi的低通滤波器



.title "fir.asm"

.mmregs

.def start



.bssindata,1;输入信号缓冲区(变量)

.bssoutdata,1;输出信号缓冲区(变量)

.bss y,1 ;保存滤波结果

xn .usect "xn",39;xn

h .usect "h",39 ;h

;PA0 .set 0002H ;D/A端口地址

;PA1 .set 0008H ;A/D端口地址

.data

table:

.word-22,-18,32,135,245,261,115,-112

.word-202,0,334,308,-538,-2110,-3540,-3610

.word-1636,1841,5164,6530,5164,1841,-1636,-3610

.word-3540,-2110,-538,308,334,0,-202,-112

.word115,261,245,135,32,-18,-22,0

.text

start:

SSBX FRCT ;小数乘法

STM #xn,AR1

RPT #38

ST #0,AR1+ ;把x(n)-x(n-79)赋始值0

STM #h,AR1

RPT #38

MVPD #table,AR1+ ;把参数表复制到数据存储区

STM #xn+38,AR3 ;AR3-->x(n-79)

STM #h+38,AR4 ;AR4-->h(n-79)

STM #39,BK ;循环缓冲区大小80

STM #-1,AR0 ;指针调整值-1

LD #xn,DP ;DP指向xn所在页

; PORTR PA1,@xn ;输入数据

LD #y,DP ;DP指向y所在页

FIR:

NOP

MVKD indata,AR3+0%;在这一行设置探针与断点用于从indata.dat文件中读输入数据

RPTZ A,#38

MAC AR3+0%,AR4+0%,A

STHA,@outdata;在这一行设置探针与断点用于将滤波结果写到文件outdata.dat中

NOP

;STH A,@y ;保存计算结果

;PORTW @y,PA0 ;硬件仿真时写D/A

B FIR ;跳转

;B FIR ;延迟跳转

;PORTR PA1,AR3+0% ;硬件仿真时读A/D,新数据覆盖最老的数据

.end



思考题四:编写程序实现39阶带阻FIR数字滤波器的DSP程序并仿真



用循环缓冲区和双操作数寻址方法实现FIR滤波器

N=80,y(n)=h0x(n)+h1x(n-1)+...+h78x(n-78)+h79x(n-79)

先用matlab,选择80点汉明窗设计一个截止频率为0.2pi的低通滤波器



.title "fir.asm"

.mmregs

.def start



.bssindata,1;输入信号缓冲区(变量)

.bssoutdata,1;输出信号缓冲区(变量)

.bss y,1 ;保存滤波结果

xn .usect "xn",39;xn

h .usect "h",39 ;h

;PA0 .set 0002H ;D/A端口地址

;PA1 .set 0008H ;A/D端口地址

.data

table:

.word22,18,-32,-135,-245,-261,-115,112

.word201,-0,-333,-308,537,2106,3534,3604

.word1633,-1837,-5155,26074,-5155,-1837,1633,3604

.word3534,2106,537,-308,-333,-0,201,112

.word-115,-261,-245,-135,-32,18,22,0

.text

start:

SSBX FRCT ;小数乘法

STM #xn,AR1

RPT #38

ST #0,AR1+ ;把x(n)-x(n-79)赋始值0

STM #h,AR1

RPT #38

MVPD #table,AR1+ ;把参数表复制到数据存储区

STM #xn+38,AR3 ;AR3-->x(n-79)

STM #h+38,AR4 ;AR4-->h(n-79)

STM #39,BK ;循环缓冲区大小80

STM #-1,AR0 ;指针调整值-1

LD #xn,DP ;DP指向xn所在页

; PORTR PA1,@xn ;输入数据

LD #y,DP ;DP指向y所在页

FIR:

NOP

MVKD indata,AR3+0%;在这一行设置探针与断点用于从indata.dat文件中读输入数据

RPTZ A,#38

MAC AR3+0%,AR4+0%,A

STHA,@outdata;在这一行设置探针与断点用于将滤波结果写到文件outdata.dat中

NOP

;STH A,@y ;保存计算结果

;PORTW @y,PA0 ;硬件仿真时写D/A

B FIR ;跳转

;B FIR ;延迟跳转

;PORTR PA1,AR3+0% ;硬件仿真时读A/D,新数据覆盖最老的数据

.end





实验六快速傅立叶变换(FFT)的实现































献花(0)
+1
(本文系依米荷阳首藏)