FPGA学习——数码管点亮

学习芯片: EP4CE6F17C8
本次学习使用的为共阴极数码管,即用低电平点亮数码管,同样可知,共阳极数码管的阳极连在一起,即用高电平点亮数码管。

八段数码管示意图:
在这里插入图片描述
在这里插入图片描述
a,b,c,d,e,f,g,dg表示八段数码管时,a为最低位,dp为最高位
八段数码管用8位二进制表示,由于本次实验使用共阴极数码管,所以0表示亮,1表示灭,即数码管显示数字0我们可以用8'b1100_0000表示,数字F使用8'b1000_0111表示,同理可知,共阴极数码管和共阳极数码管互为对方的按位取反。

一、verilog编程使六个数码管同时显示0-f,时间间隔0.5s

代码如下:

module seg_dynamic(
    input   wire        clk,
    input   wire        rst_n,

    output  wire   [7:0] seg,//选择哪一段亮
    output  wire   [5:0] sel//选择哪一个数码管亮


);

localparam CNT_0_5S_MAX = 25'd25_000_000;//0.5s
localparam CNT_20NS_MAX = 16'd50_000;//20ns

parameter   ZERO  = 8'b1100_0000,
            ONE   = 8'b1111_1001,
            TWO   = 8'b1010_0100,
            THREE = 8'b1011_0000,
            FOUR  = 8'b1001_1001,
            FIVE  = 8'b1001_0010,
            SIX   = 8'b1000_0010,
            SEVEN = 8'b1111_1000,
            EIGHT = 8'b1000_0000,
            NINE  = 8'b1001_0000,
            A     = 8'b1000_1000,
            B     = 8'b1000_0011,
            C     = 8'b1100_0110,
            D     = 8'b1010_0001,
            E     = 8'b1000_0110,
            F     = 8'b1000_1110;

reg     [24:0]      cnt_0_5s;
reg     [3:0]       cnt_num;
reg     [19:0]      cnt_delay;
reg     [2:0]       cnt_seg;
reg     [7:0]       seg_r;
reg     [5:0]       sel_r;

