|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Zedd 于 2019-3-30 15:59 编辑 8 ?& R: Y a; ?0 K C
, l6 R" i6 o, q- v7 `' w! e1 [7 L
1 _/ z8 ^' f4 s1 I7 j1 G+ V C实验目标- j5 X5 M7 `) s+ m( T
实现多通道可调信号发生器
( Z( h( _# T- n! H [+ Q; O实验平台
: [* z0 E: G9 g7 I5 r芯航线FPGA核心板、ADDA模块# z, H3 f2 s1 y4 l: z
2 _/ k \- p7 K W& r
4 K% @0 S/ s' I - x3 N% c; _9 q/ g1 b9 J( z
实验现象& t; y/ J% x! T3 f) C( P3 `! Z
实现基于FPGA的多通道可调信号发生器,其中频率、相位以及幅值均可通过PC端串口发送数据对应调节,并可实现4路信号的同步。4 [8 C8 t- B4 H3 K8 f8 H
实验原理及设计过程
3 Z2 w% j# ` F- ~' ]$ W5 g经过前面小梅哥基础课程的学习,相信已经对FPGA的设计有了一定程度的了解,现在提出一个相对综合的工程应用来深入了解FPGA的设计思路以及工程思想等。" E5 }( f0 ^2 ^1 t/ e$ \
针对以上预期实验现象可以分析出最少需要DDS模块、TLC5620控制模块、串口接收模块以及控制模块。5 ?- }8 U+ b( I. G
DDS原理与实现
$ n# R, T2 n% C( H' t$ v q( EDDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有相对带宽大,频率转换时间短、分辨率高和相位连续性好等优点。较容易实现频率、相位以及幅度的数控调制,广泛应用于通信领域。% L5 C6 C! m: R% c* f
DDS 的基本结构图如图1所示。$ X3 |1 e2 q( z5 @
* D& E; N/ p4 X% z, q0 ]! s, [
由图1可以看出,DDS主要由相位累加器、相位调制器、波形数据表以及 D/A 转换器构成。 ) Q* o4 ]2 a; A- \2 y
其中相位累加器由 N位加法器与N位寄存器构成。每来一个时钟,加法器就将频率控制字与累加寄存器输出的相位数据相加,相加的结果又反馈至累加寄存器的数据输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字相加。这样,相位累加器在时钟作用下,不断对频率控制字进行线性相位累加。即在每一个时钟脉冲输入时,相位累加器便把频率控制字累加一次。 % M% K! y9 D( _6 S/ D
相位累加器输出的数据就是合成信号的相位。相位累加器的溢出频率,就是 DDS输出的信号频率。用相位累加器输出的数据,作为波形存储器的相位采样地址,这样就可以把存储在波形存储器里的波形采样值经查表找出,完成相位到幅度的转换。波形存储器的输出送到 D/A 转换器,由 D/A 转换器将数字信号转换成模拟信号输出。
# _+ V6 z) w$ _7 T/ j1 r2 U4 V* w) k k* d
# X" m, |! E- K% B7 P
: v R1 j" m$ O" z; T r这里相位累加器位数为N位(N的取值范围实际应用中一般为24~32),相当于把正弦信号在相位上的精度定义为N位,所以其分辨率为 ![]() / Y; F7 u0 \3 x1 o, R
6 t: M7 p. Y1 ^0 |* l5 {/ E若DDS的时钟频率为 ![]() # D1 _* k0 R: c' }# r( t
,频率控制字 fword为 1,则输出频率为
& ~, }* K" M+ i) p4 _" B![]() 4 L3 r& o3 m7 j: }7 O' `
,这个频率相当于“基频”。若 fword为 B,则输出频率为 D8 X5 t; k f: D: j1 [9 g0 L
![]() , @# z# H% Z# E% ~4 \
2 n6 Z }- @+ X0 R
因此理论上由以上三个参数就可以得出任意的 ![]()
3 U% f+ V/ e" I$ T" g9 y输出频率。且可得出频率分辨率由时钟频率和累加器的位数决定。当参考时钟频率越高,累加器位数越高,输出频率分辨率就越高。 ! M7 v+ T& ^0 M* I( c9 J: V+ u
从上式分析可得,当系统输入时钟频率 ![]() 4 ^6 k8 n. L5 @( P
不变时,输出信号频率由频率控制字 M所决定,由上式可得: ; [% [1 k5 e }' S! ?: k
![]()
. O" [( l8 c# u, F. K6 x# I。其中B为频率字且只能取整数。为了合理控制ROM的容量此处选取ROM查询的地址时,可以采用截断式,即只取32位累加器的高M位。这里相位寄存器输出的位数一般取10~16位。
7 f3 }$ Z! K; h- D8 G在本设计中参考时钟 ![]() 4 V# ?3 }7 P& P6 |/ ]. c' C
频率为50 MHz,相位累加器位数N取32位,频率控制字位数M 取12位。 ) Q1 y- m7 e& u" }6 I' y% t8 J7 p
经过以上的分析,可以得出DDS模块的端口模块图如图3所示。 ' X& V# b6 c# w3 O
4 a( g! H: y' [: ]
# O. d6 n" H7 i9 Q% J9 {$ K! A) i+ c3 L& C. M
( j4 J& M5 @/ A1 u( ~
$ Y9 F% x) z9 p' }. U新建DDS_Module.v保存至rtl文件夹下。从图3以及表1就得到了端口列表:0 k7 _; f6 f' j' Y6 F; [
6 _0 j, D0 r' y以下只需按照图1进行编写。相位累加器此处即为一个32bit的加法器。% C: ^8 ]5 _% D v& A
, q, e) C6 Q) G. t/ Y
查找表地址生成,此处即为12bit的加法器。这里直接截取32位累加器结果中的高12位作为ROM的查询地址,这样产生的误差会对频谱纯度有影响,但是对波形的精度的影响是可以忽略的。, I- c; s0 v* F+ R
+ t5 L1 h4 g2 }* cDA数据输出时钟模块使能,通过选择器来进行控制。- k, _5 c4 D/ ?3 i1 z& {
o# b2 Q, T% H
现在只需要例化存有波形文件的ROM即可。其中单端口的ROM主要配置数据如图4所示,其初始化文件选为已经生成的正弦mif文件。此处mif位宽为10,深度为4096。
4 L0 n% r' T# o k& T
2 g" V9 e+ u" M' S% w( C. _% d. o, M; z$ o0 o
. U' @* X' r# b* S
) l, ]4 n: B! M8 P6 k: t本模块编译无误后,点击RTL Viewer后可以看到如图5所示的模块逻辑电路图,可与DDS原理图对比。这里有两个选择器的原因是加了使能端的缘故,如果将使能端去掉即可看到如图6所示的电路图8 ~! ?0 ^, b7 Q, i
6 S8 O+ I- i4 { b4 G L
' s3 n7 z6 n7 [1 l# p
' |$ _( }9 [: _ E
& o4 D2 j) A4 }
设置此文件为顶层进行功能 仿真 。激励文件中除了产生正常的时钟以及模块例化调用,还需使能模块以及设置自加字。此处简化将Fword设置为固定值’d5000,。
2 K& |* {* @6 d
Q7 r. R4 w' q. ~# t) E9 n* R编译无误后设置好仿真脚本并进行仿真,可以看到如图7所示的功能仿真波形文件,可以看出波形数据正常。放大仿真开始位置,可以看出输出DA时钟使能设计也正常。初始值为’d511也就是’h1ff,与初始化mif文件一致。7 w3 l- I+ p5 ?4 F) h- A2 _
3 h0 C4 ]$ W" I! o' d v @" U) j
6 J t2 v0 j- V$ G X8 V z9 {. O. k7 r! Q% `# x( `3 G
这样一个DDS模块即设计完成,这里可以自行修改Pword的值进行观察波形相位是否发生相应变化。
; X& H" b6 g+ i3 J8 @6 ]数模转换器(DAC)控制模块设计 . ?) z" @8 E o0 D
这里采用DAC 芯片 为芯航线AD/DA模块上的TLC5620。其中TLC5620模块的设计与实现在基础课第17讲已经详细阐述,此处不再对本部分进行解释。其模块接口示意图9所示,其接口对应的功能描述如表2所示。 7 J( N6 J" _& g/ V. g7 t% a2 Q9 f; U
, x5 c" F: O* E3 E
4 i- g' L0 K( C; Q% q5 X( h0 i
+ @8 r8 l2 O6 C9 c @8 o+ f; z. `; n. j
' O3 Q# ]; N) H! s多通道数据输出实现
1 S4 v" {) g6 o本节需实现的是多通道的信号发生器。而此处的ADDA模块最多支持四通道,这里就要轮询控制各个通道并输入相应的控制字。将此模块命名为DAC_4CH,其模块接口示意图如图10所示。 # \" X/ l7 l) H9 O* ]
! _) V( X* H" B$ S
3 y+ r8 ~$ v, ~# Q
) M0 Z" ^+ i% J) C* H1 H4 r: n" D* R- h* r" h- d: P1 Q3 p( C- S
# p3 j u# _6 g! m5 W" g3 G: b) o I) h K" Z- V# E
3 G; T9 _: b+ ^( |
这里在调用TLC5620时,直接将其转换使能信号UpdateDone信号置1来简化控制。3 p( z7 t e- Z( l. @! m
T* F2 \2 ]* \
实现轮询,就是在时钟上升沿到来时,每当一次TLC5620转换完成后,就开始选通下一个通道。7 r; M" Q5 Z9 T9 v6 R
! U- t& Z' N# _. k
在选通对应通道后,DDS产生的数据只需给控制字即可。
( j4 }8 e( b2 F8 X! ?
0 j+ {1 n( F& D5 e: ?! c* b由基础课程可知TLC5620控制字的构成是两位的通道选择字、电压增益选择字以及八位数据位。因此直接采取位拼接方式即可。
4 D; p, ]* Q! K- h, l ; C; M2 T! z7 K& i3 U% m
串口命令接收与解析
) [* G1 S. k+ L% N, |这里使用的串口接收模块波特率为9600,具体实现方式在基础课程的第12讲已经阐述,此处不再详细解释。其模块接口示意图如图11所示,接口对应功能描述如表4所示。
- J0 Y4 K) z( n8 n2 o# L4 b% r9 b G
/ P; n' R. e S7 W4 n8 ~) H, U8 @: E5 A% e, F" Q* a: j( S- ]7 q
5 q4 ^: Q5 W( K+ S- W* X; Y
F, I9 m- M6 t- ~3 |8 O! K0 s6 D4 f- S4 e, p1 N
如有更多问题,欢迎加入芯航线 FPGA 技术支持群交流学习:472607506 * R, Y4 u6 _4 V ^1 d
" R( B: m( i% c ' X1 r# G5 P. _6 X+ H
. L$ l8 p3 Y& H: z
+ G* O3 A4 a6 i6 y4 A- ^6 W1 W
3 e+ _8 {0 g+ H7 f+ ^5 \. h
, a3 |0 A9 x1 L: S! B$ v0 D. n( N, I# @! y% O% W
2 `" W! q. E; e$ C; i
+ b a8 ^5 T% h' a6 C: q+ i
; }9 ~1 z( J" S0 F; A V4 n" n: [
" E8 Q+ y. F0 t" P( _+ l 2 S& @2 i3 d- E$ }7 ]: V
) J' Y7 I1 J) ]- q& i; g
$ a% h$ A+ n6 e3 }$ z3 q: a
: V! g! w* |0 k/ b: p( O
$ L- s' Q9 s" H6 N& j/ J: L
# L+ D+ f: J- u6 \$ ?" H
2 w. \- B6 N8 M# W' l 1 B. u4 V5 d( G
& r2 _" y. |- h
. L" | \7 Q, P
i4 x/ g; E) B* j: B# `/ j
7 n- y! C2 u! p
3 S1 H, O) I/ W6 Z( E" [$ c8 Z
+ n# F7 r9 M/ B) q5 N+ ] E' _1 g {8 B
, v; o, m9 Q8 E# M' H4 ? / \4 ?6 B' j0 S7 b4 ~& [; q
' W* w9 r; A0 K5 m
1 o: q$ q7 l2 `
3 N+ r) [8 V5 i z: p8 j5 T6 B4 i
, k9 X% n* q" p6 S# g " ^# b) m* L8 T) R& R
" \6 _2 O3 t- Z! I - e3 t! M' v1 d6 m# c
6 Z6 Y" B+ g7 N5 u) ?/ O N) [2 y w1 u8 A7 {8 k4 M( Z* U
" n1 I1 V V; W
. A) B) b9 b; Y5 w2 r. I& S! b% {7 ~/ T6 s( K- h/ q
; C7 P3 {/ A) ^) B, `
1 r6 w* }, e7 t9 A f3 t+ j9 F7 O" V- m* F
" j3 F4 ~, h- _+ {' P3 H7 p7 F- C 6 o! E0 g! a7 k! q4 c( l( i
1 M2 X+ P: r; l2 o3 L
( O! y, `0 T7 k% K+ v$ X+ t |
|