FPGA至简设计实例
前言
一、项目背景
led 数码管(LED Segment Displays)是由多个发光二极管封装在一起的器件,这些二极管组 成“8”字型,在内部完成引线连接,只引出它们的各个笔划和公共电极。一般来说,led数码管常用 段数为7段,如下图中所示的a、b、c、d、e、f、g,有的数码管还会添加一个小数点,如图中的h 所示。
数码管可以通过驱动电路来驱动内部的各个段码,从而显示出需要的数字。发光二极管单元按照连接方式可分为共阳极数码管和共阴极数码管。其中,将所有发光二极管的阳极连接到一起形成公共阳极(COM)的数码管为共阳极数码管。在应用时应将共阳极数码管的公共极COM接到+5V,当某一 字段发光二极管的阴极为低电平时,该字段点亮,当某一字段的阴极为高电平时,该字段不亮。例如, 当共阳极数码管的abcdefg值分别是1001111时,即b、c字段亮,其他字段不亮时,数码管显示数 字“1”。反之,将所有发光二极管的阴极连接到一起形成公共阴极(COM)的数码管为共阴极数码管。 在应用时应将共阴极数码管的公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电 平时,该字段点亮,当某一字段的阳极为低电平时,该字段不亮。
根据共阳极、共阴极数码管的工作原理可得,数码管显示数字0到9对应的abcdefg值如下表 所示。
LED 数码管的正常显示需要驱动电路来驱动数码管的各个码段,根据数码管驱动方式的不同, 可以将其分为静态式和动态式两类。
静态驱动是指每个数码管的每一个段码都通过一个单片机的I/O端口进行驱动,或使用如BCD 码二-十进制译码器译码进行驱动,也称直流驱动。静态驱动编程简单,显示亮度高,但占用的I/O端 口多:如果想要驱动5个数码管静态显示则需要5×8=40根I/O端口来完成驱动,而一个89S51单 片机可用的I/O端口才32个。如此一来,在实际应用中则必须增加译码驱动器进行驱动,从而增加 了硬件电路的复杂性。
由于静态驱动的这一缺点,LED 数码管动态显示接口应用更广。动态驱动是将所有数码管的 8 个显示字段"a、b、c、d、e、f、g、h"的同名端连接在一起,此外每个数码管的公共极COM需增加 由各自独立I/O线控制的位选通控制电路。当要输出某一字形码时,所有数码管都会接收到相同的字 形码,但究竟是哪个数码管会显示出字形取决于单片机对位选通COM端电路的控制。只需将显示数 码管的选通控制打开,该位就会显示出字形,而没有选通的数码管并不会点亮。综上所述,动态驱动 是通过分时轮流控制各数码管的COM端,使各个数码管轮流受控显示。在这一过程中,每位数码管 的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管各位数码管并非同时 点亮,但只要扫描速度足够快,人们观察到的就是一组稳定的显示数据,而不会产生闪烁感。在显示 效果上,动态显示和静态显示相同的,但动态显示不仅能够节省大量的I/O端口,而且功耗更低。
图中的SEG_A、SEG_B~SEG_DP是段选信号,8个数码管共用。
DIG1~DIG8 是位选信号,与8个数码管分别对应。当位选信号为0时,段选信号的值将赋给相 应数码管。例如DIG3信号为0则表示将段选信号SEG_A~SEG_DP的值赋给数码管3。
信号SEG_A~SEG_DP,DIG1~DIG8,都与电阻进行连接,如下图所示。
由此可见,SEG_A~SEG_DP由SEG0~SEG7产生,DIG1~DIG8由DIG_EN1~DIG_EN8产生。 而SEG0~SEG7和DIG_EN1~DIG_EN8都直接与FPGA的IO相连,如下图所示。
这些信号与FPGA 管脚的对应关系如下表。FPGA通过控制相应的管脚,从而实现对数码管显 示的控制。