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 秒鐘,那麼如果簡單地 以時鐘的上公升沿來檢測按鍵,程式就會認為實際一共按了十下按鍵。我...