(1)使用Vivado开发板上提供的100MHz的时钟率,设计计数分频模块,产生100Hz频率的时钟,实现该模块,并保存为Clk_ 100Hz. v文件。 (2)实现一个具有异步复位功能的60进制的计数器,模块名为Count60。(3)实现一个具有异步复位功能的100进制的计数器,模块名Count 100。(4)构建一个顶层模块,利用(1) 构建顶层模块,在顶层模块中实例化(1) - (3)中的模块实现计时长度为60秒,计时精度为百分秒的秒表,并利用开发板上的资源(LED) ,实现秒表的显示的功能。
时间: 2024-02-25 13:58:53 浏览: 255
好的,以下是我为您编写的代码:
(1) Clk_100Hz.v
```
module Clk_100Hz(
input clk,
output reg clk_100Hz
);
reg [31:0] cnt;
parameter DIVIDER = 500000;
always @ (posedge clk) begin
if (cnt == DIVIDER - 1) begin
cnt <= 0;
clk_100Hz <= ~clk_100Hz;
end else begin
cnt <= cnt + 1;
end
end
endmodule
```
该模块有两个输入和一个输出端口。输入为时钟信号 clk,输出为 100Hz 的时钟信号 clk_100Hz。该模块内部使用一个计数器 cnt,每计数到 500000 时,输出端口的值取反,从而实现 100Hz 的时钟信号。
(2) Count60.v
```
module Count60(
input clk,
input rst,
output reg [5:0] count
);
always @ (posedge clk or negedge rst) begin
if (~rst) begin
count <= 6'h0;
end else begin
if (count == 6'h3b) begin
count <= 6'h0;
end else begin
count <= count + 6'h1;
end
end
end
endmodule
```
该模块有三个输入和一个输出端口。输入包括时钟信号 clk 和异步复位信号 rst,输出为一个六位的计数器 count,它的范围是从 0 到 59。
当 rst 为 0 时,计数器被重置为 0。当 rst 为 1 时,计数器开始计数。每当时钟信号 clk 的上升沿到来时,计数器加 1,直到计数器等于 59 时,它会从 0 开始重新计数。
由于该计数器是一个异步复位计数器,因此即使时钟信号 clk 不起作用,也可以通过 rst 立即将计数器重置为 0。
(3) Count100.v
```
module Count100(
input clk,
input rst,
output reg [6:0] count
);
always @ (posedge clk or negedge rst) begin
if (~rst) begin
count <= 7'h0;
end else begin
if (count == 7'h63) begin
count <= 7'h0;
end else begin
count <= count + 7'h1;
end
end
end
endmodule
```
该模块有三个输入和一个输出端口。输入包括时钟信号 clk 和异步复位信号 rst,输出为一个七位的计数器 count,它的范围是从 0 到 99。
当 rst 为 0 时,计数器被重置为 0。当 rst 为 1 时,计数器开始计数。每当时钟信号 clk 的上升沿到来时,计数器加 1,直到计数器等于 99 时,它会从 0 开始重新计数。
由于该计数器是一个异步复位计数器,因此即使时钟信号 clk 不起作用,也可以通过 rst 立即将计数器重置为 0。
(4) stopwatch.v
```
module stopwatch(
input clk,
input rst,
output reg [5:0] sec,
output reg [1:0] ms,
output reg [5:0] min,
output reg [5:0] hour,
output reg [5:0] led
);
Clk_100Hz clk_100Hz(.clk(clk), .clk_100Hz(clk_100Hz));
Count60 count60(.clk(clk_100Hz), .rst(rst), .count(sec));
Count100 count100(.clk(clk_100Hz), .rst(rst), .count(ms));
reg [5:0] cnt_sec;
reg [5:0] cnt_min;
reg [5:0] cnt_hour;
parameter DIVIDER_SEC = 60;
parameter DIVIDER_MIN = 3600;
parameter DIVIDER_HOUR = 216000;
always @ (posedge clk_100Hz or negedge rst) begin
if (~rst) begin
cnt_sec <= 6'h0;
cnt_min <= 6'h0;
cnt_hour <= 6'h0;
end else begin
if (cnt_sec == DIVIDER_SEC - 1) begin
cnt_sec <= 6'h0;
if (cnt_min == DIVIDER_MIN - 1) begin
cnt_min <= 6'h0;
cnt_hour <= cnt_hour + 6'h1;
end else begin
cnt_min <= cnt_min + 6'h1;
end
end else begin
cnt_sec <= cnt_sec + 6'h1;
end
end
end
assign sec = count60.count + cnt_sec;
assign min = count60.count + cnt_min;
assign hour = count60.count + cnt_hour;
assign ms = count100.count;
always @ (posedge clk_100Hz or negedge rst) begin
if (~rst) begin
led <= 6'h0;
end else begin
led <= sec;
end
end
endmodule
```
该模块有三个输入和五个输出端口。输入包括时钟信号 clk 和异步复位信号 rst,输出包括秒、毫秒、分、时和 LED 灯。
该模块内部实例化了 Clk_100Hz、Count60 和 Count100 模块,使用这些模块实现了秒表的计时功能。同时,还定义了计数器 cnt_sec、cnt_min 和 cnt_hour,分别用于计算秒、分和时的计数器。
在赋值语句中,使用 Count60 模块的输出和 cnt_sec、cnt_min、cnt_hour 计数器的值,计算出秒、分和时的值。同时,使用 Count100 模块的输出计算出毫秒的值。
对于 LED 灯的输出,使用一个计数器 led,并在时钟信号 clk_100Hz 的上升沿或异步复位信号 rst 的下降沿时更新其值。在赋值语句中,将秒的值赋给 led,实现秒表的显示功能。
以上是使用 Verilog 语言实现计时长度为 60 秒,计时精度为百分秒的秒表,并利用开发板上的资源(LED) 实现秒表的显示功能的代码。
阅读全文