FPGA學習筆記-按鍵消抖
????????按鍵按下到穩(wěn)定之前有一定時間的抖動若不消除這部分抖動容易導致按鍵不靈敏。

????? ? 抖動時間的長短由按鍵的機械特性決定因此需要通過延時的方法來消抖只在中間穩(wěn)定的某一時刻取一個使能值就可以很好的去抖。

????????實現(xiàn)在按鍵按下的10ms左右取一個尖峰信號作為按鍵按下的標準就可以消除抖動,舉例使用按鍵控制一個led燈的亮滅。
//代碼實現(xiàn)
`timescale 1ns / 1ps
module key(
? ? input sysclk,
? ? input rst_n,
? ? input key,
? ? output reg led
? ? );
? ??
? ? parameter data=50_000_0;//芯片晶振10毫秒需要的次數(shù)
? ? reg [18:0] cnt;//計時器
? ? wire key_flag;//尖峰信號
?
?//按鍵按下10毫秒計時器
? ? always@(posedge sysclk or negedge rst_n)
? ? ? ? begin
? ? ? ? ? ? if (!rst_n)
? ? ? ? ? ? ? ? cnt<=0;
? ? ? ? ? ? else if (key == 0)//按鍵按下的時候
? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? if (cnt == data-1)//計滿10毫秒之后保持
? ? ? ? ? ? ? ? ? ? ? ? cnt<=cnt;
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? cnt=cnt+1;
? ? ? ? ? ? ? ? end
? ? ? ? ? ? else
? ? ? ? ? ? ? ? cnt<=0;
? ? ? ? end
? ? ? ??
//取穩(wěn)定時候的尖峰信號
? ? assign key_flag = (cnt == data-2)?1:0;//三目運算符
? ??
//當按鍵按下的尖峰信號為1的時候led燈取反
? ? always@(posedge sysclk or negedge rst_n)
? ? ? ? begin
? ? ? ? ? ? if (!rst_n)
? ? ? ? ? ? ? ? led<=0;
? ? ? ? ? ? else if (key_flag)
? ? ? ? ? ? ? ? led<=~led;
? ? ? ? ? ? else
? ? ? ? ? ? ? ? led<=led;
? ? ? ? end
? ? ? ??
endmodule