用vivado编写以下代码(1)使用Vivado开发板上提供的100MHz的时钟率,设计计数分频模块,产生100Hz频率的时钟,实现该模块,并保存为Clk_ 100Hz. v文件。 (2)实现一个具有异步复位功能的60进制的计数器,模块名为Count60。(3)实现一个具有异步复位功能的100进制的计数器,模块名Count 100。(4)构建一个顶层模块,利用(1) 构建顶层模块,在顶层模块中实例化(1) - (3)中的模块实现计时长度为60秒,计时精度为百分秒的秒表,并利用开发板上的资源(LED) ,实现一个计数时长为60秒,且计数精度为百分秒的数字电子表。
时间: 2024-02-25 18:59:17 浏览: 463
以下是代码实现,注释中有一些解释:
(1) Clk_100Hz.v
```verilog
module Clk_100Hz(input clk, output reg clk_100Hz);
// 定义计数器
reg [25:0] cnt = 0;
// 每个时钟周期计数器加1
always @(posedge clk) begin
cnt <= cnt + 1;
if(cnt == 999_999) begin
// 当计数器达到999999时,将100Hz时钟输出反转一次
clk_100Hz <= ~clk_100Hz;
cnt <= 0;
end
end
endmodule
```
(2) Count60.v
```verilog
module Count60(input clk, input rst, output reg [5:0] sec_out);
// 定义计数器
reg [25:0] cnt = 0;
// 每个时钟周期计数器加1
always @(posedge clk or negedge rst) begin
if(!rst) begin
// 异步复位
cnt <= 0;
sec_out <= 0;
end else begin
cnt <= cnt + 1;
if(cnt == 599_999_999) begin
// 当计数器达到599999999时,秒数加1
sec_out <= sec_out + 1;
cnt <= 0;
end
end
end
endmodule
```
(3) Count100.v
```verilog
module Count100(input clk, input rst, output reg [6:0] cnt_out);
// 定义计数器
reg [25:0] cnt = 0;
// 每个时钟周期计数器加1
always @(posedge clk or negedge rst) begin
if(!rst) begin
// 异步复位
cnt <= 0;
cnt_out <= 0;
end else begin
cnt <= cnt + 1;
if(cnt == 99_999_999) begin
// 当计数器达到99999999时,计数器加1
cnt_out <= cnt_out + 1;
cnt <= 0;
end
end
end
endmodule
```
(4) Top.v
```verilog
module Top(input clk, input rst, output [5:0] sec_out, output [6:0] cnt_out, output reg [15:0] led);
// 实例化 Clk_100Hz 模块,产生 100Hz 时钟
Clk_100Hz clk_100Hz_inst(.clk(clk), .clk_100Hz(clk_100Hz));
// 实例化 Count60 模块,计时长度为60秒,计时精度为百分秒
Count60 count60_inst(.clk(clk_100Hz), .rst(rst), .sec_out(sec_out));
// 实例化 Count100 模块,计数精度为百分秒
Count100 count100_inst(.clk(clk_100Hz), .rst(rst), .cnt_out(cnt_out));
// LED 显示秒数和计数值
always @(sec_out, cnt_out) begin
led <= {cnt_out, sec_out};
end
endmodule
```
阅读全文