![image.png](/uploads/projects/zhj0125@fpga/bb940b341b7beac157b698d9057df3d4.png)
![image.png](/uploads/projects/zhj0125@fpga/e37ae9fd4b5e98df4628417d6f92c1c7.png)
![image.png](/uploads/projects/zhj0125@fpga/d9e7213b22e497e88ad250691dc58a74.png)
module key_led(
input clk,
input rst,
input [3:0] key,
output reg [3:0] led
);
reg [23:0] counter;
reg [1:0] led_switch;
parameter TIME = 24'd10_000_000; //0.2s
// counter 计数0.2秒
always @(posedge clk or negedge rst) begin
if(!rst)
counter <= 24'd0;
else if(counter > TIME)
counter <= 24'd0;
else
counter <= counter + 1'b1;
end
// led_switch 状态计数器切换
always @(posedge clk or negedge rst) begin
if(!rst)
led_switch <= 2'd0;
else if(counter == TIME) begin
led_switch <= led_switch + 1'b1;
// if(led_switch == 2'b11) // led_switch溢出复位
// led_switch <= 2'b00;
// else
// led_switch <= led_switch;
end
else
led_switch <= led_switch;
end
// 按键控制 LED 状态
always @(posedge clk or negedge rst) begin
if(!rst)
led[3:0] <= 4'b0000;
else begin
if(key[0] == 0) begin // KEY1:自右向左流水灯
case(led_switch)
2'b00: led[3:0] <= 4'b1000;
2'b01: led[3:0] <= 4'b0100;
2'b10: led[3:0] <= 4'b0010;
2'b11: led[3:0] <= 4'b0001;
default:led[3:0] <= 4'b0000;
endcase
end
else if(key[1] == 0) begin // KEY2:自左向右流水灯
case(led_switch)
2'b00: led[3:0] <= 4'b0001;
2'b01: led[3:0] <= 4'b0010;
2'b10: led[3:0] <= 4'b0100;
2'b11: led[3:0] <= 4'b1000;
default:led[3:0] <= 4'b0000;
endcase
end
else if(key[2] == 0) begin // KEY3:四灯同时闪烁
case(led_switch)
2'b00: led[3:0] <= 4'b1111;
2'b01: led[3:0] <= 4'b0000;
2'b10: led[3:0] <= 4'b1111;
2'b11: led[3:0] <= 4'b0000;
default:led[3:0] <= 4'b0000;
endcase
end
else if(key[3] == 0) begin // KEY4:四灯全亮
led[3:0] <= 4'b1111;
end
else begin
led[3:0] <= 4'b0000; // 默认四灯全灭
end
end
end
endmodule
![key_led.mp4 (14.81MB)](/uploads/projects/zhj0125@fpga/7f2f55e32159afeaa752aaa4983cc03b.png)