Verilog 代码实现秒计数和 LED 闪烁,7 段数码管动态显示 0-100

本示例使用 Verilog 代码实现一个秒计数器,每秒计数加 1 并使 LED 灯闪烁一次,同时使用 7 段数码管动态显示计数结果,计数范围为 0 到 100。

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

代码解释

  1. 计数器模块 counter

    • clk: 时钟信号输入
    • seg: 7 段数码管段选信号输出
    • anode: 数码管位选信号输出
    • led: LED 灯输出
    • count: 计数器,用于记录秒数
    • digit: 数码管位选信号,用于控制 3 个数码管的显示
    • timer: 用于计时,每 24000000 个时钟周期为 1 秒
    • always @(posedge clk) 语句块:
    • 计数器每秒加 1,LED 灯闪烁
    • 当计数器超过 99 时,重置为 0
    • always @(posedge clk) 语句块:
    • 根据 digit 的值控制 7 段数码管显示 0-F 对应的段选信号
    • always @(posedge clk) 语句块:
    • 根据 digit 的值控制 3 个数码管的位选信号,实现动态显示
  2. 激励模块 counter_tb

    • counter 模块提供时钟信号
    • 通过观察 seganodeled 信号验证 counter 模块的功能

使用说明

  1. 将 Verilog 代码保存为 .v 文件,例如 counter.v
  2. 将激励代码保存为 .v 文件,例如 counter_tb.v
  3. 使用 Verilog 仿真工具(例如 ModelSim、QuestaSim)加载并仿真这两个文件
  4. 观察仿真结果,验证代码功能

扩展

  • 可以添加其他功能,例如将计数范围改为 0-255 或更广
  • 可以使用其他显示方式,例如 LCD 或 LED 点阵显示
  • 可以使用更精确的计时方法,例如使用外部时钟源或系统时间
  • 可以使用状态机等方法优化代码结构和可读性
  • 可以添加代码注释,解释每个代码段的功能和作用

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

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