基于FPGA的八段数码管动态显示(输入数据为BCD编码)

您所在的位置:网站首页 字形编码的种类 基于FPGA的八段数码管动态显示(输入数据为BCD编码)

基于FPGA的八段数码管动态显示(输入数据为BCD编码)

2024-07-14 10:02| 来源: 网络整理| 查看: 265

八段数码管动态显示(输入数据为BCD编码) 一、数码管概述

八段共阴数码管内部等效原理图

图1 八段共阴数码管内部等效原理图 八段共阳数码管内部等效原理图 图2 八段共阳数码管内部等效原理图

  上面两图分别是对应八段共阴、共阳的数码管内部等效图,共阴是将八个LED数码管的阴极连接在一起接低,阳极segment信号只需要输入高电平,相应的数码管就被点亮;将上面八个数码管按照下面形状排列,就构成了数码管。 数码管示意图

图3 数码管示意图

如何让数码管显示出对应的数据?

  拿八段共阴数码管显示2举例,如上图显示2需要点亮a、b、g、e、d这五个LED,其余LED全部熄灭。所以segment信号应该输出的数据是0101_1011。显示其余数字也是类似的原理,而h一般是用作小数点处理,不需要的时候一般都不点亮这个LED。下面是不包括h段LED的数码管译码对应表。

表一 八段共阴共阳数码管译码数据 显示数字共阳gfedcba 2进制共阳gfedcba 16进制共阴gfedcba 2进制共阴gfedcba 16进制08’b110000008’hC08’b001111118’h3f18’b111110018’hF98’b000001108’h0628’b101001008’hA48’b010110118’h5b38’b101100008’bB08’b010011118’h4f48’b100110018’h998’b011001108’b6658’b100100108’h928’b011011018’h6d68’b100000108’h828’b011111018’h7d78’b111110008’hF88’b000001118’h0788’b100000008’h808’b011111118’h7f98’b100100008’h908’b011011118’h6f

  经过上面可知,想让数码管显示对应的数据,就必须给此数码管的八个数据线(八个LED输入端)输入对应的数据,将这8根数据线称为一组数据线。那如果需要同时使用两个数码管呢?此时就需要控制16个LED,所以就需要2组数据线。由此需要n个数码管显示n个数字,就需要n组数据线,这会极大消耗数据线资源,但是平常单片机或者FPGA这些开发板上面的数码管很多,却只有一组数据线,这是怎么做到的呢?

  为了解决上面问题,一般是将四个数码管制作成下图所示的三线制数码管,将四个独立数码管四组数据线接在一起,四个数码管共用一组数据线,同时每个数码管增加一个DIG片选信号,如下图当DIG1引脚为低电平时,此时数据线HEX的数据驱动第1个数码管显示对应的数字。通过控制4个DIG引脚实现一组数据线驱动多个数码管,比如20us点亮第一个数码管,之后每隔20us点亮下一个数码管,最后循环点亮四个数码管,在点亮不同数码管的时候控制数据线HEX输入不同的数据,就可以实现一组数据线驱动多个数码管显示不同的数据。 在这里插入图片描述

图3 4个八段数码管原理图

二、FPGA实现驱动数码管 1、信号列表 信号位宽输入/输出描述clk1I系统时钟,1MHzrst_n1I系统复位,低电平有效din4*数码管个数I待显示的BCD码数据segment8O八段数码管的数据线seg_sel数码管个数O数码管片选信号,电平有效 2、设计思路

  通过参数实现该模块可以驱动任意个数码管,通过自动计算位宽函数自动计算寄存器的位宽。

  该设计实现FPGA可以驱动SEG_NUM个数码管,每个数码管显示的时间为TIME_20MS。所以本设计以20us计数器cnt_20us和点亮的第几个计数器sel为主体架构,其余信号对齐这两个计数器。计数器示意图如下,cnt_20us计数计数时,sel计数器加一,表示点亮下一个数码管。例如使用8个数码管同时显示12345678,则SEG_NUM=8,din=64‘h12345678,之后sel计数器为0时,segment译码显示4’d8,此时第0个数码管显示8,之后计数器cnt_20us计数结束,sel+1,此时点亮第一个数码管,则数据线segment应该将4’d7译码进行输出,之后各位显示类似。 ji计数器架构

图4 计数器架构

  参数设计以及自动计算位宽函数如下:

parameter TIME_20US = 20 ,//数码管刷新时间,默认20us。 parameter SEG_NUM = 6 //需要显示的数码管个数。 //参数定义 localparam TIME_W = clogb2(TIME_20US);//计算数码管扫描时间的时钟数据位宽; localparam SEG_W = clogb2(SEG_NUM); localparam ZERO = 8'hC0 ; //8'h3F;前面的数据是共阳数码管使用的,后面数据是共阴数码管使用的; localparam ONE = 8'hF9 ; //8'h06; localparam TWO = 8'hA4 ; //8'hB; localparam THREE = 8'hB0 ; //8'hF; localparam FOUR = 8'h99 ; //8'h66; localparam FIVE = 8'h92 ; //8'h6D; localparam SIX = 8'h82 ; //8'h7D; localparam SEVEN = 8'hF8 ; //8'h07; localparam EIGHT = 8'h80 ; //8'h7F; localparam NINE = 8'h90 ; //8'h6F; localparam ERR = 8'h86 ; //8'h79; //自动计算位宽的函数; function integer clogb2(input integer depth);begin if(depth==0) clogb2=1; else if(depth!=0) for(clogb2=0; depth>0;clogb2=clogb2+1) depth=depth>>1; end endfunction

计数器cnt_20us初始值为0,对系统时钟进行计数,计数到TIME_20US-1时结束,对应代码如下:

//20us计数器,用于对一个数码管点亮的持续时间进行计数,计数器初始值为0,对 always @(posedge clk or negedge rst_n)begin if(!rst_n)begin//计数器初始值为0; cnt_20us


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3