用狀態機寫獨立按鍵的消抖
阿新 • • 發佈:2018-06-13
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 = 4‘b0001; localparam ON_SHAKE = 4‘b0010; localparam KEY_ON = 4‘b0100; localparam OFF_SHAKE = 4‘b1000; 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 + 1‘b1; // 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 + 1‘b1; 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
用狀態機寫獨立按鍵的消抖