summaryrefslogtreecommitdiff
path: root/hdl/front_panel.sv
diff options
context:
space:
mode:
authorJulian Blake Kongslie2022-02-27 17:21:05 -0800
committerJulian Blake Kongslie2022-02-27 17:21:05 -0800
commit0553c4839c06011bd044f69b4913e5c793fdd2ec (patch)
treed11e69863532621fe1fa55cc7e8aa2a8cfa3b727 /hdl/front_panel.sv
downloadmultipdp8-0553c4839c06011bd044f69b4913e5c793fdd2ec.tar.xz
Initial commit.
Diffstat (limited to 'hdl/front_panel.sv')
-rw-r--r--hdl/front_panel.sv211
1 files changed, 211 insertions, 0 deletions
diff --git a/hdl/front_panel.sv b/hdl/front_panel.sv
new file mode 100644
index 0000000..52b4bdb
--- /dev/null
+++ b/hdl/front_panel.sv
@@ -0,0 +1,211 @@
1module front_panel
2 #( DEBOUNCE_MAX = 100
3 )
4 ( input bit clk
5 , input bit reset
6
7 , input bit [8:1][12:1] led
8 , output bit [3:1][12:1] switch
9
10 , inout wire [10:1] gpioa
11 , inout wire [28:13] gpiob
12 , inout wire [40:31] gpioc
13 );
14
15localparam DEBOUNCE_BITS = $clog2(DEBOUNCE_MAX+1);
16
17enum
18 { LED_ROW1
19 , DEAD_ROW2
20 , LED_ROW2
21 , DEAD_ROW3
22 , LED_ROW3
23 , DEAD_ROW4
24 , LED_ROW4
25 , DEAD_ROW5
26 , LED_ROW5
27 , DEAD_ROW6
28 , LED_ROW6
29 , DEAD_ROW7
30 , LED_ROW7
31 , DEAD_ROW8
32 , LED_ROW8
33 , DEAD_ROW9
34 , SWITCH_PREP
35 , SWITCH_ROW1
36 , SWITCH_ROW2
37 , SWITCH_ROW3
38 } state;
39
40bit [3:1][12:1] switch_raw;
41bit [DEBOUNCE_BITS-1:0] switch_debounce;
42
43`define LEDROW1 gpioc[38]
44`define LEDROW2 gpioc[40]
45`define LEDROW3 gpiob[15]
46`define LEDROW4 gpiob[16]
47`define LEDROW5 gpiob[18]
48`define LEDROW6 gpiob[22]
49`define LEDROW7 gpioc[37]
50`define LEDROW8 gpiob[13]
51
52`define SWROW1 gpioc[36]
53`define SWROW2 gpioa[1]
54`define SWROW3 gpioa[2]
55
56`define COL1 gpioa[8]
57`define COL2 gpioa[10]
58`define COL3 gpioa[7]
59`define COL4 gpiob[27]
60`define COL5 gpioc[31]
61`define COL6 gpiob[26]
62`define COL7 gpiob[24]
63`define COL8 gpiob[21]
64`define COL9 gpiob[19]
65`define COL10 gpiob[23]
66`define COL11 gpioc[32]
67`define COL12 gpioc[33]
68
69`define DO_LEDS
70`define DO_SWITCHES
71
72always_ff @(posedge clk) begin
73 // LED rows (active high)
74 `LEDROW1 = 1'b0;
75 `LEDROW2 = 1'b0;
76 `LEDROW3 = 1'b0;
77 `LEDROW4 = 1'b0;
78 `LEDROW5 = 1'b0;
79 `LEDROW6 = 1'b0;
80 `LEDROW7 = 1'b0;
81 `LEDROW8 = 1'b0;
82
83 // Switch rows (active low)
84 `SWROW1 = 1'b1;
85 `SWROW2 = 1'b1;
86 `SWROW3 = 1'b1;
87
88 if (reset) begin
89 switch = 0;
90 switch_raw = 0;
91 switch_debounce = 0;
92 state = state.first;
93 end else begin
94 automatic bit [3:1][12:1] new_switch = switch_raw;
95
96 case (state)
97`ifdef DO_LEDS
98`define LED_ROW(n) \
99 LED_ROW``n: begin \
100 `LEDROW``n = 1'b1; \
101 `COL1 = ~led[n][1]; \
102 `COL2 = ~led[n][2]; \
103 `COL3 = ~led[n][3]; \
104 `COL4 = ~led[n][4]; \
105 `COL5 = ~led[n][5]; \
106 `COL6 = ~led[n][6]; \
107 `COL7 = ~led[n][7]; \
108 `COL8 = ~led[n][8]; \
109 `COL9 = ~led[n][9]; \
110 `COL10 = ~led[n][10]; \
111 `COL11 = ~led[n][11]; \
112 `COL12 = ~led[n][12]; \
113 end
114
115 `LED_ROW(1)
116 `LED_ROW(2)
117 `LED_ROW(3)
118 `LED_ROW(4)
119 `LED_ROW(5)
120 `LED_ROW(6)
121 `LED_ROW(7)
122 `LED_ROW(8)
123`endif
124
125`ifdef DO_SWITCHES
126 SWITCH_PREP: begin
127 `SWROW1 = 1'b0;
128
129 `COL1 = 1'bZ;
130 `COL2 = 1'bZ;
131 `COL3 = 1'bZ;
132 `COL4 = 1'bZ;
133 `COL5 = 1'bZ;
134 `COL6 = 1'bZ;
135 `COL7 = 1'bZ;
136 `COL8 = 1'bZ;
137 `COL9 = 1'bZ;
138 `COL10 = 1'bZ;
139 `COL11 = 1'bZ;
140 `COL12 = 1'bZ;
141 end
142
143 SWITCH_ROW1: begin
144 `SWROW2 = 1'b0;
145
146 new_switch[1][1] = ~`COL1;
147 new_switch[1][2] = ~`COL2;
148 new_switch[1][3] = ~`COL3;
149 new_switch[1][4] = ~`COL4;
150 new_switch[1][5] = ~`COL5;
151 new_switch[1][6] = ~`COL6;
152 new_switch[1][7] = ~`COL7;
153 new_switch[1][8] = ~`COL8;
154 new_switch[1][9] = ~`COL9;
155 new_switch[1][10] = ~`COL10;
156 new_switch[1][11] = ~`COL11;
157 new_switch[1][12] = ~`COL12;
158 end
159
160 SWITCH_ROW2: begin
161 `SWROW3 = 1'b0;
162
163 new_switch[2][1] = ~`COL1;
164 new_switch[2][2] = ~`COL2;
165 new_switch[2][3] = ~`COL3;
166 new_switch[2][4] = ~`COL4;
167 new_switch[2][5] = ~`COL5;
168 new_switch[2][6] = ~`COL6;
169 new_switch[2][7] = ~`COL7;
170 new_switch[2][8] = ~`COL8;
171 new_switch[2][9] = ~`COL9;
172 new_switch[2][10] = ~`COL10;
173 new_switch[2][11] = ~`COL11;
174 new_switch[2][12] = ~`COL12;
175 end
176
177 SWITCH_ROW3: begin
178 new_switch[3][1] = ~`COL1;
179 new_switch[3][2] = ~`COL2;
180 new_switch[3][3] = ~`COL3;
181 new_switch[3][4] = ~`COL4;
182 new_switch[3][5] = ~`COL5;
183 new_switch[3][6] = ~`COL6;
184 new_switch[3][7] = ~`COL7;
185 new_switch[3][8] = ~`COL8;
186 new_switch[3][9] = ~`COL9;
187 new_switch[3][10] = ~`COL10;
188 new_switch[3][11] = ~`COL11;
189 new_switch[3][12] = ~`COL12;
190 end
191`endif
192 endcase
193
194 if (state == state.last)
195 state = state.first;
196 else
197 state = state.next;
198
199 if (new_switch == switch_raw) begin
200 if (switch_debounce == 0)
201 switch = switch_raw;
202 else
203 --switch_debounce;
204 end else begin
205 switch_raw = new_switch;
206 switch_debounce = DEBOUNCE_MAX;
207 end
208 end
209end
210
211endmodule