summaryrefslogtreecommitdiff
path: root/hdl/panel.sv
diff options
context:
space:
mode:
Diffstat (limited to 'hdl/panel.sv')
-rw-r--r--hdl/panel.sv93
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
3module panel 3module 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
17localparam DEBOUNCE_BITS = $clog2(DEBOUNCE_MAX+1);
18
15enum 19enum
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
42bit [3:1][12:1] switch_raw;
43bit [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
190end 211end
191 212