diff options
Diffstat (limited to 'hdl/panel.sv')
| -rw-r--r-- | hdl/panel.sv | 93 |
1 files changed, 57 insertions, 36 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 @@ | |||
| 1 | `include "util.svh" | 1 | `include "util.svh" |
| 2 | 2 | ||
| 3 | module panel | 3 | module panel |
| 4 | #( DEBOUNCE_MAX = 100 | ||
| 5 | ) | ||
| 4 | ( input bit clk | 6 | ( input bit clk |
| 5 | , input bit reset | 7 | , input bit reset |
| 6 | 8 | ||
| @@ -12,6 +14,8 @@ module panel | |||
| 12 | , inout wire [40:31] gpioc | 14 | , inout wire [40:31] gpioc |
| 13 | ); | 15 | ); |
| 14 | 16 | ||
| 17 | localparam DEBOUNCE_BITS = $clog2(DEBOUNCE_MAX+1); | ||
| 18 | |||
| 15 | enum | 19 | enum |
| 16 | { LED_ROW1 | 20 | { LED_ROW1 |
| 17 | , DEAD_ROW2 | 21 | , DEAD_ROW2 |
| @@ -35,6 +39,9 @@ enum | |||
| 35 | , SWITCH_ROW3 | 39 | , SWITCH_ROW3 |
| 36 | } state; | 40 | } state; |
| 37 | 41 | ||
| 42 | bit [3:1][12:1] switch_raw; | ||
| 43 | bit [DEBOUNCE_BITS-1:0] switch_debounce; | ||
| 44 | |||
| 38 | `define LEDROW1 gpioc[38] | 45 | `define LEDROW1 gpioc[38] |
| 39 | `define LEDROW2 gpioc[40] | 46 | `define LEDROW2 gpioc[40] |
| 40 | `define LEDROW3 gpiob[15] | 47 | `define LEDROW3 gpiob[15] |
| @@ -82,8 +89,12 @@ always_ff @(posedge clk) begin | |||
| 82 | 89 | ||
| 83 | if (reset) begin | 90 | if (reset) begin |
| 84 | switch = 0; | 91 | switch = 0; |
| 92 | switch_raw = 0; | ||
| 93 | switch_debounce = 0; | ||
| 85 | state = state.first; | 94 | state = state.first; |
| 86 | end else begin | 95 | end else begin |
| 96 | automatic bit [3:1][12:1] new_switch = switch_raw; | ||
| 97 | |||
| 87 | case (state) | 98 | case (state) |
| 88 | `ifdef DO_LEDS | 99 | `ifdef DO_LEDS |
| 89 | `define LED_ROW(n) \ | 100 | `define LED_ROW(n) \ |
| @@ -134,50 +145,50 @@ always_ff @(posedge clk) begin | |||
| 134 | SWITCH_ROW1: begin | 145 | SWITCH_ROW1: begin |
| 135 | `SWROW2 = 1'b0; | 146 | `SWROW2 = 1'b0; |
| 136 | 147 | ||
| 137 | switch[1][1] = ~`COL1; | 148 | new_switch[1][1] = ~`COL1; |
| 138 | switch[1][2] = ~`COL2; | 149 | new_switch[1][2] = ~`COL2; |
| 139 | switch[1][3] = ~`COL3; | 150 | new_switch[1][3] = ~`COL3; |
| 140 | switch[1][4] = ~`COL4; | 151 | new_switch[1][4] = ~`COL4; |
| 141 | switch[1][5] = ~`COL5; | 152 | new_switch[1][5] = ~`COL5; |
| 142 | switch[1][6] = ~`COL6; | 153 | new_switch[1][6] = ~`COL6; |
| 143 | switch[1][7] = ~`COL7; | 154 | new_switch[1][7] = ~`COL7; |
| 144 | switch[1][8] = ~`COL8; | 155 | new_switch[1][8] = ~`COL8; |
| 145 | switch[1][9] = ~`COL9; | 156 | new_switch[1][9] = ~`COL9; |
| 146 | switch[1][10] = ~`COL10; | 157 | new_switch[1][10] = ~`COL10; |
| 147 | switch[1][11] = ~`COL11; | 158 | new_switch[1][11] = ~`COL11; |
| 148 | switch[1][12] = ~`COL12; | 159 | new_switch[1][12] = ~`COL12; |
| 149 | end | 160 | end |
| 150 | 161 | ||
| 151 | SWITCH_ROW2: begin | 162 | SWITCH_ROW2: begin |
| 152 | `SWROW3 = 1'b0; | 163 | `SWROW3 = 1'b0; |
| 153 | 164 | ||
| 154 | switch[2][1] = ~`COL1; | 165 | new_switch[2][1] = ~`COL1; |
| 155 | switch[2][2] = ~`COL2; | 166 | new_switch[2][2] = ~`COL2; |
| 156 | switch[2][3] = ~`COL3; | 167 | new_switch[2][3] = ~`COL3; |
| 157 | switch[2][4] = ~`COL4; | 168 | new_switch[2][4] = ~`COL4; |
| 158 | switch[2][5] = ~`COL5; | 169 | new_switch[2][5] = ~`COL5; |
| 159 | switch[2][6] = ~`COL6; | 170 | new_switch[2][6] = ~`COL6; |
| 160 | switch[2][7] = ~`COL7; | 171 | new_switch[2][7] = ~`COL7; |
| 161 | switch[2][8] = ~`COL8; | 172 | new_switch[2][8] = ~`COL8; |
| 162 | switch[2][9] = ~`COL9; | 173 | new_switch[2][9] = ~`COL9; |
| 163 | switch[2][10] = ~`COL10; | 174 | new_switch[2][10] = ~`COL10; |
| 164 | switch[2][11] = ~`COL11; | 175 | new_switch[2][11] = ~`COL11; |
| 165 | switch[2][12] = ~`COL12; | 176 | new_switch[2][12] = ~`COL12; |
| 166 | end | 177 | end |
| 167 | 178 | ||
| 168 | SWITCH_ROW3: begin | 179 | SWITCH_ROW3: begin |
| 169 | switch[3][1] = ~`COL1; | 180 | new_switch[3][1] = ~`COL1; |
| 170 | switch[3][2] = ~`COL2; | 181 | new_switch[3][2] = ~`COL2; |
| 171 | switch[3][3] = ~`COL3; | 182 | new_switch[3][3] = ~`COL3; |
| 172 | switch[3][4] = ~`COL4; | 183 | new_switch[3][4] = ~`COL4; |
| 173 | switch[3][5] = ~`COL5; | 184 | new_switch[3][5] = ~`COL5; |
| 174 | switch[3][6] = ~`COL6; | 185 | new_switch[3][6] = ~`COL6; |
| 175 | switch[3][7] = ~`COL7; | 186 | new_switch[3][7] = ~`COL7; |
| 176 | switch[3][8] = ~`COL8; | 187 | new_switch[3][8] = ~`COL8; |
| 177 | switch[3][9] = ~`COL9; | 188 | new_switch[3][9] = ~`COL9; |
| 178 | switch[3][10] = ~`COL10; | 189 | new_switch[3][10] = ~`COL10; |
| 179 | switch[3][11] = ~`COL11; | 190 | new_switch[3][11] = ~`COL11; |
| 180 | switch[3][12] = ~`COL12; | 191 | new_switch[3][12] = ~`COL12; |
| 181 | end | 192 | end |
| 182 | `endif | 193 | `endif |
| 183 | endcase | 194 | endcase |
| @@ -186,6 +197,16 @@ always_ff @(posedge clk) begin | |||
| 186 | state = state.first; | 197 | state = state.first; |
| 187 | else | 198 | else |
| 188 | state = state.next; | 199 | state = state.next; |
| 200 | |||
| 201 | if (new_switch == switch_raw) begin | ||
| 202 | if (switch_debounce == 0) | ||
| 203 | switch = switch_raw; | ||
| 204 | else | ||
| 205 | --switch_debounce; | ||
| 206 | end else begin | ||
| 207 | switch_raw = new_switch; | ||
| 208 | switch_debounce = DEBOUNCE_MAX; | ||
| 209 | end | ||
| 189 | end | 210 | end |
| 190 | end | 211 | end |
| 191 | 212 | ||
