FPGA零基础学习之Vivado-数码管驱动设计实验" v# c- @1 S T, w V
% W: F$ Y0 v2 N$ x
数码管作为SANXIN-B04的显示装置,具有易控制,显示方便的特点。那么接下来我们来学习一下数码管的驱动原理。
7 U2 a; u, b7 l5 j3 S2 O$ G
首先,数码管根据驱动电路划分,分为共阳极数码管和共阴极数码管。这个不同直接影响到了我们在驱动数码管时需要给的电平信号。在SANXIN-B04开发板上的数码管使用的是共阳极数码管,那么也就是说我们的数码管是低电平有效。
: V) r* |/ e1 c, G+ \" T
数码管硬件部分:
7 B% w0 ?" M& ]! t0 Q1 }1 F
# d7 Q# H$ m( t3 h5 P; u
5 V3 m! G% m/ x, U7 y! c% ?
1 \# D4 ?9 T) R/ P
数码管总共14个管脚,分别是8个段选和6个位选。6个数码管分别用6根线单独控制,一个数码管,数字部分是7段,加上小数点总共八段。又因为6个数码管的段选信号线是共用的,所以,总共加起来14个管脚。
$ x- d& \0 v5 c
- k) n+ R: k* g8 l
我们按照每一段的顺序做一个编号,有利于接下来的讲解以及说明,编号如下:
' ~5 F# ~ \2 x0 V
) F) `2 k% C' ] A
9 a1 s1 O }0 U: E* A) ?9 b' w* r
( U$ s# D8 P g/ h0 t; M
( V1 w3 D5 g# v/ R# Y" O
这8段单独控制,我们可以看做是每一段是一个led灯,那么我们如果想显示特定的数字,只需要让特定的某些段亮起来就可以,又因为我们是共阳极数码管,所以每一段在给低电平时可以被点亮。按照我们手册的管脚顺序,我们给数据时,一般按照DP-G-F-E-D-C-B-A的顺序给值,小数点为8bit数据的最高位。比如:我们想要显示数字1,那么只需要让B和C两段点亮即可。那么我们给的数据就应该是8’b1111_1001。按照这个规律,我们可以轻松得到0~9的所有段选数据。
7 H. P; S# B# H) ?1 x% a( V
/ ?. k, n, V: o3 P ~/ w- s( n
& [' |7 r: t8 h! b. r
+ H# E3 Y# y; A1 q" |4 E: l; Y' H
% O2 R3 U/ Q6 I( _( g2 N6 p, s
此外,数码管作为我们的显示装置,一般显示的内容为动态的,所以,我们在驱动数码管显示的时候6个数码管要依次轮流选中,因为我们的段选信号是共用的,在同一时刻不能给不同的段选信号值。但是这并不意味着我们的数码管显示只能一个一个的看到现象,我们只要刷新切换的速度够快,人眼看起来就是一起亮的,所以我们接下来要做的工作就是:1、位选依次选中。 2、每一位的数码管进行段选赋值。代码如下:
+ U; N3 c2 U, h" c/ V/ a( ]
n$ C' |/ e# F, q2 y+ b1 W7 e
6 B+ p0 [! X& }1 f
, j0 N) e9 J" F! m4 I5 n
- J& f/ h0 | ~% O* I- }1 B, {2 b- M. g! |7 b- k
在此,我们需要声明一点,因为数码管位选切换过快,会导致数码管显示异常,所以我们在做位选切换的时候,我们会加上一段时间的延时,以确保显示正常。
3 t3 F9 C: A$ s% @0 [
那么接下来,我们做一下仿真测试。
; m& S1 h. r1 i. z# A, u6 h
# f6 D5 W! d4 H Z( D- F* b
7 b( f# `8 _8 k @% _4 v# t( O" D
% e$ Q) O$ j7 z3 h3 T& t
. c; j& G: O2 J" o3 R; p
按照上图步骤,添加仿真文件。
4 |4 i2 Q b: P9 T' ], K+ D" G V
( b, l9 I G3 j5 H# J& h: A
' w4 V) u' w. f( Z+ p1 w9 f
# ^* M. a! a9 M1 s* b ]+ F7 e6 z& x+ I
& I6 {+ Q& S8 Q: g; u/ k
2 [) e0 u* O% C# q
! C2 x, K% K% J7 n: I, B
0 i8 H! n) Z4 D0 K
, }7 e/ Z! o9 V8 B7 m* k
6 ^7 f; A0 b# O点击OK新建文件,代码如下:
1 k+ C, G' m, G: G
( _9 B! N4 X. a- c* z; @
2 t6 P+ p9 b- w" }" y' G3 F8 ]# H0 H. N1 |* q C1 y# h( X2 ^
' Y( u, d+ I/ `
5 Y+ A3 @, U2 |$ X5 X! M
. z$ A. x% L0 R" A- A
* X( u- t& A+ Y
1 n- P+ |3 p* p/ e6 M) x在仿真时,我们随机给了两个值,看一下波形。说明:在功能文件中,我们的输入数据为24位的BCD码,在仿真时,我们直接给了16进制数,因为BCD码和16进制数的前十个数是一样的。
( ?7 Q# D8 r% L# Q. R1 _! R点击Run Simulation,运行仿真。
# c! n5 L; @! \
: P' J7 W& U! S$ S+ K
. f$ v: z7 y( L g# E" [ m
在波形当中,位选信号对应的段选信号,与我们给的数值一致,证明数码管驱动正确。
8 m2 V" X% s( w
$ V! h& ?: t. d# ^在此需要提醒一点,如果数码管的输入不是BCD码,那么我们还需要做一下转码,最简单的方法就是做除法,或者用基本运算电路来实现转码都可。