XXXX
DSP 课程设计
摘要:
在上学期数字信号处理(DSP)学习的基础上,本次课程设计的目的是,学会使用CCS(Code Composer Studio) 或matlab7.0集成开发环境软件,在此集成开发环境下完成工程项目创建,程序编写,编译,链接,调试以及数据的分析。同时完成一个余弦波信号发生器的程序的编写,并在集成开发环境下进行模拟运行,观察结果。
目录
第一章 概述„„„„„„„„„„„„„„„„„„„„„„„04 1.1设计目的„„„„„„„„„„„„„„„„„„„„„04 1.2设计内容„„„„„„„„„„„„„„„„„„„„„04 1.3设计原理„„„„„„„„„„„„„„„„„„„„„04 第二章 总体方案设计„„„„„„„„„„„„„„„„„„„08
2.1 总体实现方案„„„„„„„„„„„„„„„„„„„08 2.2 具体实现步骤„„„„„„„„„„„„„„„„„„„10 第三章 源程序„„„„„„„„„„„„„„„„„„„„„„11 第四章 设计仿真结果及分析„„„„„„„„„„„„„„„„15 第五章 Matlab下产生该正弦信号„„„„„„„„„„„„„16 5.1 程序„„„„„„„„„„„„„„„„„„„„„„„16 5.2实验图形„„„„„„„„„„„„„„„„„„„„„16 第六章 设计总结„„„„„„„„„„„„„„„„„„„„„17
第一章 概述
1.1设计目的
学会使用CCS(Code Composer Studio)集成开发环境软件,在此集成开发环境下完成工程项目创建,程序编写,编译,链接,调试以及数据的分析。同时完成一个正弦波信号发生器的程序的编写,并在集成开发环境下进行模拟运行,观察结果。
1.2设计内容
编写一个产生正弦波信号的程序,在CCS 软件下进行模拟运行,观察输出结果。
1.3设计原理
正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信号处理系统中。通常有两种方法可以产生正弦波,分别为查表法和泰勒级数展开法。查表法是通过查表的方式来实现正弦波,主要用于对精度要求不很高的场合。泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。本次课程设计只要使用泰勒级数展开法来实现正弦波信号。 1. 产生正弦波的算法
在高等数学中,正弦函数和余弦函数可以展开成泰勒级数,其表达式为
x 3x 5x 7x 9
sin(x ) =x -+-+-
3! 5! 7! 9!
x 2x 4x 6x 8
x () =1-+-+- c o s
2! 4! 6! 8!
若要计算一个角度x 的正弦和余弦值,可取泰勒级数的前5项进行近似计算。
222⎛⎛⎫⎫⎫⎛⎫x 3x 5x 7x 9x 2⎛x x x 1- 1-⎪⎪⎪ ⎪sin(x ) =x -+-+=x 1-1- ⎪⎪⎪ 2⨯3 4⨯5 3! 5! 7! 9! ⎝6⨯7⎝8⨯9⎭⎭⎭⎪⎝⎝⎭222
⎛⎛⎫⎫⎫x 2x 4x 6x 8x 2⎛x x x 1-⎪⎪ ⎪cos(x ) =1-+-+=1-1-1- ⎪ ⎪⎪2! 4! 6! 8! 2 ⎝3⨯4⎝5⨯6⎝7⨯8⎭⎭⎭
由上述两个式子可以推导出递推公式,即
sin(nx)=2cos(x)sin[(n-1)x]-sin[(n-2)x] cos(nx)=2cos(x)sin[(n-1)x]-cos[(n-2)x]
由递推公式可以看出,在计算正弦和余弦值时,不仅需要已知cos(x),而且还需要sin[(n-1)x]、sin[(n-2)x]和cos[(n-2)x]。 2. 正弦波的实现
⑴计算一个角度的正弦值
利用泰勒级数的展开式,可计算一个角度x 的正弦值,并采用子程序的调用方式。在调用前先在数据存储器d_xs单元中存放x 的弧度值,计算结果存放在d_sinx单元中。
实现计算一个角度的正弦值的程序片段如下: sinx:
.def d_xs,d_sinx .data
table_s .word 01C7H ;C1=1/(8*9) .word 030BH ;C2=1/(6*7) d_coef_s d_xs d_squr_xs d_temp_s d_sinx d_l_s .word 0666H ;C3=1/(4*5) .word 1556H ;C4=1/(2*3) .usect "coef_s",4 .usect "sin_vars",1 .usect "sin_vars",1 .usect "sin_vars",1 .usect "sin_vars",1 .usect "sin_vars",1 .text
SSBX FRCT
STM #d_coef_s,AR5 ;move coeffs table_s RPT #3
MVPD #table_s,*AR5+ STM #d_coef_s,AR3 STM #d_xs,AR2 STM #d_l_s,AR4 ST #7FFFH,d_l_s
SQUR *AR2+,A ;A=x^2 ST A,*AR2 ;(AR2)=x^2 ||LD *AR4,B ;B=1
MASR *AR2+,*AR3+,B,A ;A=1-x^2/72,T=x^2
MPYA A ;A=T*A=x^2(1-x^2/72) STH A,*AR2 ;(d_temp)=x^2(1-x^2/72) MASR *AR2-,*AR3+,B,A
;A=1-x^2/42(1-x^2/72);T=x^2(1-x^2/72)
MPYA *AR2+ ;B=x^2(1-x^2/42(1-x^2/72)) ST B,*AR2
;(d_temp)=x^2(1-x^2/42(1-x^2/72))
||LD *AR4,B ;B=1 MASR *AR2-,*AR3+,B,A
;A=1-x^2/20(1-x^2/42(1-x^2/72))
MPYA *AR2+
;B=x^2(1-x^2/20(1-x^2/42(1-x^2/72)))
ST B,*AR2 ;(d_temp)=B ||LD *AR4,B ;B=1
MASR *AR2-,*AR3,B,A
;A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72)))
MPYA d_xs ;B=x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72)))) STH B,d_sinx ;sin(theta) RET
⑵计算一个角度的余弦值
利用余弦函数展开的泰勒级数的前五项计算一个角度的余弦值,可采用子程序的调用方式来实现。调用前先将x 弧度值放在数据存储器d_xc单元中,计算结果存放在d_cosx单元中。
实现计算一个角度的余弦值的程序片段如下: cosx:
.def d_xc,d_cosx d_coef_c .usect "coef_c",4 .data
table_c .word 0249H ;C1=1/(7*8) .word 0444H ;C2=1/(5*6) .word 0AABH ;C3=1/(3*4) .word 4000H ;C4=1/2 d_xc .usect "cos_vars",1 d_squr_xc .usect "cos_vars",1 d_temp_c .usect "cos_vars",1 d_cosx .usect "cos_vars",1 c_l_c .usect "cos_vars",1 .text
SSBX FRCT
STM #d_coef_c,AR5 ;move coeffs table_c 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 ;A=x^2 ST A,*AR2 ;(AR2)=x^2 ||LD *AR4,B ;B=1
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=-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56))) MAR *AR2+ RETD
ADD *AR4,16,B ;B=-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56))) STH B,*AR2 ;cos(theta) RET ⑶正弦波的实现
利用计算一个角度的正弦值和余弦值程序可实现正弦波。其实现步骤如下: 第一步:利用sin_start和cos_start子程序,计算0 ~45 (间隔为0. 5 )的正弦和余弦值;
第二步:利用sin(2x)=2sin(x)cos(x)公式,计算0 ~90 的正弦值(间隔为1 ); 第三步:通过复制,获得0 ~359 的正弦值;
第四步:将0 ~359 的正弦值重复从PA 口输出,便可得到正弦波。 产生正弦波的程序片段如下:
.mmregs
.def start
.def d_xs,d_sinx,d_xc,d_cosx,sinx,cosx sin_x: .usect "sin_x",360 STACK: .usect "STACK",10H
k_theta .set 286 ;theta=pi/360(0.5deg) start:
.text
STM #STACK+10H,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 ;d_sinx=sin(x) CALL cosx ;d_cosx=cos(x) LD #d_sinx,DP
LD @d_sinx,16,A ;A=sin(x)
MPYA @d_cosx ;B=sin(x)*cos(x) STH B,1,*AR6+ ;AR6----2*sin(x) MAR *AR1+0
loop1: STM #sin_x+89, AR7 ;sin91(deg.)-sin179(deg.)
STM #88,BRC RPTB loop2-1 LD *AR7-,A STL A,*AR6+
loop2: STM #179,BRC ;sin180(deg.)-sin359(deg.) STM #sin_x,AR7 RPTB loop3-1 LD *AR7+,A NEG A
STL A,*AR6+
loop3: STM #sin_x,AR6 ;generate sin wave STM #1,AR0 STM #360,BK B loop3
产生正弦波链接命令文件的程序片段如下: 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 .data :> EPROM PAGE 0 STACK :> SPRAM PAGE 1 sin_vars :> DARAM1 PAGE 1 coef_s :> DARAM1 PAGE 1 cos_vars :> DARAM2 PAGE 1 coef_c :> DARAM2 PAGE 1
sin_x : align(512) {} > DARAM3 PAGE 1 .vectors :> VECS PAGE 0 }
在实际应用中,正弦波是通过D/A口输出的。选择每个正弦周期中的样点数、改变每个样点之间的延迟,就能够产生不同频率的波形,也可以利用软件改变波形的幅度以及起始相位。
第二章 总体方案设计
2.1. 总体实现方案
我们知道一个角度为x 的正弦和余弦函数,都可以展开为泰勒级数,且其前五项可以看为:
2⎛222⎛⎫⎛⎛⎫⎫⎫x 3x 5x 7x 9x x x x ⎪ 1-⎪⎪ ⎪sin(x ) =x -+-+- ≈x 1-1-1- ⎪ ⎪ 2⨯3 4⨯5⎝6⨯7⎝8⨯9⎭⎪3! 5! 7! 9! ⎭⎭⎪⎝⎝⎭222
⎛⎛⎫⎫⎫x 2x 4x 6x 8x 2⎛x x x ⎪⎪ ⎪cos(x ) =1-+-+- ≈1-1-1-1- ⎪ ⎪2! 4! 6! 8! 2⎝3⨯4⎝5⨯6⎝7⨯8⎭⎪⎭⎭
本程序的编程思想是这样的,正弦波的波形可以看为由无数点组成,这些点
与x 轴的每一个角度值相对应,那么我们可以利用DSP 处理器处理大量重复计算的优势来计算,x 轴每一点对应的y 轴的值(在x 轴取360个点来进行逼近),由于程序的编制采用小数形式,其弧度大于1的正弦值得不到,这就对正弦波的产生造成了障碍。可由于正弦波的特殊的对称形式给程序的编制找到了出口。
sin(π) 的弧度为0.7854
序得到N 又可以利用公式:sin 2α=2sin αcos α得到0~π之间的正弦值。而
0~π
之间的正弦曲线与π~π之间的正弦曲线通过x =π这条轴左右对称,
那么就可以得到π~π的正弦值,而0~π的正弦曲线的相反数通过x =π这条轴与π~2π左右对称。这样π~2π的正弦值也得到了。一个周期内完整的正弦波就得到了。正弦波产生的流程图如下:
2.2. 具体实现步骤
本课程设计需要使用C54X 汇编语言产生正弦波,并通过 CCS 的图形显示工具观察波形。设计分以下几步完成: 启动 CCS ,操作如下:
1.建立新的工程文件:点击Project →New ,保存文件名为sinx.pjt 。
2.建立汇编源程序:点击Fil e →New →Source File菜单命令,打开一个空白文档,将汇编源程序逐条输入后,单击Flie →Save 菜单命令,文件类型保存为(*.asm), 单击“保存”按钮,以上汇编程序被存盘。
3.建立连接命令文件:点击Fil e →New →Source File菜单命令,打开一个空白文档,将链接命令文件逐条输入后,单击Flie →Save 菜单命令,文件类型保存为(*.cmd), 单击“保存”按钮,以上链接命令文件被存盘。
4.选择 Project 菜单中的Add File to Project 选项,将汇编源程序sin.asm 和链接定位sin.cmd 文件依次添加到工程文件中。
5.选择 Project 菜单中的 Options 选项,并选择 build options 项来修改或添加编译、连接中使用的参数。选择Linker 窗口,在“Output Filename”栏中写入输出 OUT 文件的名字,如 sin.out ,还可以设置生成的 map 文件名。 6.完成汇编,编译和链接,正确产生.out 文件:点击Project 菜单中的Rebuild all ,请注意在监视窗口显示的汇编,编译和链接的相关信息。如果没有错误,将产生sin.out 文件;如果有错,在监视窗口以红色字体显示出错误行,用鼠标双击该行,光标跳将至源程序相应的出错行。修改错误后,重新汇编链接。 7.在 Project 选项中打开sin.pjt 文件, 使用 Build 选项完成编译、连接。
8.使用 File 菜单中的 Load Program 将 OUT 文件装入。然后选择 Debu g →Run ,程序执行过程中可以使用 Debug →Halt 暂停程序的执行。 9.选择 View -> Graph -> Time/Frequency菜单打开一个图形显示窗口。将 “Start Address”项改为地址sin_x,将“Acquisition Buffer Size”项设置为360,将“Display Data Size”项设置为360,将“DSP Data Type”改为“16-bit signed integer” 。 即将Graph Property Dialog对话框改为见下图:
这样,将在图形显示窗口中显示从sin_x(首地址)开始的360个点的 16 位有符号整数的图形。
第三章 源程序
主要参数
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 "sin.asm" ;为汇编文件取名为“sin.asm ” .mmregs ;定义存储器映像寄存器
.def _c_int00
.ref sinx,d_xs,d_sinx,cosx,d_xc,d_cosx;定义标号 sin_x: .usect "sin_x",360 ;为"sin_x"保留360个存储空间 STACK: .usect "STACK",10 ;为堆栈保留10个存储空间
k_theta .set 286 ;theta=pi/360(0.5deg)
PA0 .set 0
_c_int00
.text ;定义文本程序代码段
STM #STACK+10,SP ;设置堆栈指针
STM k_theta,AR0 ;AR0-->K_theta(increment) STM 0,AR1 ;(AR1)=X(rad)
STM #sin_x,AR6 ;AR6- - >sin(x)
STM #90,BRC ;form sin0(deg.)—sin90(deg)
;重复执行块语句(下条语句开始至
loop1-1 )91次
RPTB loop1-1
LDM AR1,A
LD #d_xs,DP ;DPd_xs
STL A,@d_xs ;(A)低16位→d_xs
STL A,@d_xc ;(A)低16位→d_xc
CALL sinx ;调用sinx 程序
CALL cosx ;调用conx 程序
LD #d_sinx,DP ;DP d_sinx
LD @d_sinx,16,A ;A=sin(x)
MPYA @d_cosx ;B= sin(x)*cos(x)
STH B,1,*AR6+ ;AR6- - >2*sin(x)*cos(x)
MAR *AR1+0 ;修改辅助寄存器AR1
loop1: STM #sin_x+89,AR7 ;sin91(deg.)- -sin179(deg.) STM #88,BRC ;重复执行下条指令至loop2-1 RPTB loop2-1 ;处90次
LD *AR7-,A ;((AR7)) →A, 然后AR7减去1 STL A,*AR6+ ;(A) 低16位→AR6
loop2: STM #179,BRC ;sin180(deg.)- -sin359(deg.)
;(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
STM #1,AR0
STM #360,BK
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 "coef_s",4
d_xs .usect "sin_vars",1
d_squr_xs .usect "sin_vars",1
d_temp_s .usect "sin_vars",1
d_sinx .usect "sin_vars",1
c_l_s .usect "sin_vars",1
.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
;generate sin wave AR6指向sin_x ;AR ← 01 ;BK ←360 ;PA0=*AR6+0%,向PA0输出数据 ; ;定义标号d_xs,d_sinx ;定义数据代码段 ;c1=1/(8*9) ;c1=1/(6*7) ;c1=1/(4*5) ;c1=1/(2*3) ;为"coef_s"保留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
MASR *AR2+,*AR3+,B,A ;从累加器A 中减去(AR2)*(AR3) MPYA A ;操作数与累加器A 中高位相乘 STH A,*AR2 ;(A )高16位→AR2
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+
ST B,*AR2
||LD *AR4,B
MASR *AR2-,*AR3+,B,A
MPYA d_xs
STH B,d_sinx
RET
cosx:
.def d_xc,d_cosx
d_coef_c .usect "coef_c",4
.data
table_c .word 0249h
.word 0444h
.word 0aabh
.word 4000h
d_xc .usect "cos_vars",1
元
d_squr_xc .usect "cos_vars",1
d_temp_c .usect "cos_vars",1
d_cosx .usect "cos_vars",1
c_l_c .usect "cos_vars",1
.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
;与累加器A 中高16位相乘 ;(B )左移16位→AR2 ;(AR4)左移16位→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
SQUR *AR2+,A ;求X 的平方存放在累加器A 中 ST A,*AR2 ;(A )左移16位→AR2
||LD *AR4,B ;(AR4)左移16位→B
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
STACK :>SPRAM PAGE 1 ;堆栈起始地址为0060h ,长度为0020h sin_vars :>DARAM1 PAGE 1 ;标号为sin_vars段的起始地址为0080
;长度为0010h
coef_s :>DARAM1 PAGE 1 ;标号为coef_s段的起始地址为0070h ;长度为0010h
cos_vars :>DARAM2 PAGE 1 ;标号为cos_vars段的起始地址为0090h ;长度为0010h
coef_c :>DARAM2 PAGE 1 ;标号为coef_c段的起始地址为0080h ;长度为0020h
sin_x : align(512) {} > DARAM3 PAGE 1
.vectors :>VECS PAGE 0
}
3. 复位向量文件sin_v.asm:
.title "sin_v.asm"
.ref _c_int00
.sect ".vectors"
B _c_int00
.end
第四章 设计仿真结果及分析
在ccs 集成环境中实现正弦波能够起到防止干扰的作用,同时也大大地减小了波形的线性失真。同时我们也能从中看出ccs 能够精确地对各个角度进行计算得出相应的正弦值,幅度和频率易于调节,波形也较为稳定,抗干扰能力较强。 最重要的是这种设计方案简单可行,新颖实用,具有很高的实践和推广价值。
XXXX
DSP 课程设计
摘要:
在上学期数字信号处理(DSP)学习的基础上,本次课程设计的目的是,学会使用CCS(Code Composer Studio) 或matlab7.0集成开发环境软件,在此集成开发环境下完成工程项目创建,程序编写,编译,链接,调试以及数据的分析。同时完成一个余弦波信号发生器的程序的编写,并在集成开发环境下进行模拟运行,观察结果。
目录
第一章 概述„„„„„„„„„„„„„„„„„„„„„„„04 1.1设计目的„„„„„„„„„„„„„„„„„„„„„04 1.2设计内容„„„„„„„„„„„„„„„„„„„„„04 1.3设计原理„„„„„„„„„„„„„„„„„„„„„04 第二章 总体方案设计„„„„„„„„„„„„„„„„„„„08
2.1 总体实现方案„„„„„„„„„„„„„„„„„„„08 2.2 具体实现步骤„„„„„„„„„„„„„„„„„„„10 第三章 源程序„„„„„„„„„„„„„„„„„„„„„„11 第四章 设计仿真结果及分析„„„„„„„„„„„„„„„„15 第五章 Matlab下产生该正弦信号„„„„„„„„„„„„„16 5.1 程序„„„„„„„„„„„„„„„„„„„„„„„16 5.2实验图形„„„„„„„„„„„„„„„„„„„„„16 第六章 设计总结„„„„„„„„„„„„„„„„„„„„„17
第一章 概述
1.1设计目的
学会使用CCS(Code Composer Studio)集成开发环境软件,在此集成开发环境下完成工程项目创建,程序编写,编译,链接,调试以及数据的分析。同时完成一个正弦波信号发生器的程序的编写,并在集成开发环境下进行模拟运行,观察结果。
1.2设计内容
编写一个产生正弦波信号的程序,在CCS 软件下进行模拟运行,观察输出结果。
1.3设计原理
正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信号处理系统中。通常有两种方法可以产生正弦波,分别为查表法和泰勒级数展开法。查表法是通过查表的方式来实现正弦波,主要用于对精度要求不很高的场合。泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。本次课程设计只要使用泰勒级数展开法来实现正弦波信号。 1. 产生正弦波的算法
在高等数学中,正弦函数和余弦函数可以展开成泰勒级数,其表达式为
x 3x 5x 7x 9
sin(x ) =x -+-+-
3! 5! 7! 9!
x 2x 4x 6x 8
x () =1-+-+- c o s
2! 4! 6! 8!
若要计算一个角度x 的正弦和余弦值,可取泰勒级数的前5项进行近似计算。
222⎛⎛⎫⎫⎫⎛⎫x 3x 5x 7x 9x 2⎛x x x 1- 1-⎪⎪⎪ ⎪sin(x ) =x -+-+=x 1-1- ⎪⎪⎪ 2⨯3 4⨯5 3! 5! 7! 9! ⎝6⨯7⎝8⨯9⎭⎭⎭⎪⎝⎝⎭222
⎛⎛⎫⎫⎫x 2x 4x 6x 8x 2⎛x x x 1-⎪⎪ ⎪cos(x ) =1-+-+=1-1-1- ⎪ ⎪⎪2! 4! 6! 8! 2 ⎝3⨯4⎝5⨯6⎝7⨯8⎭⎭⎭
由上述两个式子可以推导出递推公式,即
sin(nx)=2cos(x)sin[(n-1)x]-sin[(n-2)x] cos(nx)=2cos(x)sin[(n-1)x]-cos[(n-2)x]
由递推公式可以看出,在计算正弦和余弦值时,不仅需要已知cos(x),而且还需要sin[(n-1)x]、sin[(n-2)x]和cos[(n-2)x]。 2. 正弦波的实现
⑴计算一个角度的正弦值
利用泰勒级数的展开式,可计算一个角度x 的正弦值,并采用子程序的调用方式。在调用前先在数据存储器d_xs单元中存放x 的弧度值,计算结果存放在d_sinx单元中。
实现计算一个角度的正弦值的程序片段如下: sinx:
.def d_xs,d_sinx .data
table_s .word 01C7H ;C1=1/(8*9) .word 030BH ;C2=1/(6*7) d_coef_s d_xs d_squr_xs d_temp_s d_sinx d_l_s .word 0666H ;C3=1/(4*5) .word 1556H ;C4=1/(2*3) .usect "coef_s",4 .usect "sin_vars",1 .usect "sin_vars",1 .usect "sin_vars",1 .usect "sin_vars",1 .usect "sin_vars",1 .text
SSBX FRCT
STM #d_coef_s,AR5 ;move coeffs table_s RPT #3
MVPD #table_s,*AR5+ STM #d_coef_s,AR3 STM #d_xs,AR2 STM #d_l_s,AR4 ST #7FFFH,d_l_s
SQUR *AR2+,A ;A=x^2 ST A,*AR2 ;(AR2)=x^2 ||LD *AR4,B ;B=1
MASR *AR2+,*AR3+,B,A ;A=1-x^2/72,T=x^2
MPYA A ;A=T*A=x^2(1-x^2/72) STH A,*AR2 ;(d_temp)=x^2(1-x^2/72) MASR *AR2-,*AR3+,B,A
;A=1-x^2/42(1-x^2/72);T=x^2(1-x^2/72)
MPYA *AR2+ ;B=x^2(1-x^2/42(1-x^2/72)) ST B,*AR2
;(d_temp)=x^2(1-x^2/42(1-x^2/72))
||LD *AR4,B ;B=1 MASR *AR2-,*AR3+,B,A
;A=1-x^2/20(1-x^2/42(1-x^2/72))
MPYA *AR2+
;B=x^2(1-x^2/20(1-x^2/42(1-x^2/72)))
ST B,*AR2 ;(d_temp)=B ||LD *AR4,B ;B=1
MASR *AR2-,*AR3,B,A
;A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72)))
MPYA d_xs ;B=x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72)))) STH B,d_sinx ;sin(theta) RET
⑵计算一个角度的余弦值
利用余弦函数展开的泰勒级数的前五项计算一个角度的余弦值,可采用子程序的调用方式来实现。调用前先将x 弧度值放在数据存储器d_xc单元中,计算结果存放在d_cosx单元中。
实现计算一个角度的余弦值的程序片段如下: cosx:
.def d_xc,d_cosx d_coef_c .usect "coef_c",4 .data
table_c .word 0249H ;C1=1/(7*8) .word 0444H ;C2=1/(5*6) .word 0AABH ;C3=1/(3*4) .word 4000H ;C4=1/2 d_xc .usect "cos_vars",1 d_squr_xc .usect "cos_vars",1 d_temp_c .usect "cos_vars",1 d_cosx .usect "cos_vars",1 c_l_c .usect "cos_vars",1 .text
SSBX FRCT
STM #d_coef_c,AR5 ;move coeffs table_c 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 ;A=x^2 ST A,*AR2 ;(AR2)=x^2 ||LD *AR4,B ;B=1
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=-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56))) MAR *AR2+ RETD
ADD *AR4,16,B ;B=-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56))) STH B,*AR2 ;cos(theta) RET ⑶正弦波的实现
利用计算一个角度的正弦值和余弦值程序可实现正弦波。其实现步骤如下: 第一步:利用sin_start和cos_start子程序,计算0 ~45 (间隔为0. 5 )的正弦和余弦值;
第二步:利用sin(2x)=2sin(x)cos(x)公式,计算0 ~90 的正弦值(间隔为1 ); 第三步:通过复制,获得0 ~359 的正弦值;
第四步:将0 ~359 的正弦值重复从PA 口输出,便可得到正弦波。 产生正弦波的程序片段如下:
.mmregs
.def start
.def d_xs,d_sinx,d_xc,d_cosx,sinx,cosx sin_x: .usect "sin_x",360 STACK: .usect "STACK",10H
k_theta .set 286 ;theta=pi/360(0.5deg) start:
.text
STM #STACK+10H,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 ;d_sinx=sin(x) CALL cosx ;d_cosx=cos(x) LD #d_sinx,DP
LD @d_sinx,16,A ;A=sin(x)
MPYA @d_cosx ;B=sin(x)*cos(x) STH B,1,*AR6+ ;AR6----2*sin(x) MAR *AR1+0
loop1: STM #sin_x+89, AR7 ;sin91(deg.)-sin179(deg.)
STM #88,BRC RPTB loop2-1 LD *AR7-,A STL A,*AR6+
loop2: STM #179,BRC ;sin180(deg.)-sin359(deg.) STM #sin_x,AR7 RPTB loop3-1 LD *AR7+,A NEG A
STL A,*AR6+
loop3: STM #sin_x,AR6 ;generate sin wave STM #1,AR0 STM #360,BK B loop3
产生正弦波链接命令文件的程序片段如下: 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 .data :> EPROM PAGE 0 STACK :> SPRAM PAGE 1 sin_vars :> DARAM1 PAGE 1 coef_s :> DARAM1 PAGE 1 cos_vars :> DARAM2 PAGE 1 coef_c :> DARAM2 PAGE 1
sin_x : align(512) {} > DARAM3 PAGE 1 .vectors :> VECS PAGE 0 }
在实际应用中,正弦波是通过D/A口输出的。选择每个正弦周期中的样点数、改变每个样点之间的延迟,就能够产生不同频率的波形,也可以利用软件改变波形的幅度以及起始相位。
第二章 总体方案设计
2.1. 总体实现方案
我们知道一个角度为x 的正弦和余弦函数,都可以展开为泰勒级数,且其前五项可以看为:
2⎛222⎛⎫⎛⎛⎫⎫⎫x 3x 5x 7x 9x x x x ⎪ 1-⎪⎪ ⎪sin(x ) =x -+-+- ≈x 1-1-1- ⎪ ⎪ 2⨯3 4⨯5⎝6⨯7⎝8⨯9⎭⎪3! 5! 7! 9! ⎭⎭⎪⎝⎝⎭222
⎛⎛⎫⎫⎫x 2x 4x 6x 8x 2⎛x x x ⎪⎪ ⎪cos(x ) =1-+-+- ≈1-1-1-1- ⎪ ⎪2! 4! 6! 8! 2⎝3⨯4⎝5⨯6⎝7⨯8⎭⎪⎭⎭
本程序的编程思想是这样的,正弦波的波形可以看为由无数点组成,这些点
与x 轴的每一个角度值相对应,那么我们可以利用DSP 处理器处理大量重复计算的优势来计算,x 轴每一点对应的y 轴的值(在x 轴取360个点来进行逼近),由于程序的编制采用小数形式,其弧度大于1的正弦值得不到,这就对正弦波的产生造成了障碍。可由于正弦波的特殊的对称形式给程序的编制找到了出口。
sin(π) 的弧度为0.7854
序得到N 又可以利用公式:sin 2α=2sin αcos α得到0~π之间的正弦值。而
0~π
之间的正弦曲线与π~π之间的正弦曲线通过x =π这条轴左右对称,
那么就可以得到π~π的正弦值,而0~π的正弦曲线的相反数通过x =π这条轴与π~2π左右对称。这样π~2π的正弦值也得到了。一个周期内完整的正弦波就得到了。正弦波产生的流程图如下:
2.2. 具体实现步骤
本课程设计需要使用C54X 汇编语言产生正弦波,并通过 CCS 的图形显示工具观察波形。设计分以下几步完成: 启动 CCS ,操作如下:
1.建立新的工程文件:点击Project →New ,保存文件名为sinx.pjt 。
2.建立汇编源程序:点击Fil e →New →Source File菜单命令,打开一个空白文档,将汇编源程序逐条输入后,单击Flie →Save 菜单命令,文件类型保存为(*.asm), 单击“保存”按钮,以上汇编程序被存盘。
3.建立连接命令文件:点击Fil e →New →Source File菜单命令,打开一个空白文档,将链接命令文件逐条输入后,单击Flie →Save 菜单命令,文件类型保存为(*.cmd), 单击“保存”按钮,以上链接命令文件被存盘。
4.选择 Project 菜单中的Add File to Project 选项,将汇编源程序sin.asm 和链接定位sin.cmd 文件依次添加到工程文件中。
5.选择 Project 菜单中的 Options 选项,并选择 build options 项来修改或添加编译、连接中使用的参数。选择Linker 窗口,在“Output Filename”栏中写入输出 OUT 文件的名字,如 sin.out ,还可以设置生成的 map 文件名。 6.完成汇编,编译和链接,正确产生.out 文件:点击Project 菜单中的Rebuild all ,请注意在监视窗口显示的汇编,编译和链接的相关信息。如果没有错误,将产生sin.out 文件;如果有错,在监视窗口以红色字体显示出错误行,用鼠标双击该行,光标跳将至源程序相应的出错行。修改错误后,重新汇编链接。 7.在 Project 选项中打开sin.pjt 文件, 使用 Build 选项完成编译、连接。
8.使用 File 菜单中的 Load Program 将 OUT 文件装入。然后选择 Debu g →Run ,程序执行过程中可以使用 Debug →Halt 暂停程序的执行。 9.选择 View -> Graph -> Time/Frequency菜单打开一个图形显示窗口。将 “Start Address”项改为地址sin_x,将“Acquisition Buffer Size”项设置为360,将“Display Data Size”项设置为360,将“DSP Data Type”改为“16-bit signed integer” 。 即将Graph Property Dialog对话框改为见下图:
这样,将在图形显示窗口中显示从sin_x(首地址)开始的360个点的 16 位有符号整数的图形。
第三章 源程序
主要参数
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 "sin.asm" ;为汇编文件取名为“sin.asm ” .mmregs ;定义存储器映像寄存器
.def _c_int00
.ref sinx,d_xs,d_sinx,cosx,d_xc,d_cosx;定义标号 sin_x: .usect "sin_x",360 ;为"sin_x"保留360个存储空间 STACK: .usect "STACK",10 ;为堆栈保留10个存储空间
k_theta .set 286 ;theta=pi/360(0.5deg)
PA0 .set 0
_c_int00
.text ;定义文本程序代码段
STM #STACK+10,SP ;设置堆栈指针
STM k_theta,AR0 ;AR0-->K_theta(increment) STM 0,AR1 ;(AR1)=X(rad)
STM #sin_x,AR6 ;AR6- - >sin(x)
STM #90,BRC ;form sin0(deg.)—sin90(deg)
;重复执行块语句(下条语句开始至
loop1-1 )91次
RPTB loop1-1
LDM AR1,A
LD #d_xs,DP ;DPd_xs
STL A,@d_xs ;(A)低16位→d_xs
STL A,@d_xc ;(A)低16位→d_xc
CALL sinx ;调用sinx 程序
CALL cosx ;调用conx 程序
LD #d_sinx,DP ;DP d_sinx
LD @d_sinx,16,A ;A=sin(x)
MPYA @d_cosx ;B= sin(x)*cos(x)
STH B,1,*AR6+ ;AR6- - >2*sin(x)*cos(x)
MAR *AR1+0 ;修改辅助寄存器AR1
loop1: STM #sin_x+89,AR7 ;sin91(deg.)- -sin179(deg.) STM #88,BRC ;重复执行下条指令至loop2-1 RPTB loop2-1 ;处90次
LD *AR7-,A ;((AR7)) →A, 然后AR7减去1 STL A,*AR6+ ;(A) 低16位→AR6
loop2: STM #179,BRC ;sin180(deg.)- -sin359(deg.)
;(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
STM #1,AR0
STM #360,BK
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 "coef_s",4
d_xs .usect "sin_vars",1
d_squr_xs .usect "sin_vars",1
d_temp_s .usect "sin_vars",1
d_sinx .usect "sin_vars",1
c_l_s .usect "sin_vars",1
.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
;generate sin wave AR6指向sin_x ;AR ← 01 ;BK ←360 ;PA0=*AR6+0%,向PA0输出数据 ; ;定义标号d_xs,d_sinx ;定义数据代码段 ;c1=1/(8*9) ;c1=1/(6*7) ;c1=1/(4*5) ;c1=1/(2*3) ;为"coef_s"保留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
MASR *AR2+,*AR3+,B,A ;从累加器A 中减去(AR2)*(AR3) MPYA A ;操作数与累加器A 中高位相乘 STH A,*AR2 ;(A )高16位→AR2
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+
ST B,*AR2
||LD *AR4,B
MASR *AR2-,*AR3+,B,A
MPYA d_xs
STH B,d_sinx
RET
cosx:
.def d_xc,d_cosx
d_coef_c .usect "coef_c",4
.data
table_c .word 0249h
.word 0444h
.word 0aabh
.word 4000h
d_xc .usect "cos_vars",1
元
d_squr_xc .usect "cos_vars",1
d_temp_c .usect "cos_vars",1
d_cosx .usect "cos_vars",1
c_l_c .usect "cos_vars",1
.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
;与累加器A 中高16位相乘 ;(B )左移16位→AR2 ;(AR4)左移16位→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
SQUR *AR2+,A ;求X 的平方存放在累加器A 中 ST A,*AR2 ;(A )左移16位→AR2
||LD *AR4,B ;(AR4)左移16位→B
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
STACK :>SPRAM PAGE 1 ;堆栈起始地址为0060h ,长度为0020h sin_vars :>DARAM1 PAGE 1 ;标号为sin_vars段的起始地址为0080
;长度为0010h
coef_s :>DARAM1 PAGE 1 ;标号为coef_s段的起始地址为0070h ;长度为0010h
cos_vars :>DARAM2 PAGE 1 ;标号为cos_vars段的起始地址为0090h ;长度为0010h
coef_c :>DARAM2 PAGE 1 ;标号为coef_c段的起始地址为0080h ;长度为0020h
sin_x : align(512) {} > DARAM3 PAGE 1
.vectors :>VECS PAGE 0
}
3. 复位向量文件sin_v.asm:
.title "sin_v.asm"
.ref _c_int00
.sect ".vectors"
B _c_int00
.end
第四章 设计仿真结果及分析
在ccs 集成环境中实现正弦波能够起到防止干扰的作用,同时也大大地减小了波形的线性失真。同时我们也能从中看出ccs 能够精确地对各个角度进行计算得出相应的正弦值,幅度和频率易于调节,波形也较为稳定,抗干扰能力较强。 最重要的是这种设计方案简单可行,新颖实用,具有很高的实践和推广价值。