按键消抖电路设计

用Verilog实现按键抖动消除电路,抖动小于15ms,输入时钟 12MHz

设计思路:
使用计数器,计算按键时间,如果大于15ms,则认为是有效信号,若小于15ms,则认为是无效信号

12MHz 1 clk =83ns 15ms/83ns =180722 = 0x2C1F2

module rebounce(
input clk,
input rst_n,
input key_in,
output key_out
);
reg key_out;
reg key_in_dly;
reg [19:0] cnt;
wire change;
parameter jitter = 20'h2C1F2;
// 检测key信号变化,使用原信号+dly
always @(posedge clk or negedge rst_n)
if(!rst_n) key_in_dly <= 0;
else key_in_dly <= key_in;

assign change = (key_in & !key_in_dly)|(!key_in & key_in_dly);

// 当没有变化时,计数器才工作,否则复位重新计数
always @(posedge clk or negedge rst_n)
if(!rst_n) cnt <= 20'h0;
else if(change) cnt <= 20'h0;
else cnt <= cnt + 1;
//  输出判断
always @(posedge clk or negedge rst_n)
// key_out = 1 为 未按下
if(!rst_n) key_out <= 1;
else if(cnt == 20'h2C1F2 - 1) key_out <= key_in;
else key_out <= key_out;
endmodule

猜你喜欢

转载自blog.csdn.net/weixin_43194246/article/details/108594893