1. 按键KEY0短按(按键消抖模块)
//--------------------------------
// key_debounce:按键消抖模块
// 输入:
// clk: 系统时钟
// rst_n: 系统复位
// key: 按键状态输入
// 输出:
// key_flag: 按键是否被按下标志位
// key_value: 按键被按下后的值(为0)
//--------------------------------
module key_debounce(
input clk,
input rst_n,
input key,
output reg key_flag,
output reg key_value
);
reg key_buf; // 暂存按键值
reg [19:0] counter; // 20ms-20bit
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
key_buf <= 1'b1;
counter <= 20'd0;
end
else begin
key_buf <= key;
if(key_buf != key) // 电平发生了变化,可能有按键被按下
counter <= 20'd1000_000;
else if(key_buf == key) // 电平处在保持状态时,计时20ms
if(counter > 20'd0)
counter <= counter - 1'd1;
else
counter <= counter;
else
counter <= counter;
end
end
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
key_flag <= 1'b0;
key_value <= 1'b1;
end
else begin
if(counter == 20'd1) begin // 电平状态保持了20ms,可以采样了
key_flag <= 1'b1;
key_value <= key;
end
else begin // 电平正在保持状态或者说还未保持20ms
key_flag <= 1'b0;
key_value <= key_value;
end
end
end
endmodule