1. 程式人生 > >用狀態機寫獨立按鍵的消抖

用狀態機寫獨立按鍵的消抖

HA lte stat BE class || == 組合 off

直接上代碼

//消抖
module    key_filter (

    input    wire        clk,          //E1
    input    wire        rst_n,       //KEY0 L3
    
    input    wire        ikey_n,        //配到了按鍵3 J6
    
    output    reg            okey_n  //配到了LED0  T12

);
    parameter    T_5ms    =    250_000;//50M時鐘,一個周期20ns,5ms就是250000個周期
    
//我們這裏認定高電平持續5ms算是按鍵真的按下了 localparam KEY_OFF = 4b0001; localparam ON_SHAKE = 4b0010; localparam KEY_ON = 4b0100; localparam OFF_SHAKE = 4b1000; reg [17:0] cnt; reg [3:0] c_state; reg [3:0] n_state;
reg [2:0] reg_syn; wire key_n; always@(posedge clk) reg_syn <= {reg_syn[1:0],ikey_n}; //這裏寄存了3個周期 assign key_n = reg_syn[2]; //狀態機:時序邏輯:描述狀態轉移 always@(posedge clk) begin if(rst_n == 0) c_state
<= KEY_OFF; else c_state <= n_state; end //狀態機:組合邏輯:描述下一個狀態 判斷狀態轉移條件,描述狀態轉移規律 always@(*) begin case (c_state) KEY_OFF : if(key_n) n_state = KEY_OFF; else n_state = ON_SHAKE; ON_SHAKE : if(key_n) n_state = KEY_OFF; else if(cnt < T_5ms - 1) //cnt計數達到5ms,就轉移到KEY_ON狀態 n_state = ON_SHAKE; //若達不到5ms,則認為還是處於抖動 else n_state = KEY_ON; KEY_ON : if(key_n == 0) n_state = KEY_ON; else n_state = OFF_SHAKE; OFF_SHAKE : if(key_n) if(cnt < T_5ms - 1) n_state = OFF_SHAKE; else n_state = KEY_OFF; else n_state = KEY_ON; endcase end //根據狀態做計數器 always@(posedge clk) begin if(rst_n == 0) cnt <= 0; else case (c_state) ON_SHAKE : if(key_n) cnt <= 0; else if (cnt >=T_5ms -1) cnt <= 0; else cnt <= cnt + 1b1; // if(key_n == 0 && cnt < T_5ms -1) // cnt <= cnt +1‘b1; //else //cnt <= 0; OFF_SHAKE : if(key_n == 0) cnt <= 0; else if (cnt >=T_5ms -1) cnt <= 0; else cnt <= cnt + 1b1; endcase end //狀態機:狀態輸出 always@(posedge clk)begin if(rst_n ==0) okey_n <= 1; else if(c_state == KEY_ON || c_state == OFF_SHAKE ) okey_n <= 0; else okey_n <=1; end endmodule

用狀態機寫獨立按鍵的消抖