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-20bitalways @(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; endendalways @(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 endendendmodule