按键消抖实现(verilog)

按键消抖

按键是FPGA实验工程中常见的电子元器件,通常用作系统复位信号或者控制。外部信号的输入。按键消抖主要针对的是机械弹性开关(按下去,一旦松开就会弹上去),当机械触点断开、闭合时,由于机械触点的弹性作用,按键开关在闭合时不会立刻稳定的接通,在断开时也不会一下子断开。按键在闭合和断开的瞬间会有一连串的抖动,为了保证系统能够正确识别按键开关,必须进行消抖处理。
按键消抖分为硬件消抖和软件消抖,硬件消抖会使用额外的器件,占用空间,增加布局布线复杂度。这里讲的是软件消抖,适用于按键比较多的情况。

verilog实现消抖

主要是通过一个延时计数器,当在某个延时时间内按键没有发生抖动此时可以认为按键稳定,可以输出。

这里假定按键的默认状态为0,被按下后为1。
按键抖动时长小于20ms,也即使用20ms的消抖时间

实现代码如下

module debounce(
    input           clk,//12Mhz
    input           rst_n,
    input           key_in,
    output          key_flag
);
parameter   JITTER  =   240;//12Mhz / (1/20ms)
reg   [1:0]     key_r;
wire             change;
reg   [15:0]    delay_cnt;
always @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        key_r <= 0;
    end
    else begin
        key_r <= {key_r[0],key_in};
    end
end
assign  change = (~key_r[1] & key_r[0]) | (key_r[1] & ~key_r[0]);
always @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        delay_cnt <= 0;
    end
    else if(change == 1'b1)
        delay_cnt <= 0;
    else if(delay_cnt == JITTER)
        delay_cnt <= delay_cnt;
    else 
        delay_cnt <= delay_cnt + 1;
end
assign  key_flag = ((delay_cnt == JITTER - 1) && (key_in == 1'b1))? 1'b1: 
1'b0;
endmodule
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
按键消抖是指在按键输入时,由于机械原因,会出现瞬间接通和断开的现象,这可能会导致系统误判按键输入。因此,在数字电路中,需要对按键信号进行消抖处理,以确保稳定地检测按键输入。 以下是一种基于 Verilog按键消抖实现方式: ```verilog module button_debounce ( input wire button, // 输入按键信号 output reg debounced_button // 输出去抖后的按键信号 ); // 定义状态枚举类型 typedef enum logic [1:0] { IDLE, // 空闲状态 PRESS_CHECK, // 按键按下检测状态 RELEASE_CHECK // 按键释放检测状态 } state_t; // 定义状态寄存器和计数器 reg [1:0] state = IDLE; reg [15:0] count = 0; // 状态机 always @(posedge button) begin case(state) IDLE: begin debounced_button <= 0; // 输出低电平 if (button == 1'b1) begin count <= 0; // 计数器清零 state <= PRESS_CHECK; // 进入按键按下检测状态 end end PRESS_CHECK: begin if (button == 1'b0) begin state <= IDLE; // 按键未按下,返回空闲状态 end else if (count == 16'd9999) begin debounced_button <= 1; // 按键按下稳定,输出高电平 count <= 0; // 计数器清零 state <= RELEASE_CHECK; // 进入按键释放检测状态 end else begin count <= count + 1; // 计数器累加 end end RELEASE_CHECK: begin if (button == 1'b1) begin state <= IDLE; // 按键未释放,返回空闲状态 end else if (count == 16'd9999) begin debounced_button <= 0; // 按键释放稳定,输出低电平 count <= 0; // 计数器清零 state <= PRESS_CHECK; // 进入按键按下检测状态 end else begin count <= count + 1; // 计数器累加 end end endcase end endmodule ``` 该实现方式采用状态机的方式,将按键消抖分为三个状态:空闲状态、按键按下检测状态和按键释放检测状态。在每个状态下,都会根据输入的按键信号进行相应的操作,同时使用计数器来进行稳定时间的计算。当计数器达到一定的值时,认为按键信号稳定,输出消抖后的按键信号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值