verilog用八段共阳数码管显示毫秒级秒表
时间: 2023-06-16 09:05:09 浏览: 228
verilog实现八位数码管显示
以下是使用 Verilog 实现八段共阳数码管显示毫秒级秒表的代码:
```verilog
module stopwatch(
input clk, // 时钟信号
output [6:0] seg_out, // 数码管输出信号
output [3:0] an_out // 数码管位选信号
);
reg [23:0] count; // 计数器
reg [3:0] ones, tens; // 秒个位和十位
reg [1:0] ms_ones; // 毫秒个位
reg [3:0] an = 4'b1110; // 初始位选信号
// 时钟分频器,将 50MHz 的时钟分频为 1 KHz
reg [9:0] clk_div;
always @(posedge clk) begin
if (clk_div == 999) begin
clk_div <= 0;
count <= count + 1;
end
else begin
clk_div <= clk_div + 1;
end
end
// 计算秒和毫秒
always @(posedge clk) begin
if (count == 24999) begin
ones <= ones + 1;
if (ones == 10) begin
ones <= 0;
tens <= tens + 1;
end
end
if (count == 999) begin
ms_ones <= ms_ones + 1;
if (ms_ones == 10) begin
ms_ones <= 0;
end
end
end
// 数码管译码
always @(*) begin
case ({tens, ones})
2'b00: seg_out = 7'b1000000; // 0
2'b01: seg_out = 7'b1111001; // 1
2'b10: seg_out = 7'b0100100; // 2
2'b11: seg_out = 7'b0110000; // 3
2'b100: seg_out = 7'b0011001; // 4
2'b101: seg_out = 7'b0010010; // 5
2'b110: seg_out = 7'b0000010; // 6
2'b111: seg_out = 7'b1111000; // 7
2'b1000: seg_out = 7'b0000000; // 8
2'b1001: seg_out = 7'b0010000; // 9
default: seg_out = 7'b1111111; // 显示空
endcase
case (an)
4'b1110: an_out = 4'b1110; // 第一位
4'b1101: an_out = 4'b1101; // 第二位
4'b1011: an_out = 4'b1011; // 第三位
4'b0111: an_out = 4'b0111; // 第四位
default: an_out = 4'b1111; // 关闭所有位选
endcase
end
// 数码管位选
always @(posedge clk) begin
if (an == 4'b0111) begin
an <= 4'b1110;
end
else begin
an <= an >> 1;
end
end
endmodule
```
这个代码使用一个计数器和一个时钟分频器来实现毫秒级的计时,然后使用两个寄存器存储秒的个位和十位,一个寄存器存储毫秒的个位。最后使用一个状态机来实现数码管的位选和译码。
阅读全文