生性愚鈍,現在才終於明白fpga的按鍵消抖原理。
先貼一段別人的**:
dule key_debounce(sys_clk ,
sys_rstn ,
key_in ,
led_out
);//輸入輸出訊號
input sys_clk ;
input sys_rstn ;
input key_in ;
output led_out ;
//暫存器定義
reg led_out ;
reg [19:0] delay_cnt ;
wire key_scan ;
wire key_low ;
reg key_samp ;
reg key_samp_r ;
reg key_rst ;
reg key_rst_r ;
//邏輯部分
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
key_samp<=1'b1;
else
key_samp<=key_in;
endalways@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
key_samp_r<=1'b1;
else
key_samp_r<=key_samp;
endassign key_scan=key_samp_r&(~key_samp);
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
delay_cnt<=20'h0;
else if(key_scan)
delay_cnt<=20'h0;
else
delay_cnt<=delay_cnt+1'b1;
endalways@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
key_rst<=1'b1;
else if(delay_cnt==20'hfffff)
key_rst<=key_in;
endalways@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
key_rst_r<=1'b1;
else
key_rst_r<=key_rst;
endassign key_low=key_rst_r&(~key_rst);
//always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
led_out<=1'b1;
else if(key_low)
led_out<=~led_out;
else
led_out<=led_out;
endendmodule
fpga的按鍵消抖,就是用脈衝邊沿檢測法,若有下降沿,則產生乙個週期的高電平;然後這個高電平再去清零20ms的計數器;同時在這20ms期間,不對key進行取樣,所以key不管是這一週期還是上一週期都是1;當20ms過去後開始取樣,若按下,則key = 0,而前一週期key = 1,利用邊沿檢測,得到乙個週期的高電平訊號,進行按鍵程式。
邊沿檢測 = 上一週期 & (~本週期) 下降沿檢測
邊沿檢測
= (~上一週期)& 本週期 上公升沿檢測
over
FPGA學習筆記(二) 按鍵LED
無按鍵按下時,全滅 按鍵1按下時,自右向左的流水效果 按鍵2按下時,自左向右的流水效果 按鍵3按下時,閃爍 按鍵4按下時,全亮 file name my key led last modified date 2020 6 10 22 30 last version v1.1 descriptions...
FPGA學習筆記 正點原子FPGA按鍵消抖筆記
出自正點原子 開拓者fpga開發指南v1.3 第九章按鍵控制蜂鳴器實驗 暫存器 key flag 按鍵資料有效訊號 暫存器 key value 按鍵消抖後的資料 暫存器 delay cnt 延時計數 系統時鐘 50mhz 思路 一直檢測按鍵狀態,一旦按鍵狀態發現變化,給delay cnt計數器賦初值...
FPGA 按鍵消抖
今天簡單的說說按鍵消抖,原理特別好理解,其實就是延時,做一定時間的延時後取值一次,就能夠得到特定的消抖後的狀態了。為什麼要消抖?見圖 我們可以看到,但按鍵按下的那一刻,存在一段時間的抖動,同時在釋放按鍵的一段時間裡也是存在抖動的,這就可能導致狀態在識別的時候可能檢測為多次的按鍵,因為執行過程中普通的...