DSP课程设计正弦波信号发生器报告 联系客服

发布时间 : 星期六 文章DSP课程设计正弦波信号发生器报告更新完毕开始阅读

符号整数的图形。

主要参数

1. sin(theta)=x(1-x^2/2*3(1-x^2/4*5(1-x^2/6*7(1-x^2/8*9)))) 2. cos(theta)=1-x^2/2*3(1-x^2/4*5(1-x^2/6*7(1-x^2/8*9))) 3. sin(2*theta)=2*sin(theta)*cos(theta)

源程序

1. 产生正弦波程序清单sin.asm:

.title \ .mmregs .def _c_int00

.ref sinx,d_xs,d_sinx,cosx,d_xc,d_cosxsin_x: .usect \STACK: .usect \k_theta .set 286 PA0 .set 0 _c_int00

.text STM #STACK+10,SP STM k_theta,AR0 STM 0,AR1 STM #sin_x,AR6 STM #90,BRC RPTB loop1-1 LDM AR1,A

LD #d_xs,DP STL A,@d_xs STL A,@d_xc CALL sinx CALL cosx LD #d_sinx,DP LD @d_sinx,16,A MPYA @d_cosx STH B,1,*AR6+ MAR *AR1+0 loop1: STM #sin_x+89,AR7 STM #88,BRC RPTB loop2-1 LD *AR7-,A STL A,*AR6+ loop2: STM #179,BRC

;为汇编文件取名为“sin.asm” ;定义存储器映像寄存器 ;定义标号 ;为\保留360个存储空间 ;为堆栈保留10个存储空间 ;theta=pi/360(0.5deg) ;定义文本程序代码段 ;设置堆栈指针

;AR0-->K_theta(increment) ;(AR1)=X(rad) ;AR6- - >sin(x)

;form sin0(deg.)—sin90(deg)

;重复执行块语句(下条语句开始至loop1-1 )91次

;DPd_xs

;(A)低16位→d_xs ;(A)低16位→d_xc ;调用sinx程序 ;调用conx程序 ;DP? d_sinx ;A=sin(x)

;B= sin(x)*cos(x)

;AR6- - >2*sin(x)*cos(x) ;修改辅助寄存器AR1

;sin91(deg.)- -sin179(deg.) ;重复执行下条指令至loop2-1 ;处90次

;((AR7)) →A,然后AR7减去1 ;(A) 低16位→AR6

;sin180(deg.)- -sin359(deg.)

8

;(BRC)=179,重复执行180次

STM #sin_x,AR7 ;AR7指向sin_x首地址 RPTB loop3-1 ;

LD *AR7+,A ;((AR7)) →A,然后AR7加1 NEG A ;累加器变负 STL A,*AR6+ ;A低16位→AR6

loop3: STM #sin_x,AR6 ;generate sin wave AR6指向sin_x STM #1,AR0 ;AR? 01 STM #360,BK ;BK?360

loop4: PORTW *AR6+0%,PA0 B loop4 sinx:

.def d_xs,d_sinx .data table_s .word 01c7h .word 030bh .word 0666h .word 1556h d_coef_s .usect \d_xs .usect \d_squr_xs .usect \d_temp_s .usect \d_sinx .usect \c_l_s .usect \ .text SSBX FRCT STM #d_coef_s,AR5 RPT #3 MVPD #table_s,*AR5+ STM #d_coef_s,AR3 STM #d_xs,AR2 STM #c_l_s,AR4 ST #7FFFh,c_l_s SQUR *AR2+,A ST A,*AR2 ||LD *AR4,B MASR *AR2+,*AR3+,B,A MPYA A STH A,*AR2

;PA0=*AR6+0%,向PA0输出数据 ; ;定义标号d_xs,d_sinx ;定义数据代码段 ;c1=1/(8*9) ;c1=1/(6*7) ;c1=1/(4*5) ;c1=1/(2*3)

;为\保留4个存储空间

;为d_xs中sin_vars保留1个存储空

;为d_squr_xs中sin_vars保留1个存

储空间

;为d_temp_s中sin_vars保留1个存

储空间

;为d_sinx中sin_vars保留1个存储

空间

;为d_xs中sin_vars保留1个存储空间 ;定义代码开始段

;设置FRCT=1以解决冗余符号位 ;AR5指向d_coef_s首地址 ;重复下条指令4次

;table_s中的数复制到AR5指向的单

;AR3指向d_coef_s首地址 ;AR2指向d_xs首地址 ;AR4指向c_l_s首地址 ;7FFFh →c_l_s

;AR2指向累加器A中的数值求其平方 ;(A)左移16位→AR2 ;(AR4)左移16位→B

