数码管动态显示Verilog实现(参考小梅哥教程)(视觉暂留)

这篇具有很好参考价值的文章主要介绍了数码管动态显示Verilog实现(参考小梅哥教程)(视觉暂留)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数码管动态显示Verilog实现(参考小梅哥教程)(视觉暂留)

一个数码管有八个引脚,控制八段二极管的亮灭,用以显示需要的数字。

当有N个数码管时,一个一个控制的话需要N x 8 个引脚,消耗资源较多。

因此可以利用动态显示的方案通过人眼的视觉暂留特性达到静态显示的效果(动态显示周期<20ms),只需N+8个引脚。节省了大量资源。(动态静显)

数码管动态显示Verilog实现(参考小梅哥教程)(视觉暂留)

数码管动态显示的逻辑电路如下:

数码管动态显示Verilog实现(参考小梅哥教程)(视觉暂留)

Verilog设计代码如下:文章来源地址https://www.toymoban.com/news/detail-444423.html

module digital_tube(//八个数码管显示
    clk,
    reset,
    disp_num_all,
    dg_tube,
    tube_part
    );
    
    input clk ;
    input reset ;
    input [31:0]disp_num_all ;
    output [7:0]dg_tube ;
    output [7:0]tube_part ;
    
    parameter one_dis_t = 25'd1_000_000 ;//每个晶体管显示时间(计数)
    
    reg [16:0]counter1 ;
    reg [2:0] counter2 ;
    
    always @ ( posedge clk or negedge reset )//分频
    begin
        if (! reset )
        counter1 <= 17'd0 ;
        else if ( (one_dis_t-1) <= counter1 )
        counter1 <= 17'd0 ;
        else
        counter1 <= counter1 +1'b1 ;
    end
    
    always @ ( posedge clk or negedge reset )//循环
    begin
        if (! reset )
        counter2 <= 3'd0 ;
        else if ( (one_dis_t-1) <= counter1 ) 
        counter2 <= counter2 +1'b1 ;
    end
    
    wire [3:0]disp_num_one ;
    
    //3-8译码器 控制哪个数码管显示
    decoder_3_8 tube_select(//控制
               .a(counter2[2] ),
               .b(counter2[1]),
               .c(counter2[0]),
               .out(dg_tube)
        );
    
    //需要一个八选一选通器,对应哪个数码管显示什么内容
    mux8  tube_display(//选通
    .sel(counter2),
    .data(disp_num_all),
    .out(disp_num_one)
    );
    
    //真值表对应显示数字
    LUT_truth translator(//控制
    .num(disp_num_one),
    .out(tube_part)
    );
endmodule
module decoder_3_8(
               a,
               b,
               c,
               out
        );
      input a;
      input b;
      input c;
      output reg [7:0]out;
      
      always@(*)begin//等价于always({a,b,c})a是高位,c是低位
         case({a,b,c})
              3'b000:out=8'b0000_0001;             
              3'b001:out=8'b0000_0010; 
              3'b010:out=8'b0000_0100; 
              3'b011:out=8'b0000_1000; 
              3'b100:out=8'b0001_0000; 
              3'b101:out=8'b0010_0000; 
              3'b110:out=8'b0100_0000; 
              3'b111:out=8'b1000_0000; 
         endcase
      end
      
endmodule
module mux8(
    sel,
    data,
    out
    );
    
    input [2:0]sel ;
    input [31:0]data ;
    output reg [3:0]out ;
    
    always@(*)
    begin
    case(sel)

        3'b000 : out = data[3:0] ;
        3'b001 : out = data[7:4] ;
        3'b010 : out = data[11:8] ;
        3'b011 : out = data[15:12] ;
        3'b100 : out = data[19:16] ;
        3'b101 : out = data[23:20] ;
        3'b110 : out = data[27:24] ;
        3'b111 : out = data[31:28] ;

    endcase
    end
endmodule
module LUT_truth(
    num,
    out
    );
    
    input [3:0]num ;
    output reg [7:0]out ;
    
    always@(num)
    begin
        case(num)
        4'h0 : out = 8'hc0 ;
        4'h1 : out = 8'hf9 ;
        4'h2 : out = 8'ha4 ;
        4'h3 : out = 8'hb0 ;
        4'h4 : out = 8'h99 ;
        4'h5 : out = 8'h92 ;
        4'h6 : out = 8'h82 ;
        4'h7 : out = 8'hf8 ;
        4'h8 : out = 8'h80 ;
        4'h9 : out = 8'h90 ;
        4'ha : out = 8'h88 ;
        4'hb : out = 8'h83 ;
        4'hc : out = 8'hc6 ;
        4'hd : out = 8'ha1 ;
        4'he : out = 8'h86 ;
        4'hf : out = 8'h8e ;
        endcase
    end
