From 46e2f6b37c17200500f2a114590ad540bcc3c0e5 Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Sun, 31 Oct 2021 12:25:15 -0700 Subject: Really simple switch debounce. --- hdl/panel.sv | 93 +++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 57 insertions(+), 36 deletions(-) (limited to 'hdl/panel.sv') diff --git a/hdl/panel.sv b/hdl/panel.sv index 5d47484..2e36974 100644 --- a/hdl/panel.sv +++ b/hdl/panel.sv @@ -1,6 +1,8 @@ `include "util.svh" module panel + #( DEBOUNCE_MAX = 100 + ) ( input bit clk , input bit reset @@ -12,6 +14,8 @@ module panel , inout wire [40:31] gpioc ); +localparam DEBOUNCE_BITS = $clog2(DEBOUNCE_MAX+1); + enum { LED_ROW1 , DEAD_ROW2 @@ -35,6 +39,9 @@ enum , SWITCH_ROW3 } state; +bit [3:1][12:1] switch_raw; +bit [DEBOUNCE_BITS-1:0] switch_debounce; + `define LEDROW1 gpioc[38] `define LEDROW2 gpioc[40] `define LEDROW3 gpiob[15] @@ -82,8 +89,12 @@ always_ff @(posedge clk) begin if (reset) begin switch = 0; + switch_raw = 0; + switch_debounce = 0; state = state.first; end else begin + automatic bit [3:1][12:1] new_switch = switch_raw; + case (state) `ifdef DO_LEDS `define LED_ROW(n) \ @@ -134,50 +145,50 @@ always_ff @(posedge clk) begin SWITCH_ROW1: begin `SWROW2 = 1'b0; - switch[1][1] = ~`COL1; - switch[1][2] = ~`COL2; - switch[1][3] = ~`COL3; - switch[1][4] = ~`COL4; - switch[1][5] = ~`COL5; - switch[1][6] = ~`COL6; - switch[1][7] = ~`COL7; - switch[1][8] = ~`COL8; - switch[1][9] = ~`COL9; - switch[1][10] = ~`COL10; - switch[1][11] = ~`COL11; - switch[1][12] = ~`COL12; + new_switch[1][1] = ~`COL1; + new_switch[1][2] = ~`COL2; + new_switch[1][3] = ~`COL3; + new_switch[1][4] = ~`COL4; + new_switch[1][5] = ~`COL5; + new_switch[1][6] = ~`COL6; + new_switch[1][7] = ~`COL7; + new_switch[1][8] = ~`COL8; + new_switch[1][9] = ~`COL9; + new_switch[1][10] = ~`COL10; + new_switch[1][11] = ~`COL11; + new_switch[1][12] = ~`COL12; end SWITCH_ROW2: begin `SWROW3 = 1'b0; - switch[2][1] = ~`COL1; - switch[2][2] = ~`COL2; - switch[2][3] = ~`COL3; - switch[2][4] = ~`COL4; - switch[2][5] = ~`COL5; - switch[2][6] = ~`COL6; - switch[2][7] = ~`COL7; - switch[2][8] = ~`COL8; - switch[2][9] = ~`COL9; - switch[2][10] = ~`COL10; - switch[2][11] = ~`COL11; - switch[2][12] = ~`COL12; + new_switch[2][1] = ~`COL1; + new_switch[2][2] = ~`COL2; + new_switch[2][3] = ~`COL3; + new_switch[2][4] = ~`COL4; + new_switch[2][5] = ~`COL5; + new_switch[2][6] = ~`COL6; + new_switch[2][7] = ~`COL7; + new_switch[2][8] = ~`COL8; + new_switch[2][9] = ~`COL9; + new_switch[2][10] = ~`COL10; + new_switch[2][11] = ~`COL11; + new_switch[2][12] = ~`COL12; end SWITCH_ROW3: begin - switch[3][1] = ~`COL1; - switch[3][2] = ~`COL2; - switch[3][3] = ~`COL3; - switch[3][4] = ~`COL4; - switch[3][5] = ~`COL5; - switch[3][6] = ~`COL6; - switch[3][7] = ~`COL7; - switch[3][8] = ~`COL8; - switch[3][9] = ~`COL9; - switch[3][10] = ~`COL10; - switch[3][11] = ~`COL11; - switch[3][12] = ~`COL12; + new_switch[3][1] = ~`COL1; + new_switch[3][2] = ~`COL2; + new_switch[3][3] = ~`COL3; + new_switch[3][4] = ~`COL4; + new_switch[3][5] = ~`COL5; + new_switch[3][6] = ~`COL6; + new_switch[3][7] = ~`COL7; + new_switch[3][8] = ~`COL8; + new_switch[3][9] = ~`COL9; + new_switch[3][10] = ~`COL10; + new_switch[3][11] = ~`COL11; + new_switch[3][12] = ~`COL12; end `endif endcase @@ -186,6 +197,16 @@ always_ff @(posedge clk) begin state = state.first; else state = state.next; + + if (new_switch == switch_raw) begin + if (switch_debounce == 0) + switch = switch_raw; + else + --switch_debounce; + end else begin + switch_raw = new_switch; + switch_debounce = DEBOUNCE_MAX; + end end end -- cgit v1.2.3