基于FPGA的八段数码管动态显示(输入数据为BCD编码) |
您所在的位置:网站首页 › 字形编码的种类 › 基于FPGA的八段数码管动态显示(输入数据为BCD编码) |
八段数码管动态显示(输入数据为BCD编码)
一、数码管概述
![]() 上面两图分别是对应八段共阴、共阳的数码管内部等效图,共阴是将八个LED数码管的阴极连接在一起接低,阳极segment信号只需要输入高电平,相应的数码管就被点亮;将上面八个数码管按照下面形状排列,就构成了数码管。 如何让数码管显示出对应的数据? 拿八段共阴数码管显示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输入不同的数据,就可以实现一组数据线驱动多个数码管显示不同的数据。 通过参数实现该模块可以驱动任意个数码管,通过自动计算位宽函数自动计算寄存器的位宽。 该设计实现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译码进行输出,之后各位显示类似。 参数设计以及自动计算位宽函数如下: 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 |