EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
大侠好,欢迎来到FPGA技术江湖。本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。
! T. A W! n, K& ~7 K/ c
系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。本次带来Vivado系列,TLC5620驱动教程。话不多说,上货。
# H& b# n7 Q% _! y E: k0 m/ q+ j8 \1 E# g2 j2 s/ K1 }/ V
TLC5620驱动教程 $ u% p8 i7 C9 ~& Q( `5 A# T
在FPGA处理完数字信号之后,我们有些情况下是需要将数字信号转变为模拟信号再输出的。比如音频信号在滤波后,需要转换为声音信号进行输出。此次,我们要讲数字信号转换为电压信号进行输出,以便我们后续可以用示波器之类的器械观察信号。
2 g; W# i+ P: V n; p. q
我们采用的芯片为TLC5620,是一款8bit四通道的数模转换器。 9 x- u3 X* u' B$ h' h* b
在四路通道中,我们可以设置4种不同的参考电压进行转换使用。但是在此次实验中,我们采用的四路参考电压一样,如下图:
2 K9 y/ v+ ^# F5 m, h
! C% t/ f4 s4 s8 [6 w/ f
% `& e* T- ?1 ?7 ]* c# h) E
" d4 H3 f8 W3 J/ ?接下来我们介绍一下此芯片的一些特征以及手册对芯片的描述。下图为官方手册对芯片的一段描述:
/ o& j6 T, p/ |- o
+ H) Z0 M; n0 I
$ h/ |2 ?- E% T# h. V* K3 J2 `" P$ L
: ?& O+ l, F8 U
, J' p! X$ K8 e! m! B |, @' c( W. O" f- } b6 o
7 [' T% u1 C W; C/ {% W3 S1 ~0 o \! Z% a! A, w
; l4 O# ]' u. f8 H1 V& ETLC5620是一款使用3线串行总线控制的芯片。11bit的命令中包含8bit数据、2bit通道选择、1bit输出范围选择bit。输出范围选择,可以输出一倍或者两倍的参考电压差值范围。当两级锁存器都打开时,新的数据可以进入到芯片。下图为芯片的框图: 6 E; R8 Y3 y+ w2 E6 e
9 ?3 x; [6 W ^0 U3 R! t7 e
. D5 H0 h1 K& z3 f
; U- s, S- a7 p0 M4 f& z6 g, y7 s% ?0 p& {! l9 F: c, H ^ l# j) e
) ~3 i+ V+ S0 A$ @( j
% o/ [5 T3 s8 j) O2 A; I
端口介绍:
& l. k ?1 g* I' x1 r" o s
0 M# F! A, f6 w3 ?
* B; [/ _: O2 ^3 h, [
6 k1 z2 P' c, Z+ V6 j D: K
# x. T5 N; t. |0 x( T% D8 E! s5 t
6 ^ `" v8 r# H. ]% t+ Z. L p1 ?4 `2 g/ _5 Z
6 G+ z( C6 Q2 W* z6 f0 C0 c+ ~% @& @+ Q/ c9 m
0 W" a/ `" n' u) M我们的数据为8bit,那也就是将电压范围划分为256份,我们的数字信号会对应成电压进行输出,所以我们的输出电压的计算公式为:
+ U. |9 k5 k: X) J: V& V: w- T5 r+ S. ^: S9 b, K6 S! z; e
: |' B9 X" ^( P0 m: J5 v& t/ N# C: i* L
' q' }( d" [/ b接下来我们看一下时序图:
! A; V) U+ W# }# [$ { S. m7 w% m/ X; |
, Z4 e q5 s, h* M5 g0 {( p
$ Q4 H+ r% W2 V/ C* o: z5 L S当LOAD为高电平时,数据被锁存进DATA在每一个时钟下降沿,一旦数据所有的bit被采集到,LOAD被拉低,将寄存器中的数据传输到被选择的DAC中。如图一所示,当LDAC为低电平时,LOAD信号拉低,被选择的DAC芯片输出电压会更新。如果LDAC为高电平,电压更新将会被禁止,直到我们将LDAC拉低,如图二:
6 d; ]* H9 B0 q3 S9 s: d4 {. S6 B
, q( p! q; e8 E$ E, g
& n6 B* [, }+ G% X" f- E+ p7 ~
" S! c( x. X& j$ j4 X t9 v对于我们的通道选择,如下图: - H) n% a+ A& V' F. _
, r6 f i T- U* P) `
! K, u7 x# m( p8 g' g6 {3 x; Q, v5 m3 ^5 F
当RNG=0时,输出电压为一倍范围,当RNG=1时,输出电压为两倍范围。 1 n- a! `4 J- [& n
接下来,我们来做一下芯片的驱动,同样可以使用线性序列机。转换总周期为11us的时间。
0 E. P8 Z6 h2 ]2 v9 b. @首先我们先新建工程。
: Z# Z6 R1 q2 t2 ?/ d$ R
6 `; R! W7 e0 o
8 z" D# X" z* l2 |: ~
( `0 u: c% g$ K0 o7 a# C; Q2 a! J
7 w! D6 S3 Y# g7 e" d! p" P新建代码文件,写入代码:
7 h/ H3 D: Q2 k6 z- m) N) _# A- `( |
& n: P) T7 N) d! m, i
" ^0 g( v9 F+ F6 ]8 N
( J2 X, ?8 F4 O( f$ C8 \
+ Z$ F) H& @7 x
1 W h2 Q1 h! M. U
+ n4 V$ ?4 y2 s# t+ l驱动代码如下: 3 T- Y( x0 s$ E9 W8 E, _& E
% q6 B% s3 P- e* `- L' E
0 A& V5 H' R& s( r
+ F F+ l1 n6 b$ o2 [; P2 {
$ Y+ r5 S2 b3 D' g H. ]. Y4 x在写驱动代码时,我们需要注意时序图中的一些时间要求,比如,数字信号的建立时间和保持时间,以及load信号的建立时间与保持时间。时间要求如下图: & J! h; Y5 }( C: T1 _
8 g! o5 x: w. d& }- i( N/ D: z
9 [! K8 c! r8 w( L- g
) y4 i& E$ Y7 D
6 X" b0 L+ x6 A& u
由上图可以得出结论,芯片的驱动时钟最大为1MHz。数据的建立时间与保持时间最小值都为50ns。如果我们在时钟上升沿发送数据,那么我们发送的数据,建立时间与保持时间最小值为500ns。满足条件。 5 ^' `" {( Q" J* X
接下来我们写一下仿真看一下波形。 ! F, N9 X, F0 d' K0 p
: y# ~5 |. ?: L0 V
3 S2 f* m1 v1 x8 l' A P
& [( ~0 q5 i8 B- }( v$ C$ C& q% X; `' x4 h0 `( ?1 i0 i
代码如下:
% a4 [! ?& S O" _7 V/ |" J3 }, f
. j: V3 [! d5 o( I2 ]
: f$ i7 v) \& Y* r( B @) y. |. x# P2 g7 f3 T
运行波形,观察仿真波形:
2 i* x" y. G' p+ d# v$ k8 U4 w1 ~7 {, t3 j) G, Q% ^* _8 b
' C. c$ ~+ W7 y& j5 }/ i
* v3 s+ x( @9 x0 i
0 g `! P9 Z7 o' z观察da_clk、da_data、da_load、da_ldac波形全部正常,即说明驱动正确。
2 y, ^3 M2 o# h# r |