FPGA零基础学习之Vivado-数码管驱动设计实验
1 I! M' j7 _/ U) @5 _* H6 P3 }) c6 z9 v9 ]4 w5 v( Y& }3 r, w
数码管作为SANXIN-B04的显示装置,具有易控制,显示方便的特点。那么接下来我们来学习一下数码管的驱动原理。
5 J. [" q9 d8 X/ d' I _
首先,数码管根据驱动电路划分,分为共阳极数码管和共阴极数码管。这个不同直接影响到了我们在驱动数码管时需要给的电平信号。在SANXIN-B04开发板上的数码管使用的是共阳极数码管,那么也就是说我们的数码管是低电平有效。
! b; g; h( Y M7 D' U
数码管硬件部分:
3 k; @* _2 d5 X3 W: B9 N- t
) G5 @, l8 ]4 E$ q( s1 h# @
4 e/ [9 w9 i+ F4 ]1 j3 G
1 B, J$ z" n. Y
数码管总共14个管脚,分别是8个段选和6个位选。6个数码管分别用6根线单独控制,一个数码管,数字部分是7段,加上小数点总共八段。又因为6个数码管的段选信号线是共用的,所以,总共加起来14个管脚。
6 `8 `' }2 l! k, ?( u
( i% y% O# h8 L) m1 |8 @7 z我们按照每一段的顺序做一个编号,有利于接下来的讲解以及说明,编号如下:
. \* W# c6 B3 a
2 x6 Y9 J- e! A* e% Q* Y ?
! Z- O( I' m) f: k; y9 I+ O% B
' k( B8 x$ z$ O& K [
& u, ^0 D6 N4 B' E; k1 i6 z
这8段单独控制,我们可以看做是每一段是一个led灯,那么我们如果想显示特定的数字,只需要让特定的某些段亮起来就可以,又因为我们是共阳极数码管,所以每一段在给低电平时可以被点亮。按照我们手册的管脚顺序,我们给数据时,一般按照DP-G-F-E-D-C-B-A的顺序给值,小数点为8bit数据的最高位。比如:我们想要显示数字1,那么只需要让B和C两段点亮即可。那么我们给的数据就应该是8’b1111_1001。按照这个规律,我们可以轻松得到0~9的所有段选数据。
* ^; ~# _8 A$ \$ a8 \
3 d3 ~- k } L5 I/ o9 V9 s- k* j
3 |% X8 J- Z1 a0 t; J! k
4 n) r; ], ~2 U
& k1 F- z/ {$ l1 @# m# j: G1 Y
9 Q! X! T9 `3 g2 k6 v0 R' k
此外,数码管作为我们的显示装置,一般显示的内容为动态的,所以,我们在驱动数码管显示的时候6个数码管要依次轮流选中,因为我们的段选信号是共用的,在同一时刻不能给不同的段选信号值。但是这并不意味着我们的数码管显示只能一个一个的看到现象,我们只要刷新切换的速度够快,人眼看起来就是一起亮的,所以我们接下来要做的工作就是:1、位选依次选中。 2、每一位的数码管进行段选赋值。代码如下:
- R, h9 w$ g( T
, m* G4 D9 |! S! ^4 `: N
1 v( C2 D6 z" b3 y/ @, C' i: D
; C% X& W7 x& |- w8 k, L! Y- g! R3 g
9 H5 ]. E. K6 S! u9 |9 D
! E& z& e/ e; J
在此,我们需要声明一点,因为数码管位选切换过快,会导致数码管显示异常,所以我们在做位选切换的时候,我们会加上一段时间的延时,以确保显示正常。
, D" P% c$ j: C/ J/ V: C5 e0 O+ L9 M
那么接下来,我们做一下仿真测试。
1 o# p/ O6 m$ W" i+ i. [
' k( \: A9 L/ V! s2 p2 \
4 ^0 V' e( k3 |0 `7 R: ^ Y+ q8 S+ w; k3 T6 H8 S, |0 @
$ W$ T, R5 y0 s) M3 R& l9 y
% k$ v/ ~+ R' g0 U$ c
按照上图步骤,添加仿真文件。
1 ]! J; N2 a/ I9 L2 ^) k
6 [5 O \- k4 x n& z( I+ h+ s
# w9 W+ [ S& c5 D) @$ f7 f/ F, }* h2 P9 t1 K9 K2 `5 K* B
! L" V( K$ M$ f
& T7 U5 i9 V8 F: g
' [& d2 j2 u, h
8 \/ w7 r- i5 a5 c
: u& u* G# E' G% b" s. ?6 B4 |
3 {% k( V, t% C1 ]' T7 D& ]4 i点击OK新建文件,代码如下:
- S. r y; ~) c0 e1 V# B) }# g, c
8 W8 l& M/ `" [
8 [1 Y+ m8 ^; r3 b% v1 k" Z) Q+ p( h" G; w, k( s
: ~1 w" w8 A& n w3 \5 L5 e
- y# h% U1 ^1 r9 }! r
2 e1 a& j7 h g9 N
# q. W+ l# Y8 Y0 F- p( B7 V5 \) T( Q2 i$ H
在仿真时,我们随机给了两个值,看一下波形。说明:在功能文件中,我们的输入数据为24位的BCD码,在仿真时,我们直接给了16进制数,因为BCD码和16进制数的前十个数是一样的。
- ?: Q" q9 Y3 b6 l7 S% O3 [点击Run Simulation,运行仿真。
# Y. T9 B) ?6 i$ i2 d7 h
* w% E7 Z: b1 S/ s8 J9 a
L: j) b( |) Q# F0 J. f( y在波形当中,位选信号对应的段选信号,与我们给的数值一致,证明数码管驱动正确。
4 A; r$ a" j+ ?- j7 h0 t( G4 `3 ^6 k( E0 i
在此需要提醒一点,如果数码管的输入不是BCD码,那么我们还需要做一下转码,最简单的方法就是做除法,或者用基本运算电路来实现转码都可。