;从累加器A中减去(AR2)*(AR3) ;操作数与累加器A中高位相乘 ;(A)高16位→AR2

9

MASR *AR2-,*AR3+,B,A ;从累加器A中减去(AR2)*(AR3) MPYA *AR2+ ;AR2指向的数与累加器A的高16位相

ST B,*AR2 ;(B)左移16位→AR2 ||LD *AR4,B ;(AR4)左移16位→B

MASR *AR2-,*AR3+,B,A ;从累加器A中减去(AR2)*(AR3) MPYA *AR2+ ;与累加器A中高16位相乘 ST B,*AR2 ;(B)左移16位→AR2

||LD *AR4,B ;(AR4)左移16位→B

MASR *AR2-,*AR3+,B,A MPYA d_xs STH B,d_sinx RET cosx:

.def d_xc,d_cosx d_coef_c .usect \ .data table_c .word 0249h .word 0444h .word 0aabh .word 4000h d_xc .usect \元

d_squr_xc .usect \d_temp_c .usect \d_cosx .usect \c_l_c .usect \ .text SSBX FRCT STM #d_coef_c,AR5 RPT #3 MVPD #table_c,*AR5+ STM #d_coef_c,AR3 STM #d_xc,AR2 STM #c_l_c,AR4 ST #7FFFh,c_l_c SQUR *AR2+,A ST A,*AR2 ||LD *AR4,B

;从累加器A中减去(AR2)*(AR3)

;d_xs指向的操作数与累加器A中高

16位相乘

;(B)高16位→d_sinx ;返回 ;定义标号d_xc,d_cosx ;为coef_c保留4个存储空间 ;定义数据代码段 ;c1=1/(7*8) ;c2=1/(6*5) ;c3=1/(3*4) ;c4=1/2

;为d_xc中cos_vars保存1个存储单;为d_squr_xc中cos_vars保存1个存

储单元

;为d_temp_c中cos_vars保存1个存

储单元

;为d_cosx中cos_vars保存1个存储

单元

;为c_l_c中cos_vars保存1个存储单

;定义文本代码段

;FRCT=1以清除冗余符号位 ;AR5指向d_coef_c首地址 ;重复下条指令4次

;把table_c中的数复制到中AR5 ;AR3指向d_coef_c首地址 ;AR2 指向d_xc首地址 ;AR4指向c_l_c首地址 ;7FFFh→c_l_c

;求X的平方存放在累加器A中 ;(A)左移16位→AR2 AR4)左移16位→B

10

;( MASR *AR2+,*AR3+,B,A ;A=1-x^2/56,T=x^2 MPYA A ;A=T*A=x^2(1-x^2/56) STH A,*AR2 ;(d_temp)= x^2(1-x^2/56) MASR *AR2-,*AR3+,B,A ;A=1-x^2/30(1-x^2/56),

T= x^2(1-x^2/56)

MPYA *AR2+ ;B=x^2(1-x^2/30(1-x^2/56)) ST B,*AR2 ;(d_temp)=

x^2(1-x^2/30(1-x^2/56))

||LD *AR4,B ;B=1 MASR *AR2-,*AR3+,B,A ;A= 1-x^2/12(1-x^2/30(1-x^2/56))

SFTA A,-1,A ;-1/2 NEG A ;

MPYA *AR2+ ;B=1-x^2/2(1-x^2/12(1-x^2/30 ;(1-x^2/56))) MAR *AR2+ ; RETD ;

ADD *AR4,16,B ;B=1-x^2/2(1-x^2/12(1-x^2/30 ;(1-x^2/56))) STH B,*AR2 ;cos(theta) RET ; .end ;

2. *.cmd文件描述输入文件和输出文件,说明系统中有哪些可用存储器、程序段、堆栈及复位向量和中断向量等安排在什么地方。其中MEMORY段就是用来规定目标存储器的模型,通过这条指令,可以定义系统中所包含的各种形式的存储器,以及它们占据的地址范围;SECTIONS段说明如何将输入段组合成输出段以及在可执行文件中定义输出段、规定输出段在存储器中的位置等。正弦波程序链接命令文件sin.cmd: MEMORY {

PAGE 0:

EPROM: org = 0E000h, len = 1000h VECS: org = 0FF80h, len = 0080h PAGE 1:

SPRAM: org = 0060h, len = 0020h DARAM1: org = 0080h, len = 0010h DARAM2: org = 0090h, len = 0010h DARAM3: org = 0200h, len = 0200h }

SECTIONS {

.text :>EPROM PAGE 0

;文本代码段其实地址为0E000h,长度为1000h

.data :>EPROM PAGE 0 ;数据代码段其实地址为0D000h

11