50MHz → 1Hz LED 闪烁
源文件 top.v
module top (
input sys_clk, // 50MHz 系统时钟
input sys_rst_n, // 复位按键(低有效)
output [3:0] led // 4 个 LED
);
// 50MHz 时钟,计到 25_000_000 = 0.5 秒翻转一次 → 1Hz 闪烁
parameter CNT_MAX = 25_000_000 - 1;
reg [24:0] cnt; // 25 位计数器(能数到 33M > 25M,够用)
reg led_r; // LED 状态寄存器
// 时序逻辑:每个时钟沿执行一次,异步复位
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n) begin // 复位键按下
cnt <= 0; // 计数器清零
led_r <= 1'b0; // LED 初始灭
end else if (cnt >= CNT_MAX) begin // 计够 0.5 秒?
cnt <= 0; // 计数器归零
led_r <= ~led_r; // LED 翻转(亮↔灭)
end else begin
cnt <= cnt + 1; // 没到就 +1
end
end
// {4{led_r}} = 把 led_r 复制 4 份 → 4 个 LED 同步闪烁
// 因为是低有效,所以取反输出:0 = 亮,1 = 灭
assign led = ~{4{led_r}};
endmodule约束文件 top.xdc
# 系统时钟 50MHz
set_property PACKAGE_PIN P15 [get_ports sys_clk]
set_property IOSTANDARD LVCMOS33 [get_ports sys_clk]
create_clock -period 20.000 -name sys_clk [get_ports sys_clk]
# 复位按键 KEY1(按下 = 0)
set_property PACKAGE_PIN E18 [get_ports sys_rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports sys_rst_n]
# LED x4(输出 0 = 亮)
set_property PACKAGE_PIN F15 [get_ports {led[0]}]
set_property PACKAGE_PIN G14 [get_ports {led[1]}]
set_property PACKAGE_PIN E16 [get_ports {led[2]}]
set_property PACKAGE_PIN E15 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}]