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 +++++++++++++++++++++++++++++++++++++----------------------- hdl/top.sv | 4 +-- 2 files changed, 59 insertions(+), 38 deletions(-) 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 diff --git a/hdl/top.sv b/hdl/top.sv index 4af7ad4..214ea1b 100644 --- a/hdl/top.sv +++ b/hdl/top.sv @@ -106,8 +106,8 @@ assign led[3] = {led_memdata[0], led_memdata[1], led_memdata[2], led_memdata[3], assign led[4] = {led_acc[0], led_acc[1], led_acc[2], led_acc[3], led_acc[4], led_acc[5], led_acc[6], led_acc[7], led_acc[8], led_acc[9], led_acc[10], led_acc[11]}; assign led[5] = {led_mq[0], led_mq[1], led_mq[2], led_mq[3], led_mq[4], led_mq[5], led_mq[6], led_mq[7], led_mq[8], led_mq[9], led_mq[10], led_mq[11]}; assign led[6] = {led_word_count, led_defer, led_execute, led_fetch, led_opr, led_iot, led_jmp, led_jms, led_dca, led_isz, led_tad, led_and}; -assign led[7] = {led_step_counter, led_run, led_pause, led_ion, led_break, led_current_address}; -assign led[8] = {led_link, led_if, led_df}; +assign led[7] = {2'b0, led_step_counter, led_run, led_pause, led_ion, led_break, led_current_address}; +assign led[8] = {5'b0, led_link, led_if, led_df}; core cpu ( .clk(clk) -- cgit v1.2.3