|LED 闪烁测试

LED 闪烁测试

作者: 石志超更新于: 2026/2/27

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[*]}]