(1)设计定义:设计一个计数器模块,实现每0.5秒跳转一次的功能,可以用LED灯的翻转来体现,要求初始状态为LED熄灭。
(2)visio视图:
(3)Verilog代码:
module counter(clk,reset_n,led_out);
input clk;
input reset_n;
output reg led_out;
// 0.5s = 500_000_000ns = 20ns * 25_000_000; 需要25位的寄存器去储存。
reg [24:0] cnt;
reg cnt_flag;
//参数设计
parameter MCNT = 25'd24_999_999;
//计数器模块设计
always@(posedge clk or negedge reset_n)
if(!reset_n)
cnt <= 25'd0;
else if(cnt == MCNT)
cnt <= 25'd0;
else
cnt <= cnt + 25'd1;
//标志信号设计
always@(posedge clk or negedge reset_n)
if(!reset_n)
cnt_flag <= 1'd0;
else if(cnt == MCNT - 25'd1)
cnt_flag <= 1'd1;
else
cnt_flag <= 1'd0;
//led_out灯翻转设计
always@(posedge clk or negedge reset_n)
if(!reset_n)
led_out <= 1'd0;
else if(cnt_flag)
led_out <= ~led_out;
else
led_out <= led_out;
endmodule
(4)RTL视图:(CE为使能端口)
Go to Source 可以直接定位到生成该器件的语句。
(5)仿真文件代码:
`timescale 1ns/1ns
module counter_tb;
reg clk;
reg reset_n;
wire led_out;
counter counter_inst(
.clk(clk),
.reset_n(reset_n),
.led_out(led_out)
);
defparam counter_inst.MCNT = 25'd24_999;
initial clk = 1'd1;
always #10 clk = ~clk;
initial begin
reset_n <= 1'd0;
#200;
reset_n <= 1'd1;
#1800_000;
$stop;
end
endmodule
(6)仿真波形:
(7)引脚绑定:
set_property IOSTANDARD LVCMOS33 [get_ports led_out]
set_property IOSTANDARD LVCMOS33 [get_ports reset_n]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property PACKAGE_PIN N15 [get_ports reset_n]
set_property PACKAGE_PIN W19 [get_ports clk]
set_property PACKAGE_PIN M21 [get_ports led_out]