Vivado 实现4个7位数码管显示数字

目前只是实现了4位分别显示0~9的功能的7位数码管,后期有添加内容还会有删改。

就不用提数码管的原理了(像什么共阳极,共阴极之类的),我会把每一步都解析标注出来。

首先是实现4个数码管显示相同数字。


module LED
    (

        input [3:0]i_num,    //输入4位2进制的数
        output reg [6:0] o_led_num    //7位分别对应7位数码管的每个灯泡
    );
 
    always @ *
        begin
            case(i_num)    //输入情况不同对应不同的方案
            4'h0:o_led_num = 7'b000_0001;    
    //o_led_num 的7位分别代表了每个灯泡的亮灭,由于用的共阳极的数码管,所以0为亮
            4'h1:o_led_num = 7'b100_1111;
            4'h2:o_led_num = 7'b001_0010;
            4'h3:o_led_num = 7'b000_0110;
            4'h4:o_led_num = 7'b100_1100;
            4'h5:o_led_num = 7'b010_0100;
            4'h6:o_led_num = 7'b010_0100;
            4'h7:o_led_num = 7'b000_1111;
            4'h8:o_led_num = 7'b000_0000;
            4'h9:o_led_num = 7'b000_1100;
            default:   
                 o_led_num = 7'b111_1111;    //若值不在0~9之间则全部熄灭
            endcase
         end  
endmodule

由于没有具体选择4个数码管的哪一个所以4个都会显示同样的值。

接下来是想实现 4 个数码管显示不同的内容,就要利用人眼的视觉暂留,对 4 个 7 段数码管进行分时复用。当数码管的刷新频率高于人眼的视觉暂留时,人眼就无法察觉数码管的信息改变。

`timescale 1ns / 1ps    //仿真时间的定义即在仿真中用#100表示延迟100ns。1ps表示时间精度
module LED
    (
        input clk,    //使用时钟信号,频率为50MHz
        input [3:0]i_num_1,    //这里分别定义了想要输入的4个数
        input [3:0]i_num_2,
        input [3:0]i_num_3,
        input [3:0]i_num_4,
        output reg[3:0] an,    //这里是使能信号,即选择是哪个数码管显示
        output reg [6:0] o_led_num    //7位对应一个数码管的七个灯泡
    );
    
    reg[17:0] regN;    //结合regN用途一起看
    reg[3:0] i_num;    //用来储存4个输入数中需要显示的那一个
    always @(posedge clk)
        regN = regN+1;    //clk每到上升沿regN就会+1 //再结合后面看
    
    always @(regN[17:16])    
    //clk为18位,这里取第17,18位,即1-16位是用于计时,所以时钟需要跳2的16次方
    (是一个很短且对于视觉残留和板子频率有益的时间)显示的数码管才更改,
    进位到17~18位就用于确定哪个数码管
    begin
        case (regN[17:16])
        2'b00:begin
                an=4'b1110;
                i_num=i_num_1;
                end
        2'b01:begin
                an=4'b1101;
                i_num=i_num_2;
                end      
        2'b10:begin
                an=4'b1011;
                i_num=i_num_3;
                end  
        2'b11:begin 
                an=4'b0111;
                i_num=i_num_4;
                end
       endcase
    end
                
    
    
    always @ *    //控制7个数码管里灯泡的亮灭
        begin
            case(i_num)
            4'h0:o_led_num = 7'b000_0001;
            4'h1:o_led_num = 7'b100_1111;
            4'h2:o_led_num = 7'b001_0010;
            4'h3:o_led_num = 7'b000_0110;
            4'h4:o_led_num = 7'b100_1100;
            4'h5:o_led_num = 7'b010_0100;
            4'h6:o_led_num = 7'b010_0100;
            4'h7:o_led_num = 7'b000_1111;
            4'h8:o_led_num = 7'b000_0000;
            4'h9:o_led_num = 7'b000_1100;
            default:   
                 o_led_num = 7'b111_1111;
            endcase
         end  
endmodule

  • 9
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值