Verilog代码:

module counter(
    input clk,
    output reg [6:0] seg,
    output reg [3:0] anode,
    output reg led
);

reg [6:0] count;
reg [3:0] digit;
reg [23:0] timer;

always @(posedge clk) begin
    if (timer == 24000000) begin // 1秒钟
        timer <= 0;
        count <= count + 1;
        led <= ~led;
        if (count > 99) begin
            count <= 0;
        end
    end else begin
        timer <= timer + 1;
    end
end

always @(posedge clk) begin
    case(digit)
        0: seg <= 7'b1000000; // 0
        1: seg <= 7'b1111001; // 1
        2: seg <= 7'b0100100; // 2
        3: seg <= 7'b0110000; // 3
        4: seg <= 7'b0011001; // 4
        5: seg <= 7'b0010010; // 5
        6: seg <= 7'b0000010; // 6
        7: seg <= 7'b1111000; // 7
        8: seg <= 7'b0000000; // 8
        9: seg <= 7'b0010000; // 9
        10: seg <= 7'b0001000; // A
        11: seg <= 7'b0000011; // b
        12: seg <= 7'b0100111; // C
        13: seg <= 7'b0100001; // d
        14: seg <= 7'b0000110; // E
        15: seg <= 7'b0001110; // F
        default: seg <= 7'b0000000;
    endcase
end

always @(posedge clk) begin
    case(digit)
        0: anode <= 4'b1110; // 第一个数码管
        1: anode <= 4'b1101; // 第二个数码管
        2: anode <= 4'b1011; // 第三个数码管
        default: anode <= 4'b1111;
    endcase
    
    digit <= digit + 1;
    if (digit == 3) begin
        digit <= 0;
    end
end

endmodule

激励代码:

module counter_tb;

reg clk;
wire [6:0] seg;
wire [3:0] anode;
wire led;

counter uut(
    .clk(clk),
    .seg(seg),
    .anode(anode),
    .led(led)
);

initial begin
    clk <= 0;
    #5;
    forever #10 clk = ~clk;
end

endmodule
``

原文地址: https://www.cveoy.top/t/topic/coVz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录