//0.5s计数
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
      cnt_0_5s  <=  25'd0;
    end
    else if(cnt_0_5s == CNT_0_5S_MAX-1'd1)begin
      cnt_0_5s <= 25'd0;
    end
    else begin
      cnt_0_5s <= cnt_0_5s +1'd1;
    end
    
end

//20ms计数
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
      cnt_delay <= 16'd0;
    end
    else if(cnt_delay == CNT_20NS_MAX -1'd1)begin
      cnt_delay <= 16'd0;
    end
    else begin
      cnt_delay <= cnt_delay +1'd1;
    end
end

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
      cnt_num <= 4'd0;
    end
    else if(cnt_num == 4'd15 && cnt_0_5s == CNT_0_5S_MAX-1'd1)begin
      cnt_num <= 4'd0;
    end
    else if(cnt_0_5s == CNT_0_5S_MAX-1'd1)begin
      cnt_num <= cnt_num +1'd1;
    end
    else begin
      cnt_num <= cnt_num;
    end
end

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
      cnt_seg <=3'd0;
    end
    else if(cnt_seg == 3'd5 && cnt_delay == CNT_20NS_MAX -1'd1)begin
      cnt_seg <= 3'd0;
    end
    else if (cnt_delay == CNT_20NS_MAX -1'd1)begin
      cnt_seg <= cnt_seg + 1'd1;
    end
    else begin
      cnt_seg <=cnt_seg;
    end    
end

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
      sel_r <= 6'b111_110;
    end
    else if(cnt_seg == 3'd0 && cnt_delay == CNT_20NS_MAX -1'd1)begin
      sel_r <= 6'b111_101;
    end
    else if(cnt_seg == 3'd1 && cnt_delay == CNT_20NS_MAX -1'd1)begin
     sel_r <= 6'b111_011;
    end
    else if(cnt_seg == 3'd2 && cnt_delay == CNT_20NS_MAX -1'd1)begin
        sel_r <= 6'b110_111;
    end
    else if(cnt_seg == 3'd3 && cnt_delay == CNT_20NS_MAX -1'd1)begin
        sel_r <= 6'b101_111;
    end
    else if(cnt_seg == 3'd4 && cnt_delay == CNT_20NS_MAX -1'd1)begin
        sel_r <= 6'b011_111;
    end
    else if(cnt_seg == 3'd5 && cnt_delay == CNT_20NS_MAX -1'd1)begin
        sel_r <= 6'b111_110;
    end
    else begin
      sel_r <= sel_r;
    end
        


end

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
      seg_r <= 8'b1111_1111;
    end
    else begin
      case (cnt_num)
        4'd0: seg_r <= ZERO;
        4'd1: seg_r <= ONE;
        4'd2: seg_r <= TWO;
        4'd3: seg_r <= THREE;
        4'd4: seg_r <= FOUR;
        4'd5: seg_r <= FIVE;
        4'd6: seg_r <= SIX;
        4'd7: seg_r <= SEVEN;
        4'd8: seg_r <= EIGHT;
        4'd9: seg_r <= NINE;
        4'd10: seg_r <= A;
        4'd11: seg_r <= B;
        4'd12: seg_r <= C;
        4'd13: seg_r <= D;
        4'd14: seg_r <= E;
        4'd15: seg_r <= F;
        default: seg_r <= seg_r;
      endcase


    end

end

assign seg = seg_r;
assign sel = sel_r;

endmodule

运行结果图:

在这里插入图片描述

二、verilog编程六个数码管依次显示0-f,间隔时间0.5s

代码如下:

module seg_dynamic1(
    input   wire      clk,
    input   wire      rst_n,

    output  wire[7:0] seg,//选择哪一段亮
    output  wire[5:0] sel//选择哪一个亮 


);

parameter MAX_0_5S = 25'd25_000_000;//0.5s
localparam CNT_20NS_MAX = 16'd50_000;//20ns

reg [7:0]   seg_r;
reg [5:0]   sel_r;
reg [24:0]  cnt_0_5s;
reg [15:0]  cnt_delay;
reg [3:0]   cnt_num;

parameter   ZERO  = 8'b1100_0000,
            ONE   = 8'b1111_1001,
            TWO   = 8'b1010_0100,
            THREE = 8'b1011_0000,
            FOUR  = 8'b1001_1001,
            FIVE  = 8'b1001_0010,
            SIX   = 8'b1000_0010,
            SEVEN = 8'b1111_1000,
            EIGHT = 8'b1000_0000,
            NINE  = 8'b1001_0000,
            A     = 8'b1000_1000,
            B     = 8'b1000_0011,
            C     = 8'b1100_0110,
            D     = 8'b1010_0001,
            E     = 8'b1000_0110,
            F     = 8'b1000_1110;

//0.5s倒计时
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
      cnt_0_5s <= 25'd0;
    end
    else if(cnt_0_5s == MAX_0_5S -1'd1) begin
      cnt_0_5s <= 25'd0;
    end
    else begin
      cnt_0_5s <= cnt_0_5s +1'd1;
    end
end

//20ns倒计时
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
      cnt_delay <= 16'd0;
    end
    else if(cnt_delay == CNT_20NS_MAX -1'd1)begin
      cnt_delay <= 16'd0;
    end
    else begin
      cnt_delay <= cnt_delay +1'd1;
    end
end

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
      cnt_num <= 4'd0;
    end
    else if(cnt_num == 4'd15 && cnt_0_5s == MAX_0_5S -1'd1)begin
      cnt_num <= 4'd0;
    end
    else if( cnt_0_5s == MAX_0_5S -1'd1)begin
      cnt_num <= cnt_num + 1'd1;
    end
    else begin
      cnt_num <= cnt_num;
    end
end

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
      sel_r <= 6'b111110;
    end
    else if(cnt_0_5s == MAX_0_5S -1'd1)begin
      sel_r <= {sel_r[4:0],sel_r[5]};
    end
    else begin
      sel_r <=sel_r;
    end
end

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
      seg_r <= 8'b1111_1111;
    end
    else begin
      case (cnt_num)
        4'd0: seg_r <= ZERO;
        4'd1: seg_r <= ONE;
        4'd2: seg_r <= TWO;
        4'd3: seg_r <= THREE;
        4'd4: seg_r <= FOUR;
        4'd5: seg_r <= FIVE;
        4'd6: seg_r <= SIX;
        4'd7: seg_r <= SEVEN;
        4'd8: seg_r <= EIGHT;
        4'd9: seg_r <= NINE;
        4'd10: seg_r <= A;
        4'd11: seg_r <= B;
        4'd12: seg_r <= C;
        4'd13: seg_r <= D;
        4'd14: seg_r <= E;
        4'd15: seg_r <= F;
        default: seg_r <= seg_r;
      endcase

    end
end

assign seg = seg_r;
assign sel = sel_r;

endmodule

运行结果图如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_53573350/article/details/130388582