|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Zedd 于 2019-3-30 15:59 编辑 * y i' K1 F: L. ?' P
9 H% |: Y" z5 V6 u/ @) u d9 J
" f$ y% i& s P, W k" I! d实验目标
3 q/ ^. ?1 b+ q9 O* O实现多通道可调信号发生器
5 g0 e$ G; A6 o( Z2 m% ]% Q, a实验平台
; l; l2 b6 f- B' ?芯航线FPGA核心板、ADDA模块3 I, O6 r/ g& V) S
8 R/ M) u+ f$ ]4 \- L
6 ~7 X" [( t) Q& d" o* g+ n4 T 2 o/ i0 H: A8 ]
实验现象9 z5 f: g1 J3 j5 w7 @$ C: ~
实现基于FPGA的多通道可调信号发生器,其中频率、相位以及幅值均可通过PC端串口发送数据对应调节,并可实现4路信号的同步。
+ \9 Y' F# a! L. j9 }实验原理及设计过程% n' Y. q4 A0 P& l; t& \& N; s
经过前面小梅哥基础课程的学习,相信已经对FPGA的设计有了一定程度的了解,现在提出一个相对综合的工程应用来深入了解FPGA的设计思路以及工程思想等。
7 Y) T( V. S. |# m) [" }针对以上预期实验现象可以分析出最少需要DDS模块、TLC5620控制模块、串口接收模块以及控制模块。* b/ f( K, w s( r
DDS原理与实现- N m: C. K# H+ U" M8 R; [
DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有相对带宽大,频率转换时间短、分辨率高和相位连续性好等优点。较容易实现频率、相位以及幅度的数控调制,广泛应用于通信领域。% }8 u7 Z' s" @- o; L( `( a
DDS 的基本结构图如图1所示。. j R0 v% T/ ^% b7 H8 Z( \
3 Q" ?8 l+ Y7 q% s1 B" m
& N) u" V6 W2 K) L' d由图1可以看出,DDS主要由相位累加器、相位调制器、波形数据表以及 D/A 转换器构成。
8 X7 N A; d0 @+ I/ o7 X其中相位累加器由 N位加法器与N位寄存器构成。每来一个时钟,加法器就将频率控制字与累加寄存器输出的相位数据相加,相加的结果又反馈至累加寄存器的数据输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字相加。这样,相位累加器在时钟作用下,不断对频率控制字进行线性相位累加。即在每一个时钟脉冲输入时,相位累加器便把频率控制字累加一次。 ( Q. I5 ^; S, z6 C2 r$ D
相位累加器输出的数据就是合成信号的相位。相位累加器的溢出频率,就是 DDS输出的信号频率。用相位累加器输出的数据,作为波形存储器的相位采样地址,这样就可以把存储在波形存储器里的波形采样值经查表找出,完成相位到幅度的转换。波形存储器的输出送到 D/A 转换器,由 D/A 转换器将数字信号转换成模拟信号输出。
, V0 N% D8 U1 B4 L5 [$ F' b6 q! W! m6 _9 P" O1 q+ [
! |8 G; z" N; x2 g( v5 q# t) D
" Y( l! i* {1 l& P6 x0 Q2 }
这里相位累加器位数为N位(N的取值范围实际应用中一般为24~32),相当于把正弦信号在相位上的精度定义为N位,所以其分辨率为 ![]()
6 m" g* e. r/ a
/ u% t: K* Q% G: a+ w4 I f若DDS的时钟频率为 ![]()
- s O& ]2 \6 v1 `# U) F* x( i,频率控制字 fword为 1,则输出频率为
: _: F* U1 i y0 W![]()
! t; |% M; z2 r9 G9 m,这个频率相当于“基频”。若 fword为 B,则输出频率为
+ N9 O( J) S4 Q* g: @, d& X# K* d![]()
+ `9 u# N7 e1 R" X2 w/ b. @. n/ y+ U5 v, w$ g4 R* X
因此理论上由以上三个参数就可以得出任意的 ![]()
/ f+ q5 X X* j$ Y+ P/ ^6 h输出频率。且可得出频率分辨率由时钟频率和累加器的位数决定。当参考时钟频率越高,累加器位数越高,输出频率分辨率就越高。
( C( V1 e6 e7 w; u( H/ N从上式分析可得,当系统输入时钟频率 ![]()
1 S; K& l t5 a7 f不变时,输出信号频率由频率控制字 M所决定,由上式可得: $ \/ b& S( k! R- G. ^% W5 r
![]()
1 V1 |- C2 K# H。其中B为频率字且只能取整数。为了合理控制ROM的容量此处选取ROM查询的地址时,可以采用截断式,即只取32位累加器的高M位。这里相位寄存器输出的位数一般取10~16位。 0 p0 G+ A3 a! ?/ N, o: G
在本设计中参考时钟 ![]()
7 l% u, x" m( `" l+ @# ^8 X" D, N频率为50 MHz,相位累加器位数N取32位,频率控制字位数M 取12位。
7 c3 @; D7 y) \经过以上的分析,可以得出DDS模块的端口模块图如图3所示。
% f# \' ?( s" ^5 w- n& H
8 k0 u; x8 F; z: p5 n5 B$ Y! w j; }" I3 ^6 j# `
, J6 \& `& Q3 A0 o 5 M( N+ t9 g, d4 I7 O
" ~1 E) d8 z X7 d3 a/ p% u新建DDS_Module.v保存至rtl文件夹下。从图3以及表1就得到了端口列表:
( S# Y3 L0 @5 X4 n3 A4 R 2 B/ S5 M. M7 `
以下只需按照图1进行编写。相位累加器此处即为一个32bit的加法器。9 p0 Q/ v# a" X- [" Z
- Q' S4 u! K* q) g0 z
查找表地址生成,此处即为12bit的加法器。这里直接截取32位累加器结果中的高12位作为ROM的查询地址,这样产生的误差会对频谱纯度有影响,但是对波形的精度的影响是可以忽略的。0 E& j: T( Y9 Y) _$ F# c
! A4 l: M$ M/ | p7 Q
DA数据输出时钟模块使能,通过选择器来进行控制。; `+ a; J7 p# F
" @9 w+ S2 w$ U" }
现在只需要例化存有波形文件的ROM即可。其中单端口的ROM主要配置数据如图4所示,其初始化文件选为已经生成的正弦mif文件。此处mif位宽为10,深度为4096。
3 R4 d: e1 Q2 V1 h8 y* F
p- D! g& W e K( v1 b0 K' d3 Y9 B, a
$ m2 ], z9 v% t
) n. W6 n& e# V$ g( s+ a/ z5 X本模块编译无误后,点击RTL Viewer后可以看到如图5所示的模块逻辑电路图,可与DDS原理图对比。这里有两个选择器的原因是加了使能端的缘故,如果将使能端去掉即可看到如图6所示的电路图# Z' f) r. U% p
: i5 y$ g! G6 ?7 e8 N7 j! x5 g
2 k5 f& _; K. l% S# Z: F
, K* t4 N% h8 T( t1 s
/ u2 Z4 |8 A& F' V4 P7 d/ v, y
设置此文件为顶层进行功能 仿真 。激励文件中除了产生正常的时钟以及模块例化调用,还需使能模块以及设置自加字。此处简化将Fword设置为固定值’d5000,。 . L7 s F; c3 E t. x) N1 e
6 O6 f6 h' d6 {/ K编译无误后设置好仿真脚本并进行仿真,可以看到如图7所示的功能仿真波形文件,可以看出波形数据正常。放大仿真开始位置,可以看出输出DA时钟使能设计也正常。初始值为’d511也就是’h1ff,与初始化mif文件一致。0 v: V. x: o8 t4 U) Y; E
/ _( s8 q- W. M: u+ ]5 {8 S
{4 w' r. w6 f* w* z! F% f2 ~& ^" \6 ?/ z6 K" Y3 }
5 U+ X! a9 j, S这样一个DDS模块即设计完成,这里可以自行修改Pword的值进行观察波形相位是否发生相应变化。
3 J. p6 Z! W3 i数模转换器(DAC)控制模块设计 ' D( c2 m0 }! I
这里采用DAC 芯片 为芯航线AD/DA模块上的TLC5620。其中TLC5620模块的设计与实现在基础课第17讲已经详细阐述,此处不再对本部分进行解释。其模块接口示意图9所示,其接口对应的功能描述如表2所示。
! p8 P) F. C( n0 P' I D: j8 @% y& I5 b/ M2 {
3 z/ s% \( i' c- O; Y8 V# u' J
. c/ m3 L( M& ]( ]- M
( M8 Q r; e3 ]& g! C8 `8 l" U+ W" e多通道数据输出实现 - R3 `2 n9 K8 Y' V* \* ~
本节需实现的是多通道的信号发生器。而此处的ADDA模块最多支持四通道,这里就要轮询控制各个通道并输入相应的控制字。将此模块命名为DAC_4CH,其模块接口示意图如图10所示。
) [* Z% u, R. V l
' B7 z+ X. r0 z( E# [0 H
9 z, K' {) M& d3 N0 r p% w
5 Q0 ?3 X3 I4 j" @8 W3 I8 U1 v3 d, o
: @; P3 E Y- W { ~
% D+ Q3 t, V4 h1 ^* W3 j& Z3 b
; J- h r3 E+ Q+ r: w5 N7 a: {- p) j* L
这里在调用TLC5620时,直接将其转换使能信号UpdateDone信号置1来简化控制。4 U4 N2 Y( Q3 \" O) S
0 G+ D' r4 z9 i- }实现轮询,就是在时钟上升沿到来时,每当一次TLC5620转换完成后,就开始选通下一个通道。
4 G B1 E8 s6 h8 y& p( c : S7 k2 u* B4 V) p' d
在选通对应通道后,DDS产生的数据只需给控制字即可。0 ^9 d$ ]$ S8 b! ?1 m8 f
- B- r; S: g8 u! [7 L
由基础课程可知TLC5620控制字的构成是两位的通道选择字、电压增益选择字以及八位数据位。因此直接采取位拼接方式即可。1 c. \ z' Y$ C& S+ S5 D/ G" h
; i! ?( U' l! m/ Y* v& J) I/ K8 |
串口命令接收与解析
5 }" M4 R [+ k* I+ S这里使用的串口接收模块波特率为9600,具体实现方式在基础课程的第12讲已经阐述,此处不再详细解释。其模块接口示意图如图11所示,接口对应功能描述如表4所示。3 h0 ]: y. m2 L( Z$ n1 M* h
# u( T! t) R! Y$ s2 d. p( j
1 Z6 O, w3 w6 f; u: M+ b
' J* D7 I4 h0 K9 ~0 u, O8 j& K9 H5 X8 t. |
) Z& P) @# ]4 m+ j) [
如有更多问题,欢迎加入芯航线 FPGA 技术支持群交流学习:472607506
; k1 Z9 w' I! k; O# {4 d& z, M* r6 J8 x" c
7 S* I* r' q W& N! r
. e$ \0 ^& A, d& ]- d; X4 L) G; ^- l6 T" i
2 U5 {6 L g* b$ r$ R8 I
4 N c s# ]3 _. k/ P! x% G
6 ]! m! }- T, V# l
- v a, _2 G- F1 K+ N
3 P9 o3 @6 E' ^! f4 w3 K9 n ) }$ w L+ g, e1 y p' B1 z2 u
. A" W! X5 `3 D* I) H, D2 a0 W
, ~! P4 V, g* j' F8 T
. R! z& h0 @$ j2 f& t
, r: W' m E8 D' w9 S5 Q- C3 l6 `
6 g9 ~7 ?9 a: \' h! [1 R" z / o2 [0 r4 o& {" l9 L$ R$ {/ z
8 ~! G8 H! Z' k
) u5 w8 T& X: z8 L
' |- _. ]+ L0 t' Z$ D0 _# k, \
' p6 n7 y- h# q! Z % l" ?9 m: N! Q
8 X/ G$ {; i6 c) K3 C. N % E \! p1 b1 b, o \
' L- S( r6 H& N. B+ R
/ \2 K9 N& {/ k+ s) P; f, Z
+ _; a2 ]9 l/ V4 Q, H5 g
, k' T+ i$ R- Q. k4 U/ e 3 b5 Z0 l( ^! B: z
# E& D7 R' y% b# G' X6 _& H$ w
2 H' i/ c7 `- {- q; |& C. m- p
# k# t! P8 z- c& F+ c8 z3 G
: {# V7 A7 g0 |, V6 M4 I
( r. V& n, l, b/ C
, T( _( _7 e6 v/ b6 D
( t! [& B, d& Q1 T1 k4 H8 b& b( b9 [- x% W% V% @7 t3 m) S# W
" ]3 R' E7 l6 C6 C- N0 \+ Y3 W2 E
" n8 I! `: N5 C
& }0 C1 c/ n' R1 d7 o
7 b- l, x! G {) `7 }. _
" v! \! D" x& t9 |3 S
; T# S. s* [# a& J+ ^
$ o+ j7 C6 V2 `% n' S7 y 2 u( w' p) w0 ^
' }" d4 T, H1 o5 T7 B& \4 t: ~
. y4 B9 D$ f9 ^' A0 z |
|