【边学边记_10】——8 位7段数码管的动态显示

这篇具有很好参考价值的文章主要介绍了【边学边记_10】——8 位7段数码管的动态显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数码管的驱动设计与验证

一、数码管驱动原理

其中 8 段数码管的结构图如下图所示
八位七段数码管动态显示电路的设计,【FPGA边学边记】笔记,单片机,嵌入式硬件,fpga开发
由上图可以看出数码管有两种结构:共阴极共阳极。这两者的区别在于,公共端是连接到地还是高电平,对于共阴数码管需要给对应段以高电平才会使其点亮,而对于共阳极数码管则需要给低电平才会点亮。本文采用共阳数码管。同时为了显示数字或字符,必须对数字或字符进行编码译码。这里先不考虑小数点也就是简化为 7 段数码管,其编码译码格式如下表所示:
八位七段数码管动态显示电路的设计,【FPGA边学边记】笔记,单片机,嵌入式硬件,fpga开发
段式数码管工作方式有两种:静态显示方式动态显示方式。静态显示的特点是每个数码管的段选必须接一个 8 位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法由于每一个数码管均需要独立的数据线因此硬件电路比较复杂,成本较高,很少使用。
为了节约 IO 以及成本一般采用如下图所示的电路结构,这样 3 个数码管接在一起就比静态的少了 7*2 个 I/O。
八位七段数码管动态显示电路的设计,【FPGA边学边记】笔记,单片机,嵌入式硬件,fpga开发
这样就实现了另一种显示模式,动态显示。动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
现在举例假设将扫描时间定为 1S,这三个数码管分成 3s,第 1 秒时 sel 数据线上为b100,这时数码管 0 被选中,这时 a=0,数码管 0 的 LED0 就可以点亮;第 2 秒时 sel 数据线上为b010,这时数码管 1 被选中,这时 b=0,数码管 1 的 LED1 就可以点亮;第 3 秒时 sel 数据线上为b001,这时数码管 2 被选中,这时 c=0,数码管 2 的 LED2 就可以点亮。这时的效果就会是数码管 0 的 LED0 亮一秒后数码管 1 的 LED1 亮一秒最后是数码管 2 的 LED2 亮一秒,这样再次循环。这样如果使用 1ms 刷新时间的话由于数码管的余辉效应以及人的视觉暂留这样就会出现数码管 0 的 LED0、数码管 1 的 LED1 以及数码管 2 的 LED2 “同时”亮,并不会有闪烁感。

二、模块设计

八位七段数码管动态显示电路的设计,【FPGA边学边记】笔记,单片机,嵌入式硬件,fpga开发

三、工程实现

1.设计文件

module hex8(
    Clk,
    Reset_n,
    disp_data,
    sel,
    seg
    );
    
    input Clk;
    input Reset_n;
    input [31:0] disp_data;
    output reg [7:0] sel;       //片选
    output reg [7:0] seg;     //段选
    
      //分频为1kHz  即每1ms刷新一次
            //使用门控时钟
    reg[14:0] div_cnt;     //分频计数        
    always@(posedge Clk or negedge Reset_n)
        if(!Reset_n)
            div_cnt <= 0;
        else if(div_cnt >= 24_999)
            div_cnt <= 0;        
        else
            div_cnt <= div_cnt + 1;
    reg clk_1k;   //此类门控时钟在大部分场合下不被允许
    always@(posedge Clk or negedge Reset_n)
        if(!Reset_n)
            clk_1k <= 0;
        else if(div_cnt == 24999)
            clk_1k <= ~clk_1k;    
            
        //3位计数器  
    reg [2:0] sel_num;
    always@(posedge clk_1k or negedge Reset_n)
        if(!Reset_n)
            sel_num <= 0;
        else 
            sel_num <= sel_num + 1;                            
        //3-8译码器
    always@(*)
        case(sel_num)
            0: sel = 8'b00000001;
            1: sel = 8'b00000010;
            2: sel = 8'b00000100;
            3: sel = 8'b00001000;
            4: sel = 8'b00010000;
            5: sel = 8'b00100000;
            6: sel = 8'b01000000;
            7: sel = 8'b10000000;
        endcase    
        //多路选择器    
    reg[3:0]disp_tmp;
    always@(*)
        case(sel_num)
            7: disp_tmp = disp_data[31:28];
            6: disp_tmp = disp_data[27:24];
            5: disp_tmp = disp_data[23:20];
            4: disp_tmp = disp_data[19:16];
            3: disp_tmp = disp_data[15:12];
            2: disp_tmp = disp_data[11:8];
            1: disp_tmp = disp_data[7:4];
            0: disp_tmp = disp_data[3:0];
        endcase      
        //LUT查找表
     always@(*)
        case(disp_tmp)
            0: seg = 8'hc0;
            1: seg = 8'hf9;
            2: seg = 8'ha4;
            3: seg = 8'hb0;
            4: seg = 8'h99;
            5: seg = 8'h92;
            6: seg = 8'h82;
            7: seg = 8'hf8;
            8: seg = 8'h80;
            9: seg = 8'h90;
            4'ha: seg= 8'h88;
            4'hb: seg= 8'h83;
            4'hc: seg= 8'hc6;
            4'hd: seg= 8'ha1;
            4'he: seg= 8'h86;
            4'hf: seg= 8'h8e;
        endcase             
    
