FPGA零基础学习之Vivado-数码管驱动设计实验7 ^: {2 h5 `6 M; ^: B6 |
/ x7 G" z$ r& D8 `2 v( V# {( S" n2 o r
数码管作为SANXIN-B04的显示装置,具有易控制,显示方便的特点。那么接下来我们来学习一下数码管的驱动原理。
* M! Z4 f: F6 R% ~$ t% ~
首先,数码管根据驱动电路划分,分为共阳极数码管和共阴极数码管。这个不同直接影响到了我们在驱动数码管时需要给的电平信号。在SANXIN-B04开发板上的数码管使用的是共阳极数码管,那么也就是说我们的数码管是低电平有效。
8 t& F4 o( P. O6 d. p8 {+ r
数码管硬件部分:
7 d" K- |, B+ {3 u
9 a R4 b q) f3 v& ]. ^1 F
% q3 @ r; \" M, k3 i
2 k8 O7 p* w* e' o
数码管总共14个管脚,分别是8个段选和6个位选。6个数码管分别用6根线单独控制,一个数码管,数字部分是7段,加上小数点总共八段。又因为6个数码管的段选信号线是共用的,所以,总共加起来14个管脚。
% ~# P+ o# W( c0 M; R. I: r- p
* v0 w/ `- |6 c9 X5 P
我们按照每一段的顺序做一个编号,有利于接下来的讲解以及说明,编号如下:
+ I( ?5 A; x( ^* | P
( j6 s O& v0 D+ W. }, Q. [0 e
3 B S9 n F; q; r3 ~! |: s y5 F& y: V) r4 p/ P
?" T/ _! t9 I. K9 e, W7 Q" m( ^0 g' E
这8段单独控制,我们可以看做是每一段是一个led灯,那么我们如果想显示特定的数字,只需要让特定的某些段亮起来就可以,又因为我们是共阳极数码管,所以每一段在给低电平时可以被点亮。按照我们手册的管脚顺序,我们给数据时,一般按照DP-G-F-E-D-C-B-A的顺序给值,小数点为8bit数据的最高位。比如:我们想要显示数字1,那么只需要让B和C两段点亮即可。那么我们给的数据就应该是8’b1111_1001。按照这个规律,我们可以轻松得到0~9的所有段选数据。
$ G& z* Q% r/ i7 U+ |% G9 B9 I# g
( m! P* U1 ?3 i! ^! ^; o
3 i* B n$ i) W8 F n9 Z3 b
1 ^0 |: @! r- X/ R. g7 V
" b& ~; O4 K" M! W: T$ L. X8 h! ~
- h8 x/ @: \* {: P
此外,数码管作为我们的显示装置,一般显示的内容为动态的,所以,我们在驱动数码管显示的时候6个数码管要依次轮流选中,因为我们的段选信号是共用的,在同一时刻不能给不同的段选信号值。但是这并不意味着我们的数码管显示只能一个一个的看到现象,我们只要刷新切换的速度够快,人眼看起来就是一起亮的,所以我们接下来要做的工作就是:1、位选依次选中。 2、每一位的数码管进行段选赋值。代码如下:
. W/ {: z4 G' s3 W
& n* w8 M1 e- Y2 J# w* i$ J% w" M
- m; c3 \* S, ~/ i* }) b- r
& p2 j+ C' N8 g w1 j& [
; t! T1 H4 `7 x% j7 _7 d# E* C5 p- B: i1 K5 B2 d6 y: q
在此,我们需要声明一点,因为数码管位选切换过快,会导致数码管显示异常,所以我们在做位选切换的时候,我们会加上一段时间的延时,以确保显示正常。
; Q; b3 n) u& j; p% U4 V, X那么接下来,我们做一下仿真测试。
$ ]. n4 t- I4 K, T% G, a, R- Y
' |( E8 n; O! d+ u
$ U: d9 ~) }7 Z: T4 Q6 l* o9 N, n0 L, J6 T- M* g$ R$ l! A
; a1 I) _6 }# G b: C
' j2 U2 e# \' U$ N
按照上图步骤,添加仿真文件。
) f( U! M. X; A" B
, a' _8 E& t B' q8 E1 a5 ^0 \) t
% ?8 I3 W6 b# u/ p0 O8 R
) {/ H5 B( V/ M- H
0 t% ?* r& O$ ?7 `7 w5 [" \: x: i0 R4 [) u0 P& ^( X& f; z
1 z% J" f8 e8 n% s
{9 C) u( {/ R/ o" B- l
' \+ b2 j, E4 h9 W2 L
$ s+ i2 D+ I! B$ _5 m
6 z' l' k: U; J6 e点击OK新建文件,代码如下:
; J; Y6 `2 `. e# c5 k
- C4 E0 O7 u! _! F
, G$ }" b' A- V. w1 k0 h
( O& E* N" J3 G) t2 a
4 o! T8 }- R0 h# K& D# q7 j% S
. v( c% S$ O2 x6 V* E6 a
6 t1 c7 z5 c9 t+ n
9 h( V4 C1 i7 W
. ?- D" e' B7 J6 ^* {: ]在仿真时,我们随机给了两个值,看一下波形。说明:在功能文件中,我们的输入数据为24位的BCD码,在仿真时,我们直接给了16进制数,因为BCD码和16进制数的前十个数是一样的。
+ ?6 U. o3 z; j
点击Run Simulation,运行仿真。
% L2 u8 I% v7 T
" u4 B1 h' V( H! u5 G* w# T
0 s$ s7 @+ O8 A在波形当中,位选信号对应的段选信号,与我们给的数值一致,证明数码管驱动正确。
9 M3 Q% a9 l( a
|0 l% h3 n. u7 Y: }# }" f在此需要提醒一点,如果数码管的输入不是BCD码,那么我们还需要做一下转码,最简单的方法就是做除法,或者用基本运算电路来实现转码都可。