1、按键消抖原理图
2、代码编写
module key_debounce(
input sys_clk,
input sys_rst_n,
input key,
output reg key_filter
);
//parameter define
parameter CNT_MAX = 20'd100_0000; //消抖时间 20ms
//reg define
reg [19:0] cnt ;
reg key_d0; //将按键信号延迟一个时钟周期
reg key_d1; //将按键信号延迟两个时钟周期
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n) begin
key_d0 <= 1'b1;
key_d1 <= 1'b1;
end
else begin
key_d0 <= key;
key_d1 <= key_d0;
end
end
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n) begin
cnt <= CNT_MAX;
end
else if (key_d0 != key_d1) begin
cnt <= CNT_MAX;
end
else begin
if(cnt > 20'd0) begin
cnt <= cnt -1'd1;
end
else begin
cnt <= 20'd0;
end
end
end
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n) begin
key_filter <= 1'b1;
end
else if (cnt == 20'd0) begin
key_filter <= key_d1;
end
else begin
key_filter <= key_filter;
end
end
endmodule