帮我在vivado中实现以下功能,给出每个文件的代码:. Verilog实现秒表 (1)功能要求 ① 4位LED数码管M.SS.D,其中最低位D代表0.1秒,范围是0到9;SS代表秒,范围是00到59;M代表分钟,范围是0到9。 ② 使用2^n分频将数码管扫描频率设定在1000 Hz左右。 ③ sw0为高电平有效的同步清零信号,sw1为高电平有效的同步计数使能信号。 (2)其他要求 ① 使用Logisim自带模块,在给定的logisim_basys3.circ上实现上述功能。 ② 源文件div.v实现分频,display.v实现数码管显示功能,timer.v为计时功能,timer_tb.v为仿真文件。 ③ 要求撰写仿真程序,对代码进行仿真测试。 ④ 将仿真后的Verilog代码进行综合与实现,并下载到Basys3上验证。
时间: 2023-12-14 13:37:06 浏览: 91
很抱歉,由于回答中包含多个文件和代码,无法在此处直接展示。以下是每个文件的代码和实现步骤:
1. div.v
该文件实现了一个分频器,将时钟频率分频为1000 Hz左右,用于驱动数码管扫描。
```verilog
module div(
input clk,
output reg out
);
reg [14:0] count;
always @(posedge clk) begin
if (count == 50000) begin // 50000为2^15/1000
count <= 0;
out <= ~out;
end
else begin
count <= count + 1;
end
end
endmodule
```
2. display.v
该文件实现了数码管的显示功能,包括刷新和数码显示。
```verilog
module display(
input clk,
input [3:0] data,
output [6:0] seg,
output [3:0] an
);
reg [7:0] seg_pattern;
reg [3:0] an_pattern;
reg [1:0] scan_cnt;
assign seg = seg_pattern;
assign an = an_pattern;
always @(posedge clk) begin
if (scan_cnt == 2'b00) begin
seg_pattern = 8'b00000001;
an_pattern = 4'b1110;
end
else if (scan_cnt == 2'b01) begin
seg_pattern = {1'b0, data[0], 1'b1, data[1], 1'b1, data[2], 1'b1, data[3]};
an_pattern = 4'b1101;
end
else if (scan_cnt == 2'b10) begin
seg_pattern = {1'b1, 1'b1, 1'b1, 1'b1, 1'b1, 1'b1, 1'b1, 1'b1};
an_pattern = 4'b1011;
end
else begin
seg_pattern = {1'b1, 1'b1, 1'b1, 1'b1, 1'b1, 1'b1, 1'b1, 1'b1};
an_pattern = 4'b0111;
end
if (scan_cnt == 2'b11) begin
scan_cnt <= 2'b00;
end
else begin
scan_cnt <= scan_cnt + 1;
end
end
endmodule
```
3. timer.v
该文件实现了计时器功能,包括秒表的计数和清零。
```verilog
module timer(
input clk,
input rst,
input en,
input clr,
output reg [3:0] digit
);
reg [23:0] cnt;
always @(posedge clk or posedge rst) begin
if (rst) begin
cnt <= 0;
digit <= 4'b0000;
end
else if (en) begin
if (cnt == 24000000) begin // 24000000为时钟频率/100,即1秒
cnt <= 0;
if (digit == 4'b5959) begin // 到达最大值时清零
digit <= 4'b0000;
end
else begin
digit <= digit + 1;
end
end
else begin
cnt <= cnt + 1;
end
end
else if (clr) begin
cnt <= 0;
digit <= 4'b0000;
end
end
endmodule
```
4. timer_tb.v
该文件是仿真文件,用于对计时器进行仿真测试。
```verilog
`timescale 1ns / 1ps
module timer_tb();
reg clk, rst, en, clr;
wire [3:0] digit;
timer uut(
.clk(clk),
.rst(rst),
.en(en),
.clr(clr),
.digit(digit)
);
initial begin
clk = 0;
rst = 1;
en = 0;
clr = 0;
#10 rst = 0;
#10 en = 1;
#1000 clr = 1;
#1000 clr = 0;
#1000 $finish;
end
always #5 clk = ~clk;
endmodule
```
5. 实现步骤:
- 将以上四个文件添加到Vivado项目中。
- 在Vivado中打开Basys3开发板的约束文件,将数码管的引脚与FPGA的引脚相对应。
- 进行综合与实现,并下载到Basys3开发板上进行验证。
阅读全文