用verilog写一个精确到百分之一秒的数字秒表,用74h138,可以暂停和清零
时间: 2024-03-25 16:41:07 浏览: 41
好的,以下是一个精确到百分之一秒的数字秒表的Verilog代码:
```
module stopwatch(
input clk,
input start,
input stop,
input reset,
input pause,
output reg [3:0] seconds,
output reg [3:0] tens,
output reg [1:0] minutes,
output reg [3:0] hundredths
);
reg [26:0] count; // 27位计数器
reg [7:0] divider; // 分频器计数器
reg [2:0] state; // 状态机状态
reg [2:0] next_state; // 下一个状态
wire [7:0] selector; // 74h138译码器输出
assign selector = {pause, stop, start, reset};
always @(posedge clk)
begin
if (reset) // 复位计数器和分频器
begin
count <= 0;
divider <= 0;
state <= 3'b000;
end
else
begin
// 分频器计数
divider <= divider + 1;
if (divider == 8)
divider <= 0;
// 计数器计数
if (state == 3'b000 && start && ~stop && ~pause) // 开始计数
begin
count <= count + 1;
next_state <= 3'b001;
end
else if (state == 3'b001 && (stop || pause)) // 暂停或停止
next_state <= 3'b010;
else if (state == 3'b010 && start) // 继续计数
next_state <= 3'b001;
else
next_state <= state;
if (state != next_state)
state <= next_state;
end
end
always @(*)
begin
if (count >= 27000000) // 秒数超过99秒,计数器清零
count <= 0;
seconds = count[25:22]; // 计算秒数
tens = count[21:18]; // 计算十位
minutes = count[17:16]; // 计算分钟数
hundredths = count[15:12]; // 计算百分之一秒
end
assign #1 selector = ~selector; // 74h138输出取反
endmodule
```
这个秒表使用一个27位计数器和一个分频器来计算从开始按钮按下到现在经过的百分之一秒数。分频器用来将时钟信号分频为100MHz,计数器每个时钟周期加1,然后根据状态机状态决定是否计数。当秒数达到99秒时,计数器会自动清零。复位按钮可以手动将计数器清零,开始按钮可以开始计数,停止按钮可以暂停计数,暂停按钮可以暂停计数并保留当前计数。使用74h138译码器来选择LED数码管的显示。需要注意的是74h138的输出是低有效的,所以需要将输出取反。
阅读全文