module key_debounce ( input wire clk, //系统时钟 50MHz input wire rst_n, //复位信号 input wire key, //按键输入信号 output reg key_done //消抖之后的按键信号 ); reg key_r0; //同步信号(滤波作用,滤除小于一个周期的抖动) reg key_r1; //打拍 reg flag; //标志位 wire nedge; //下降沿检测(检测到下降沿代表开始抖动) //计时器定义 reg [19:0] cnt; wire add_cnt; //计时器开启 wire end_cnt; //计时记满 parameter MAX_CNT=23'd200000; //20ms延时 //同步 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin key_r0<=1'b1; end else key_r0<=key; end //打拍 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin key_r1<=1'b1; end else key_r1<=key_r0; end assign nedge = ~key_r0 & key_r1; //检测到下降沿拉高 //标志位 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin flag<=1'b0; end else if (nedge) begin flag<=1'b1; end else if (end_cnt) begin flag<=1'b0; end end //延时模块 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin cnt<=20'b0; end else if (add_cnt) begin if (end_cnt) begin cnt<=20'b0; end else cnt<=cnt+1; end end assign add_cnt=flag; //计时器开启 assign end_cnt=add_cnt&&cnt==MAX_CNT-1; //计时器关闭 //key_done输出 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin key_done<=1'b0; end else if (end_cnt) begin //延时满20ms采样 key_done<=~key_r0; end else key_done<=1'b0; end endmodule //key_debounce
时间: 2024-02-15 15:27:30 浏览: 117
debounce_按键消抖_源码
这是一个Verilog代码实现的按键消抖模块,主要功能是对输入的按键信号进行消抖处理,输出消抖之后的按键信号。下面是对该代码的一些解释和说明:
1. 该模块使用时钟信号clk和复位信号rst_n进行同步,其中rst_n为低电平有效,用于初始化寄存器。
2. key_r0寄存器用于滤波作用,滤除小于一个周期的抖动。key_r1寄存器用于打拍,即记录上一次按键的状态。
3. flag标志位用于表示是否检测到按键的下降沿,如果检测到,则打开标志位,表示开始进行计时。
4. 计时器模块用于延时20ms,即消抖时间,达到一定的时间后,才会输出消抖之后的按键信号。
5. 最后的key_done输出信号表示消抖之后的按键信号,如果检测到按键的下降沿,则开始进行消抖,否则输出低电平。
注:该代码需要在实际硬件环境中进行测试和验证,具体的电路实现和参数配置需要根据实际情况进行调整。
阅读全文