按键抖动的原理
根据上面的原理描述,我们可以对按键的输入管脚进行边沿检测,当检测到输入信号变化后计数清零并开始计数,计数到20ms时进行采样,然后再对每次采样的值进行下降沿检测,检测的结果作为按键消抖的脉冲输出,然后每次检测到下降沿时让状态输出进行翻转并输出。
如上图所示,我们首先进行边沿检测,边沿检测的方法是定义一个寄存器对输入信号进行锁存,然后将寄存器的数据与下一个时刻的输入信号做对比,如果两者不相等则认为输入信号在这个时间段发生了变化,产生了边沿,key_an产生高电平的脉冲。
reg key_rst; //Register key_rst, lock key1_n to next clk always @(posedge clk or negedge rst_n) if (!rst_n) key_rst <= 1'b1; else key_rst <=key1_n; //Detect the edge of key1_n wire key_an = (key_rst==key1_n)? 0:1;
当key_an产生脉冲时,计数器cnt清零并计数,因为我们要采集输入信号变化后20ms的状态值,系统时钟25MHz,计数器终值 = 25MHz/50 = 500000,所以计数器计数到500000时采样。
reg low_sw; //Lock the status to register low_sw when cnt count to 19'd500000 always @(posedge clk or negedge rst_n) if (!rst_n) low_sw <= 1'b1; else if (cnt == 19'd500000) low_sw <= key1_n;
然后对将采样寄存器lowsw的数据锁存至寄存器lowsw_r,然后检测下降沿(因为我们的硬件是按键时输出低电平,采用下降沿实时性更好一些)。
//Detect the negedge of low_sw, generate pulse assign key_pulse= low_sw_r & ( ~low_sw);
引脚分配如下:
管脚名称 | clk | rstn | keyn | keypulse |keystate | ||
---|---|---|---|---|---|
FPGA管脚 | C1 | A2 | B7 | A3 | A7 |
资源 | 数量 | 比例 | 说明 |
---|---|---|---|
LUTs | 16 | 3% | |
寄存器 | 23 | 1% | |
存储器 | 0 | 0% | |
IO管脚 | 5 | ||
时钟频率 | 25MHz |
文件名称 | 功能 |
---|---|
Debounce.v | 按键消抖 |