endmodule
`timescale 1ns / 1ns
module digital_tube_tb();
    
    reg clk ;
    reg reset ;
    reg [31:0]disp_num_all;
    wire [7:0]dg_tube ;
    wire [7:0]tube_part ;
    
    digital_tube   
    #( 
    .one_dis_t( 100 )
    )
    digital_tube_im(//八个数码管显示
    clk,
    reset,
    disp_num_all,
    dg_tube,
    tube_part
    );
    
    initial clk = 1 ;
    always #10 clk = ! clk ;
    initial
    begin
        reset = 0 ;
        disp_num_all = 32'd0 ;
        #201 ;
        reset = 1 ;
        #200 ;
        disp_num_all = 32'habb02525 ;
        #20000;
        disp_num_all = 32'h52520bba ;
        #30000;        
        $stop;
    end
    


    
endmodule

到了这里,关于数码管动态显示Verilog实现(参考小梅哥教程)(视觉暂留)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 利用AT89C52单片机实现数码管的静态与动态显示

            资源work1和work2(完整工程文件在笔者本人主页的资源中,免费欢迎下载)分别完成下面两个任务:         1、单片机接矩阵键盘和2个静态数码管,自行设计硬件电路,利用汇编语言,要求将按键值(0~15)在数码管显示。         主要代码: ……      

    2024年02月02日
    浏览(33)
  • 数码管动态显示

    8个数码管 SEL 8个显示电路 a,b,c,d,e,f,g,h SEG 要使哪一个亮,则将SEL[X]置为1,X线拉低---------使用一个 3-8译码器 ,根据cnt[2:0]来选择哪一个数码管亮 所以不同的数都可以根据SEL和SEG来进行选择 根据输入的不同的数来进行显示,一共有8个数码管,一个数的范围是0-f 。 需要4位,一

    2023年04月19日
    浏览(32)
  • 任意进制计数器12进制计数数码管显示verilog代码

    名称:任意进制计数器12进制计数数码管显示verilog代码 软件:VIVADO 语言:Verilog 代码功能: 设计一个12进制计数器,计数值00-11需要在数码管上显示, 时钟脉冲通过按键开关设计。 电路的输入信号en进行清零。 本代码可以修改为任意进制计数器,即修改计数控制模块的红框

    2024年02月04日
    浏览(43)
  • 数码管移位循环显示数字verilog代码ego1开发板

    名称:数码管移位循环显示数字verilog代码ego1开发板 软件:VIVADO 语言:Verilog 代码功能: 采用EGO1中的两组数码管,让该8个数码管循环显示:01234567,12345678,23456789.... 电路的输入信号en进行启动或暂停;用按键控制循环,按一下显示下一组数。 FPGA代码Verilog/VHDL代码资源下载

    2024年02月03日
    浏览(32)
  • 单片机——数码管动态显示

    1.头文件和定义,代码还使用了 sbit 定义来声明了两个变量 duan 和 wei,它们实际上是 P2.6 和 P2.7 端口的别名,用于控制数码管的段选和位选信号。这种方法可以使代码更具可读性,并提高代码的可维护性。定义无符号整数便于后面应用。 2.使用一个 16 个元素的数组 table,该数

    2024年02月11日
    浏览(31)
  • 实验(四)数码管动态显示实验

    一.实验目的、内容、仪器 实验目的: 1.熟悉数码管的功能和使用 2.了解位选和段选,和动态显示的原理 了解74HC138的引脚功能。 实验内容:接共阴极数码管,要求动态显示(HELLOC51),动态扫描显示即轮流向各位数码管送出字形码和相应的位选。 实验仪器:7SEG-MPX8-CC:八位数码管共

    2024年02月08日
    浏览(30)
  • 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日
    浏览(33)
  • [FPGA 学习记录] 数码管动态显示

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

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

    keil uVision4界面: proteus仿真界面:

    2024年02月06日
    浏览(47)
  • 【verilog】用七段数码管显示二进制编码的十进制数

    用七段数码管显示0~9,输入为四个信号,这四位二进制数表示十进制的0~9 图1 逻辑电路与七段显示器 图2 真值表 根据卡诺图,得出a~g的逻辑表达式: 硬件描述语言: 图4 代码编译成功 图5 电路图 图6 仿真波形 表1 端口管脚分配表 端口 使用模块信号 对应FPGA管脚 功能说明

    2023年04月25日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包