数码管原理


图a为单个数码管的原理图,实际上和点灯差不多,不过这8个灯按照数字8的形状进行排布。
数码管分共阴极和共阳极两种,图b左边是共阴极数码管,需要给对应的引脚高电平以点亮,右边是共阳极数码管,需要给低电平点亮。

驱动方式分类

1. 引脚直连

以6个8段数码管为例,每个数码管占用8个引脚,6个数码管就要占用48个引脚。
该方式对于fpga来说占用引脚过多,但这种方式使用起来最简单,比如友晶DE2开发板。

2. 位选+段选方式

将每个数码管的段选信号都连在一起,然后用6bit位选信号来选择数码管进行显示,引脚占用就减少到14个了,如下图:

在这种方式下,不管位选信号是多少,同一时刻只能显示一个数字,为了让不同的数码管显示不同的数字,需要进行动态显示。
动态显示下,任意时刻只选中1个数码管进行显示,6个数码管轮流点亮,由于余晖效应,只要刷新够快,就能让所有数码管同时显示。

3. 使用移位寄存器芯片74hc595

为了进一步减少数码管的引脚占用,使用74hc595芯片,其内部结构非常简单,就是一个8位的移位寄存器和一个8位的存储寄存器:

74hc595常用于串并转换,2片74HC595级联就能实现16位串转并,舍弃掉最后两位,就能实现14位串转并功能。
FPGA内部的14位的位选段选信号是并行的,我们需要先将其转化为串行数据输入74hc595,然后控制该芯片将串行数据转化为并行数据输出,只需控制DS、SHCP、STCP、OE四个引脚即可,这样FPGA的引脚占用就从14减小到4了。
其中,DS为串行数据,SHCP为移位时钟,STCP为锁存时钟,在两片74hc595级联的情况下,先将串行数据移位进两个8bit移位寄存器,再并行输出,即每16个SHCP上升沿对应1个STCP上升沿
此处我们需要自己写一个74hc595的驱动,将14位并行信号转化为串行信号,系统时钟50M,SHCP时钟选择系统时钟四分频,STCP选择系统时钟64分频,即SHCP的16分频,代码如下:

