FPGA零基础学习之Vivado-数码管驱动设计实验
" s* j, y" \7 U8 c
/ f) j: b* o" V% ^8 x$ Y# O3 I* e数码管作为SANXIN-B04的显示装置,具有易控制,显示方便的特点。那么接下来我们来学习一下数码管的驱动原理。
; z9 w" Z0 Q `/ K) i1 Z
首先,数码管根据驱动电路划分,分为共阳极数码管和共阴极数码管。这个不同直接影响到了我们在驱动数码管时需要给的电平信号。在SANXIN-B04开发板上的数码管使用的是共阳极数码管,那么也就是说我们的数码管是低电平有效。
& q( X3 T+ V0 }1 K) v" s- O5 \1 V! C* Q
数码管硬件部分:
7 b* m" m" C: K0 L
7 _1 {! J: k) G% U' p/ t
, g% @9 k2 a5 |$ ~2 A j+ H6 R
/ r2 j2 e2 J8 R; R
数码管总共14个管脚,分别是8个段选和6个位选。6个数码管分别用6根线单独控制,一个数码管,数字部分是7段,加上小数点总共八段。又因为6个数码管的段选信号线是共用的,所以,总共加起来14个管脚。
- H) o9 c+ e' x8 `4 B* O
' K/ Z$ X- h: V# d$ S
我们按照每一段的顺序做一个编号,有利于接下来的讲解以及说明,编号如下:
0 j" G# D2 s9 ~. Y
& @+ i q% U6 L7 X. }; F
" r! Y0 N4 w& m% k9 ]* B% ?3 I1 L
8 M; K9 b4 ~4 N/ h, T9 h p& g
7 j# S( b2 z3 } U( [* Z4 R
这8段单独控制,我们可以看做是每一段是一个led灯,那么我们如果想显示特定的数字,只需要让特定的某些段亮起来就可以,又因为我们是共阳极数码管,所以每一段在给低电平时可以被点亮。按照我们手册的管脚顺序,我们给数据时,一般按照DP-G-F-E-D-C-B-A的顺序给值,小数点为8bit数据的最高位。比如:我们想要显示数字1,那么只需要让B和C两段点亮即可。那么我们给的数据就应该是8’b1111_1001。按照这个规律,我们可以轻松得到0~9的所有段选数据。
, Q. }: T, }" x$ Q0 l- j% Q8 Z( f. ~$ q' a1 [3 z9 y
" U% ? Z' i6 _8 s9 ?2 K
0 C* O& e' h" d' F
4 y5 \/ Y& C, L O. o
X, E* g9 A6 A5 Q
此外,数码管作为我们的显示装置,一般显示的内容为动态的,所以,我们在驱动数码管显示的时候6个数码管要依次轮流选中,因为我们的段选信号是共用的,在同一时刻不能给不同的段选信号值。但是这并不意味着我们的数码管显示只能一个一个的看到现象,我们只要刷新切换的速度够快,人眼看起来就是一起亮的,所以我们接下来要做的工作就是:1、位选依次选中。 2、每一位的数码管进行段选赋值。代码如下:
9 i" B5 O$ `# L8 Z7 b, c, E9 O7 j1 n
7 E& @: W3 C- M8 I" Z/ |2 A
+ I! J6 s3 ?$ F" N+ y. s( [
; g# @) ?8 Y3 O1 f
. V2 S- @0 `5 D( o% P% O
" }( B# f0 {7 L% L) S
在此,我们需要声明一点,因为数码管位选切换过快,会导致数码管显示异常,所以我们在做位选切换的时候,我们会加上一段时间的延时,以确保显示正常。
6 K) |& d% i% K, G( o' W0 x7 H- q& \
那么接下来,我们做一下仿真测试。
( o6 I' m: M8 X1 R
; k- ~( w( [: D& n+ @# q
! s" S2 ?+ }- M, s+ ^
7 h2 q+ K: n9 Q
6 D& \( l1 T7 F2 j+ p2 s. M. V
$ f7 s# m9 T- I7 N! S按照上图步骤,添加仿真文件。
, @& B" U1 y& \& m( b
% y! o( ?) q$ p4 L: w, Q: j& c7 w0 F3 h6 P1 a. g
3 m7 D" P8 j! R" _5 X7 {- S5 M( B! T: D
$ u+ l0 e: Y0 O0 s- G" A1 P0 f7 L4 T X: {9 y" o
# y; M4 E& z+ g9 k( r) Z
9 }6 F" A# j$ f$ d
; M+ m$ C2 I1 f* y
& d5 a& ?& U$ a- [8 i点击OK新建文件,代码如下:
- x4 W. K+ h- K* x6 X
6 _% s9 [7 o/ z8 U- s5 N. k( |# C( _* ]) r/ o$ V
s9 U- P: g3 n& C
# W2 g' p" [2 i: Y) n7 p. f
q) U* S2 P/ u; }+ N
$ m+ J9 r2 J- l: U: T+ T; W* L( r
" p4 w; z l5 `
$ l/ ?. F2 ^: R% }- M! m
在仿真时,我们随机给了两个值,看一下波形。说明:在功能文件中,我们的输入数据为24位的BCD码,在仿真时,我们直接给了16进制数,因为BCD码和16进制数的前十个数是一样的。
2 R* @; o J2 Q; s" D& D& s- {# v点击Run Simulation,运行仿真。
% d( C: z" d. _' S
% F; u; a& m( i* }( G" C4 I* m; f! T7 B" M2 |7 R
在波形当中,位选信号对应的段选信号,与我们给的数值一致,证明数码管驱动正确。
4 o- U* Z, S: k6 C4 D9 @4 P7 d$ s( {
在此需要提醒一点,如果数码管的输入不是BCD码,那么我们还需要做一下转码,最简单的方法就是做除法,或者用基本运算电路来实现转码都可。