endmodule

2.仿真文件

`timescale 1ns / 1ps
module hex8_tb();

    reg Clk;
    reg Reset_n;
    reg [31:0]disp_data;
    wire [7:0]sel;
    wire [7:0]seg;
    
    hex8_2 hex8(
        Clk,
        Reset_n,
        disp_data,
        sel,
        seg
    );  
    
    initial Clk = 1;
    always#10 Clk = ~Clk;
    
    initial begin
        Reset_n = 0;
        disp_data = 32'h00000000;
        #201;
        Reset_n = 1;
        #2000;
        disp_data = 32'h12345678;
        #10000000;
        disp_data = 32'h9abcdef0;
        #10000000;
        $stop;
    end
    
endmodule

3.仿真结果

八位七段数码管动态显示电路的设计,【FPGA边学边记】笔记,单片机,嵌入式硬件,fpga开发

四、思考

关于门控时钟使能时钟:使用门控时钟,将门控时钟直接作为DFF的工作时钟(即如上面第1部分代码所示),使用使能时钟的情况,DFF的工作时钟继续使用全局的高质量时钟,而将使能时钟作为DFF的使能信号使用(如下面代码所示)。关于时钟质量对FPGA设计的重要性,可以参考使能时钟与门控时钟的原理与差异视频学习。

module hex8_2(
    Clk,
    Reset_n,
    disp_data,
    sel,
    seg
    );
    
    input Clk;
    input Reset_n;
    input [31:0] disp_data;
    output reg [7:0] sel;       //片选
    output reg [7:0] seg;     //段选
    
      //分频为1kHz  即每1ms刷新一次
            //使用使能时钟
    reg[15:0] div_cnt;     //分频计数        
    always@(posedge Clk or negedge Reset_n)
        if(!Reset_n)
            div_cnt <= 0;
        else if(div_cnt >= 49_999)
            div_cnt <= 0;        
        else
            div_cnt <= div_cnt + 1;
    reg clk_1k;   
    always@(posedge Clk or negedge Reset_n)
        if(!Reset_n)
            clk_1k <= 0;
        else if(div_cnt == 49999)
            clk_1k <= 1;    
        else    
            clk_1k <= 0;
            
        //3位计数器  
    reg [2:0] sel_num;
    always@(posedge Clk or negedge Reset_n)
        if(!Reset_n)
            sel_num <= 0;
        else if(clk_1k) 
            sel_num <= sel_num + 1;                            
        //3-8译码器
    always@(posedge Clk)
        case(sel_num)
            0: sel = 8'b00000001;
            1: sel = 8'b00000010;
            2: sel = 8'b00000100;
            3: sel = 8'b00001000;
            4: sel = 8'b00010000;
            5: sel = 8'b00100000;
            6: sel = 8'b01000000;
            7: sel = 8'b10000000;
        endcase    
        //多路选择器    
    reg[3:0]disp_tmp;
    always@(posedge Clk)
        case(sel_num)
            7: disp_tmp = disp_data[31:28];
            6: disp_tmp = disp_data[27:24];
            5: disp_tmp = disp_data[23:20];
            4: disp_tmp = disp_data[19:16];
            3: disp_tmp = disp_data[15:12];
            2: disp_tmp = disp_data[11:8];
            1: disp_tmp = disp_data[7:4];
            0: disp_tmp = disp_data[3:0];
        endcase      
        //LUT查找表
     always@(posedge Clk)
        case(disp_tmp)
            0: seg = 8'hc0;
            1: seg = 8'hf9;
            2: seg = 8'ha4;
            3: seg = 8'hb0;
            4: seg = 8'h99;
            5: seg = 8'h92;
            6: seg = 8'h82;
            7: seg = 8'hf8;
            8: seg = 8'h80;
            9: seg = 8'h90;
            4'ha: seg= 8'h88;
            4'hb: seg= 8'h83;
            4'hc: seg= 8'hc6;
            4'hd: seg= 8'ha1;
            4'he: seg= 8'h86;
            4'hf: seg= 8'h8e;
        endcase             
    
endmodule

仿真结果
八位七段数码管动态显示电路的设计,【FPGA边学边记】笔记,单片机,嵌入式硬件,fpga开发文章来源地址https://www.toymoban.com/news/detail-816200.html

到了这里,关于【边学边记_10】——8 位7段数码管的动态显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    目录 一、数码管静态显示 二、数码管动态显示 1、变量定义 2、定时(60us) 3、动态显示 代码 FPGA的数码管有4位,8段 。( 位和段都是共阳,即低电平有效 )     位选的4位(二进制):分别为第1、2、3、4位数码管。 段选的8位(二进制):分别为第h、g、f、e、d、c、b、a段

    2023年04月12日
    浏览(46)
  • [FPGA 学习记录] 数码管动态显示

    数码管动态显示 在上一小节当中,我们对数码管的静态显示做了一个详细的讲解;但是如果单单只掌握数码管的静态显示这种显示方式是远远不够的,因为数码管的静态显示当中,被选中的数码位它们显示的内容都是相同的,这种显示方式在我们的实际应用当中显然是不合适

    2024年02月04日
    浏览(53)
  • C51单片机-共阳极数码管循环显示数字0至9,共阴极数码管循环显示5201314(动态)

    keil uVision4界面: proteus仿真界面:

    2024年02月06日
    浏览(58)
  • STM32-GPIO数码管动态显示

    目录 一、数码管原理 1、LED数码管的结构 2、LED数码管工作原理 3、数码管动态显示 1)动态显示的概念 2)动态显示的接口 二、代码的实现 三、仿真结果展示   本篇文章将继续进一步了解GPIO外设输出模式 知道这一部分的朋友可以直接点击目录部分跳过这段跳过 ,这里介绍

    2023年04月08日
    浏览(40)
  • 51单片机控制数码管动态显示

    首先打开proteus,导入8位数码管和89c51。 然后如图连线,分清断码和位码, 断码就是一个数码管的7个LED灯。 位码:就是第几位显示,由于是共阴极,所以哪位接地就显示哪位。 下面通过改变位码的接线就可以看出不同的效果 下面就编写程序,从第1位到第8位显示从0到7的八

    2023年04月21日
    浏览(46)
  • 单片机-如何让数码管动态显示

    单片机IO口输出难稳定,需要数码管与单片机连接需要增加驱动电路, 使用 74HC245 abcdefgDP并联导出  74HC245 对数码管进行驱动,P0 是输出电流 来驱动各个段的 驱动芯片 增加电阻 是为了防止电流过大烧坏数码管 。P0输出段选的 共阴 就是所有阴极 连接 在一起,连接在公共端

    2024年02月09日
    浏览(49)
  • 二、19【FPGA】数码管动态显示实验

    学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。 学习视频:是根据野火FPGA视频教程——第二十二讲 https://www.bilibili.com/video/BV1nQ4y1Z7zN?p=3 “天下武功唯快不破”    “看到的不一定为真” 眼睛的视觉暂留:光信号传入大脑需要短暂时间,

    2023年04月08日
    浏览(39)
  • 【边学边记_11】——DDS基本原理与FPGA实现

    DDS(Direct Digital Synthesizer)即数字合成器 ,是一种新型的频率合成技术,具有相对带宽大,频率转换时间短、分辨率高和相位连续性好等优点。较容易实现 频率 、 相位 以及 幅度 的数控调制,广泛应用于通信领域。 DDS 的基本结构主要由 相位累加器 、 相位调制器 、 波形数据

    2024年02月06日
    浏览(43)
  • verilog学习笔记- 15)动态数码管显示实验

    目录 简介: 实验任务: 硬件设计: 程序设计: 下载验证: 由于一般的静态驱动操作虽然方便,但占用的 I/0 口较多,例如要驱动6 位 8 段数码管,以静态驱动方式让数码管各个位显示不同的数值,如“123456”,需要占用6 × 8 = 48个I/O 口,虽然对于 FPGA 这种 I/O 口较多的芯片

    2024年02月07日
    浏览(48)
  • FPGA基本实验之数码管的动态显示

            关于数码管的基本知识大家可以参考我上一篇文章数码管的静态显示,         使用 1ms 的刷新时间让六个数码管轮 流显示:第 1ms 点亮第一个数码管,第 2ms 点亮第二个数码管,以此类推依次点亮六个数 码管,6ms 一个轮回,也就是说每个数码管每 6ms 点亮

    2024年02月08日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包