module key_led(clk,rst_n,key_in,led_out);
input clk; //50M
input rst_n;
input [3:0] key_in;
output [3:0] led_out;
reg [19:0] count;
reg [3:0] key_scan; //按键扫描值
always @(posedge clk or negedge rst_n) //采样按键值,采样频率小于按键毛刺频率,相当于滤除掉了高频毛刺信号。
begin
if(!rst_n)
begin
count <= 20'b0;
end
else
begin
if(count ==20'b1111_0100_0010_0100_0000) //20ms扫描一次按键
begin
count <= 20'b0;
key_scan <= key_in;
end
else
begin
count <= count+20'b1;
end
end
end
reg [3:0] key_scan_r;
always @(posedge clk)
key_scan_r <= key_scan;
wire [3:0] flag_key = key_scan_r[3:0] & (~key_scan[3:0]); //当检测到按键有下降沿变化时,代表该按键被按下,按键有效
reg [3:0] temp_led;
always @ (posedge clk or negedge rst_n)
if (!rst_n)
begin
temp_led <= 4'b0000;
end
else
begin
if ( flag_key[0] ) temp_led[0] <= ~temp_led[0]; //某个按键值变化时,LED将做亮灭翻转
if ( flag_key[1] ) temp_led[1] <= ~temp_led[1];
if ( flag_key[2] ) temp_led[2] <= ~temp_led[2];
if ( flag_key[3] ) temp_led[3] <= ~temp_led[3];
end
assign led_out[0] = temp_led[0] ? 1'b0 : 1'b1; //LED翻转输出
assign led_out[1] = temp_led[1] ? 1'b0 : 1'b1;
assign led_out[2] = temp_led[2] ? 1'b0 : 1'b1;
assign led_out[3] = temp_led[3] ? 1'b0 : 1'b1;
endmodule