FPGA按鍵防抖動程式 Verilog

2021-06-01 10:15:28 字數 1538 閱讀 4362

module fangdoudong( clk,reset,key_in_1,key_in_2,key_in_3,led_1,led_2,led_3 );

input clk ;  //50mhz

input reset;  //高電平有效

input  key_in_1,key_in_2,key_in_3;   //開關key_in_1 對應led_1,以此類推

output reg led_1,led_2,led_3 ;     //高電平時,led亮

reg [2:0] flag,key_1,key_2 ;  //flag代表標誌位,key_1代表當前按鍵的狀態,key_2儲存key_1的狀態

reg [19:0] count ;      //計數功能,延時20ms

always @(posedge clk)   //reset低電平時,復位

begin

if ( reset == 0 )

begin

flag <= 3'b000;

count <= 3'b000;

led_1 <= 0;

led_2 <= 0;

led_3 <= 0;

key_1 <= 0;

key_2 <= 0;

endend

always @(posedge clk)   //key_1代表當前按鍵的狀態

begin

if ( reset == 1 )

key_1 <= ;

endalways @(posedge clk)   //key_2儲存key_1的狀態

begin

if ( reset == 1 )

key_2 <= key_1 ;

endalways @(posedge clk)

begin

if ( reset == 1 )

begin

flag <= key_1 ^ key_2;  //key_2與key_1的值不同,說明按鍵按下或是處於開關抖動狀態,立即開始計時

if ( flag  )

begin

count <= count + 1 ;

if ( count == 20'hfffff )   //計時滿,立即用開關的穩定狀態驅動led

led_1 <= key_in_1 ;

led_2 <= key_in_2;

led_3 <= key_in_3;

endif ( flag == 0 && count != 0 )    //在判斷key_2與key_1的值是否相同時。若處在抖動期很可能相同,使flag=0,

但是也要繼續計數,以滿足延時20ms的目的

begin

count <= count + 1 ;

if ( count == 20'hfffff )

led_1 <= key_in_1 ;

led_2 <= key_in_2;

led_3 <= key_in_3;

endend

end          

endmodule

按鍵防抖動程式

第乙個防抖動程式 key2.v module key2 input clk,rst,key,output led 分頻器 開始 reg 17 0 cout always posedge clk if rst cout 0 else cout cout 1 b1 wire clk 5ms cout 相...

fpga 鍵盤防抖動模組設計

module pushbutton debouncer clk,pb,pb state,pb up,pb down,rest input clk clk 時鐘訊號 input pb pb 有毛刺的 非同步的 低有效的按鍵訊號 input rest output pb state 當按鍵被按下時輸出1...

實驗六 按鍵防抖動實驗

若要使用開發板上面的四個sw按鍵來做計數輸入,就需要知道一共按了幾下按鍵。在這種情況下不能像以前設計電路中,簡單地使用輸入時鐘的上公升沿來檢測按鍵是否按 下。因為,如果分頻以後的時鐘頻率是10hz,按鍵一下按了1 秒鐘,那麼如果簡單地 以時鐘的上公升沿來檢測按鍵,程式就會認為實際一共按了十下按鍵。我...