module hc595(input clk,input rst_n,// inputinput [7:0] seg,input [5:0] sel,// outputoutput  ds,output  shcp,output  stcp,output  oe
);
//------------signals--------------
// oe低电平有效
assign oe = 1'b0;
// 分频计数器
reg [5:0] cnt;
// 并行数据,末尾两位舍弃不用
wire [15:0] out_data = {seg, sel, 2'b00};
//------------function-------------
// 分频计数器
always @(posedge clk, negedge rst_n) beginif(!rst_n)cnt <= 0;elsecnt <= cnt + 6'd1;
end
// shcp选择4分频,即12.5M
assign shcp = cnt[1];
// stcp选择64分频,即shcp的16分频,保证16个shcp上升沿对应1个stcp上升沿
assign stcp = cnt[5:2] == 4'b0000;
// 输出串行ds,保证ds在shcp的下降沿变化
assign ds = out_data[cnt[5:2]];
endmodule

BCD码转位选+段选信号

有了74hc595模块,FPGA就可以使用14位的位选+段选信号来驱动数码管了,但FPGA内一般用4位BCD码表示1个数字,则6个数字需要24位BCD码,需要再写一个驱动,将24位BCD码转化为14位位选+段选信号,按照1khz的频率进行扫描,快速的扫描加上数码管的余晖效应,人眼看起来6个数码管是同时点亮的,该驱动模块RTL图如下:

verilog代码如下:

module BCD2seg_sel(// inputinput               clk,input               rst_n,input       [23:0]  BCD_data,// outputoutput reg  [7:0]   seg,output reg  [5:0]   sel
);
//------------signals--------------// 计数器,用于产生约1khz扫描信号,达到动态显示效果reg [15:0] cnt;wire       cnt_max = &cnt;// 被选中的BCD码reg [3:0]  BCD_out;
//------------function-------------// 计数器always @(posedge clk, negedge rst_n) beginif(!rst_n)cnt <= 0;elsecnt <= cnt + 16'd1;end// 循环移位寄存器,生成selalways @(posedge clk, negedge rst_n) beginif(!rst_n)sel <= 6'b000001;else if(cnt_max)sel <= {sel[4:0], sel[5]};end// 根据sel选择一个BCD码always @(*) begincase(sel)6'b000001: BCD_out = BCD_data[3:0];6'b000010: BCD_out = BCD_data[7:4];6'b000100: BCD_out = BCD_data[11:8];6'b001000: BCD_out = BCD_data[15:12];6'b010000: BCD_out = BCD_data[19:16];6'b100000: BCD_out = BCD_data[23:20];default: BCD_out = 4'h0;// 默认0endcaseend// 根据BCD_out进行数码管译码always @(*) begincase(BCD_out)4'h0   : seg = 8'h03;4'h1   : seg = 8'h9f;4'h2   : seg = 8'h25;4'h3   : seg = 8'h0d;4'h4   : seg = 8'h99;4'h5   : seg = 8'h49;4'h6   : seg = 8'h41;4'h7   : seg = 8'h1f;4'h8   : seg = 8'h01;4'h9   : seg = 8'h09;default: seg = 8'h03;// 默认0endcaseend
endmodule

上板验证

用这个驱动显示一下012345,顶层模块代码如下,即实例化上述两个模块,并传入24位bcd码:

module HEX6(input   clk,input   rst_n,// 74HC595 sideoutput  ds,output  shcp,output  stcp,output  oe
);
//------------signals--------------
wire    [23:0]  BCD_DATA = {4'h0, 4'h1, 4'h2, 4'h3, 4'h4, 4'h5};
wire    [7:0]   seg;
wire    [5:0]   sel;//------------function-------------
BCD2seg_sel inst_BCD2seg_sel(.clk      (clk),.rst_n    (rst_n),.BCD_data (BCD_DATA),.seg      (seg),.sel      (sel)
);
hc595 inst_hc595(.clk   (clk),.rst_n (rst_n),.seg   (seg),.sel   (sel),.ds    (ds),.shcp  (shcp),.stcp  (stcp),.oe    (oe)
);

上板验证结果如下:

FPGA驱动74HC595实现数码管动态显示相关推荐

  1. 【FPGA开发笔记】—— 数码管动态显示项目详细剖析+个人心得体会

    文章目录 一.项目要求 二.问题分析与思路设计 2.1 从基本的动态显示入手 2.2 算法设想 三.实际操作 3.1 程序架构 3.2 Verilog代码 3.2.1 main模块 3.2.2 100 ...

  2. STC单片机74hc164驱动8位数码管动态显示

    芯片介绍 74HC164.74HCT164是8位边沿触发式移位寄存器,串行输入数据,然后并行输出.数据通过两个输入端(DSA 或 DSB)之一串行输入:任一输入端可以用作高电平时使能端,控制另一输入端 ...

  3. FPGA 驱动数码管动态显示(VerilogVivado)

    FPGA 驱动数码管动态显示 前言 一.数码管驱动原理 二.设计思路 三.实现代码 四.hex8_tb文件 五.上板测试 1.74HC595时序图 2. HC595_Driver设计 3.HC595_ ...

  4. 基于STC15W4K32S4单片机仿真《74HC595驱动数码管动态显示》

    1. 编 程 软 件:keil5版本. 2.仿 真 软 件:Proteus8.12 3.单片机选型:STC15W4K32S4 4.学 习 目 标:1.学习74HC595驱动数码管动态显示 5.程 序 ...

  5. FPGA(5)数码管静态显示与动态显示

    目录 一.数码管静态显示 二.数码管动态显示 1.变量定义 2.定时(60us) 3.动态显示 代码 一.数码管静态显示 FPGA的数码管有4位,8段.(位和段都是共阳,即低电平有效) 位选的4位(二 ...

  6. c语言595驱动数码管,74hc595驱动4位数码管程序解析 - 74hc595驱动4位数码管电路连接图及程序解析...

    74hc595驱动4位数码管程序解析 //MCU:AT89S52 //晶振:11.0592M. //采用4位共阳极数码管 #include <regx51.h> //#include &l ...

  7. c语言595驱动数码管,74hc595驱动4位数码管电路连接图及程序解析 - 全文

    本设计使用了一个4位的数码管,为共阳型,为了节省单片机的IO口,使用了两片74HC595作为数码管的驱动芯片,共占用3个IO口.74HC595部分电路图如下: 与单片机相连接的三个脚分别为: HC_D ...

  8. 74HC595驱动2位数码管代码实现和注意事项

    74HC595驱动2位数码管 驱动芯片:74HC595,74LS595, 单片机:AT89C52,或者STC89C52都可以 实例代码 #include <STC89C5xRC.H> // ...

  9. 【FPGA】数码管动态显示之电子时钟

    文章目录 一.数码管动态显示的原理 二.设计思路 三.代码部分 四.仿真验证 一.数码管动态显示的原理 数码管动态显示其实就是数码管静态显示的升级版,给的段选信号是一样的,就是显示哪个字,但是不一样的 ...

最新文章

  1. nacos 怎么配置 里的配置ip_Nacos-服务注册地址为内网IP的解决办法
  2. 在linux中完整路径中的目录间分隔符是,路径分隔符(斜杠/与反斜杠\的问题)
  3. 设计模式1——设计模式的原则
  4. 调试24L01经验总结
  5. Xenapp之web界面中文化及发布应用
  6. JavaScript 字符串截取方法汇总
  7. eclipse 常用设置(二)
  8. pytorch之深度学习
  9. iOS底层探索之多线程(二)—线程和锁
  10. 基于SSM的客房预订系统的设计与实现
  11. elvui显示服务器,魔兽世界怀旧服ElvUI插件
  12. 重装系统服务器2012r2,SCCM2012R2网络部署重装系统
  13. Web3.0 使用说明书
  14. Gartner 魔力象限:安全信息和事件管理 2020
  15. Word2019很卡的解决办法
  16. Makefile中的死循环问题--学习李云《驾驭Makefile》中的疑惑解决
  17. 如何在Mac上停止使用iCloud照片库?
  18. 视频批量转GIF工具V1.3免费版
  19. 思科交换机如何根据MAC地址查所在交换机的端口
  20. 蓝桥杯2016届C++B组省赛真题 最大比例

热门文章

  1. 一小时入门 Python 3 网络爬虫-转载
  2. 王者荣耀s15服务器维护,王者荣耀s15赛季更新全部内容
  3. 苹果手机专用蓝牙耳机有哪些?与iphone兼容性好的蓝牙耳机
  4. 苹果亮度自动调节怎么关闭_如果你对手机的自动亮度调节不满意,试试这个quot;velis自动亮度quot;...
  5. 因为报表做得太好,我被阎王爷叫走了......
  6. 红米10x和红米note8pro哪个好
  7. Excel里半勾的打法
  8. Java 水仙花数(取余%取整/)
  9. 跑腿兔(TaskRabbit)是一个跑腿网站
  10. steam助手_6 Steam疑难解答提示