Verilog 代码实现秒计数和 LED 闪烁,7 段数码管动态显示 0-100
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
代码解释
-
计数器模块
counterclk: 时钟信号输入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 个数码管的位选信号,实现动态显示
-
激励模块
counter_tb- 为
counter模块提供时钟信号 - 通过观察
seg、anode和led信号验证counter模块的功能
- 为
使用说明
- 将 Verilog 代码保存为
.v文件,例如counter.v - 将激励代码保存为
.v文件,例如counter_tb.v - 使用 Verilog 仿真工具(例如 ModelSim、QuestaSim)加载并仿真这两个文件
- 观察仿真结果,验证代码功能
扩展
- 可以添加其他功能,例如将计数范围改为 0-255 或更广
- 可以使用其他显示方式,例如 LCD 或 LED 点阵显示
- 可以使用更精确的计时方法,例如使用外部时钟源或系统时间
- 可以使用状态机等方法优化代码结构和可读性
- 可以添加代码注释,解释每个代码段的功能和作用
原文地址: http://www.cveoy.top/t/topic/nuVe 著作权归作者所有。请勿转载和采集!