blob: 830f082729508955dd10e4683c3bfa82012dbeb7 [file] [log] [blame]
Sylvain Munautbd83e532020-09-15 22:11:29 +02001/*
2 * top.v
3 *
4 * vim: ts=4 sw=4
5 *
6 * Top-level for the icE1usb production boards
7 *
8 * Copyright (C) 2019-2020 Sylvain Munaut <tnt@246tNt.com>
9 * SPDX-License-Identifier: CERN-OHL-S-2.0
10 */
11
12`default_nettype none
13
Sylvain Munaut58531972020-10-03 20:52:43 +020014`define WITH_SB_I2C
15// `define WITH_CUSTOM_I2C
16
Sylvain Munautbd83e532020-09-15 22:11:29 +020017module top (
18 // E1 PHY
19 input wire e1A_rx_hi_p,
20// input wire e1A_rx_hi_n,
21 input wire e1A_rx_lo_p,
22// input wire e1A_rx_lo_n,
23 output wire e1A_tx_hi,
24 output wire e1A_tx_lo,
25
26 input wire e1B_rx_hi_p,
27// input wire e1B_rx_hi_n,
28 input wire e1B_rx_lo_p,
29// input wire e1B_rx_lo_n,
30 output wire e1B_tx_hi,
31 output wire e1B_tx_lo,
32
33 output wire [1:0] e1_rx_bias,
34
35 // USB
36 inout wire usb_dp,
37 inout wire usb_dn,
38 output wire usb_pu,
39
40 // Flash
41 inout wire flash_mosi,
42 inout wire flash_miso,
43 inout wire flash_clk,
44 inout wire flash_cs_n,
45
46 // LED Shift register + Button input
47 inout wire e1_led_rclk,
48
49 // GPS
50 output wire gps_reset_n,
51 input wire gps_rx,
52 output wire gps_tx,
53 input wire gps_pps,
54
55 // I2C
56 inout wire i2c_sda,
57 inout wire i2c_scl,
58
59 // GPIOs
60 inout wire [2:0] gpio,
61
62 // Clock (30.72 MHz)
63 input wire clk_in,
64 output wire clk_tune_hi,
65 output wire clk_tune_lo,
66
67 // Debug UART
68 input wire dbg_rx,
69 output wire dbg_tx,
70
71 // RGB LEDs
72 output wire [2:0] rgb
73);
74
75 localparam integer WB_N = 3;
76
77 genvar i;
78
79
80 // Signals
81 // -------
82
83 // Flash SPI internal signals
84 wire flash_mosi_i, flash_miso_i, flash_clk_i;
85 wire flash_mosi_o, flash_miso_o, flash_clk_o;
86 wire flash_mosi_oe, flash_miso_oe, flash_clk_oe;
87 wire flash_csn_o;
88
89 // Peripheral wishbone
90 wire [15:0] wb_addr;
91 wire [31:0] wb_rdata [0:WB_N-1];
92 wire [31:0] wb_wdata;
93 wire [ 3:0] wb_wmsk;
94 wire wb_we;
95 wire [WB_N-1:0] wb_cyc;
96 wire [WB_N-1:0] wb_ack;
97
98 wire [(WB_N*32)-1:0] wb_rdata_flat;
99
100 // Ticks
101 wire [1:0] tick_e1_rx;
102 wire [1:0] tick_e1_tx;
103 wire tick_usb_sof;
104
105 // I2C
106 wire i2c_scl_oe;
107 wire i2c_sda_oe;
108 wire i2c_sda_i;
109
110 // Led & Button
111 wire [7:0] e1_led_state;
112 wire e1_led_run;
113 wire e1_led_active;
114
115 wire spi_req;
116 wire spi_gnt;
117
118 wire [7:0] sr_val;
119 wire sr_go;
120 wire sr_rdy;
121
122 wire btn_val;
123 wire btn_stb;
124
125 // Clocks / Reset
126 wire rst_req;
127
128 wire clk_sys;
129 wire rst_sys;
130 wire clk_48m;
131 wire rst_48m;
132
133
134 // SoC base
135 // --------
136
137 // Instance
138 soc_base #(
139 .WB_N(WB_N),
140 .E1_N(2),
141 .E1_UNIT_HAS_RX(2'b01),
142 .E1_UNIT_HAS_TX(2'b01),
143 .E1_LIU(0)
144 ) soc_I (
145 .e1_rx_hi_p ({e1B_rx_hi_p, e1A_rx_hi_p}),
146// .e1_rx_hi_n ({e1B_rx_hi_n, e1A_rx_hi_n}),
147 .e1_rx_lo_p ({e1B_rx_lo_p, e1A_rx_lo_p}),
148// .e1_rx_lo_n ({e1B_rx_lo_n, e1A_rx_lo_n}),
149 .e1_tx_hi ({e1B_tx_hi, e1A_tx_hi }),
150 .e1_tx_lo ({e1B_tx_lo, e1A_tx_lo }),
151 .e1_rx_data (),
152 .e1_rx_clk (),
153 .e1_tx_data (),
154 .e1_tx_clk (),
155 .usb_dp (usb_dp),
156 .usb_dn (usb_dn),
157 .usb_pu (usb_pu),
158 .flash_mosi_i (flash_mosi_i),
159 .flash_mosi_o (flash_mosi_o),
160 .flash_mosi_oe(flash_mosi_oe),
161 .flash_miso_i (flash_miso_i),
162 .flash_miso_o (flash_miso_o),
163 .flash_miso_oe(flash_miso_oe),
164 .flash_clk_i (flash_clk_i),
165 .flash_clk_o (flash_clk_o),
166 .flash_clk_oe (flash_clk_oe),
167 .flash_csn_o (flash_csn_o),
168 .dbg_rx (dbg_rx),
169 .dbg_tx (dbg_tx),
170 .rgb (rgb),
171 .wb_m_addr (wb_addr),
172 .wb_m_rdata (wb_rdata_flat),
173 .wb_m_wdata (wb_wdata),
174 .wb_m_wmsk (wb_wmsk),
175 .wb_m_we (wb_we),
176 .wb_m_cyc (wb_cyc),
177 .wb_m_ack (wb_ack),
178 .tick_e1_rx (tick_e1_rx),
179 .tick_e1_tx (tick_e1_tx),
180 .tick_usb_sof (tick_usb_sof),
181 .clk_sys (clk_sys),
182 .rst_sys (rst_sys),
183 .clk_48m (clk_48m),
184 .rst_48m (rst_48m)
185 );
186
187 // WB read data flattening
188 for (i=0; i<WB_N; i=i+1)
189 assign wb_rdata_flat[i*32+:32] = wb_rdata[i];
190
191
192 // Dummy channel
193 // -------------
194
195 wire [1:0] e1_dummy;
196
197 SB_IO #(
198 .PIN_TYPE(6'b000000),
199 .PULLUP(1'b0),
200 .NEG_TRIGGER(1'b0),
201 .IO_STANDARD("SB_LVDS_INPUT")
202 ) e1_dummy_rx_I[1:0] (
203 .PACKAGE_PIN({e1B_rx_hi_p, e1B_rx_lo_p}),
204 .LATCH_INPUT_VALUE(1'b0),
205 .CLOCK_ENABLE(1'b1),
206 .INPUT_CLK(clk_sys),
207 .OUTPUT_CLK(1'b0),
208 .OUTPUT_ENABLE(1'b0),
209 .D_OUT_0(1'b0),
210 .D_OUT_1(1'b0),
211 .D_IN_0(e1_dummy),
212 .D_IN_1()
213 );
214
215 SB_IO #(
216 .PIN_TYPE(6'b010100),
217 .PULLUP(1'b0),
218 .NEG_TRIGGER(1'b0),
219 .IO_STANDARD("SB_LVCMOS")
220 ) e1_dummy_tx_I[1:0] (
221 .PACKAGE_PIN({e1B_tx_hi, e1B_tx_lo}),
222 .LATCH_INPUT_VALUE(1'b0),
223 .CLOCK_ENABLE(1'b1),
224 .INPUT_CLK(1'b0),
225 .OUTPUT_CLK(clk_sys),
226 .OUTPUT_ENABLE(1'b0),
227 .D_OUT_0(e1_dummy),
228 .D_OUT_1(1'b0),
229 .D_IN_0(),
230 .D_IN_1()
231 );
232
233
234 // Misc [0]
235 // ----
236
237 misc misc_I (
238 .e1_rx_bias (e1_rx_bias),
239 .clk_tune_hi (clk_tune_hi),
240 .clk_tune_lo (clk_tune_lo),
241 .gps_reset_n (gps_reset_n),
242 .gps_pps (gps_pps),
243 .gpio (gpio),
244 .e1_led_state (e1_led_state),
245 .e1_led_run (e1_led_run),
246 .e1_led_active (e1_led_active),
247 .btn_val (btn_val),
248 .btn_stb (btn_stb),
249 .tick_e1_rx (tick_e1_rx),
250 .tick_e1_tx (tick_e1_tx),
251 .tick_usb_sof (tick_usb_sof),
252 .rst_req (rst_req),
253 .wb_addr (wb_addr[7:0]),
254 .wb_rdata (wb_rdata[0]),
255 .wb_wdata (wb_wdata),
256 .wb_we (wb_we),
257 .wb_cyc (wb_cyc[0]),
258 .wb_ack (wb_ack[0]),
259 .clk (clk_sys),
260 .rst (rst_sys)
261 );
262
263
264 // GPS UART [1]
265 // --------
266
267 uart_wb #(
268 .DIV_WIDTH(12),
269 .DW(32)
270 ) gps_uart_I (
271 .uart_tx (gps_tx),
272 .uart_rx (gps_rx),
273 .wb_addr (wb_addr[1:0]),
274 .wb_rdata (wb_rdata[1]),
275 .wb_wdata (wb_wdata),
276 .wb_we (wb_we),
277 .wb_cyc (wb_cyc[1]),
278 .wb_ack (wb_ack[1]),
279 .clk (clk_sys),
280 .rst (rst_sys)
281 );
282
283
284 // I2C [2]
285 // ---
286
Sylvain Munaut58531972020-10-03 20:52:43 +0200287`ifdef WITH_SB_I2C
288
289 // Hard-IP
290 ice40_i2c_wb #(
291 .WITH_IOB(1),
292 .UNIT(0)
293 ) i2c_I (
294 .i2c_scl (i2c_scl),
295 .i2c_sda (i2c_sda),
296 .wb_addr (wb_addr[3:0]),
297 .wb_rdata (wb_rdata[2]),
298 .wb_wdata (wb_wdata),
299 .wb_we (wb_we),
300 .wb_cyc (wb_cyc[2]),
301 .wb_ack (wb_ack[2]),
302 .clk (clk_sys),
303 .rst (rst_sys)
304 );
305
306`elsif WITH_CUSTOM_I2C
307
Sylvain Munautbd83e532020-09-15 22:11:29 +0200308 // Controller
309 i2c_master_wb #(
310 .DW(3),
311 .FIFO_DEPTH(0)
312 ) i2c_I (
313 .scl_oe (i2c_scl_oe),
314 .sda_oe (i2c_sda_oe),
315 .sda_i (i2c_sda_i),
316 .wb_rdata(wb_rdata[2]),
317 .wb_wdata(wb_wdata),
318 .wb_we (wb_we),
319 .wb_cyc (wb_cyc[2]),
320 .wb_ack (wb_ack[2]),
321 .ready (),
322 .clk (clk_sys),
323 .rst (rst_sys)
324 );
325
326 // IOBs
327 SB_IO #(
328 .PIN_TYPE(6'b110101),
329 .PULLUP(1'b1),
330 .IO_STANDARD("SB_LVCMOS")
331 ) i2c_scl_iob_I (
332 .PACKAGE_PIN (i2c_scl),
333 .OUTPUT_CLK (clk_sys),
334 .OUTPUT_ENABLE(i2c_scl_oe),
335 .D_OUT_0 (1'b0)
336 );
337
338 SB_IO #(
339 .PIN_TYPE(6'b110100),
340 .PULLUP(1'b1),
341 .IO_STANDARD("SB_LVCMOS")
342 ) i2c_sda_iob_I (
343 .PACKAGE_PIN (i2c_sda),
344 .INPUT_CLK (clk_sys),
345 .OUTPUT_CLK (clk_sys),
346 .OUTPUT_ENABLE(i2c_sda_oe),
347 .D_OUT_0 (1'b0),
348 .D_IN_0 (i2c_sda_i)
349 );
350
Sylvain Munaut58531972020-10-03 20:52:43 +0200351`else
352
353 // Dummy
354 assign wb_ack[2] = wb_cyc[2];
355 assign wb_rdata[2] = 32'h00000000;
356
357`endif
358
Sylvain Munautbd83e532020-09-15 22:11:29 +0200359
360 // E1 LEDs & Button
361 // ----------------
362
363 // Blink pattern generator
364 led_blinker blinker_I (
365 .led_state(e1_led_state),
366 .sr_val (sr_val),
367 .sr_go (sr_go),
368 .sr_rdy (sr_rdy),
369 .clk (clk_sys),
370 .rst (rst_sys)
371 );
372
373 // Interface
374 sr_btn_if #(
375 .TICK_LOG2_DIV(3)
376 ) spi_mux_I (
377 .flash_mosi (flash_mosi),
378 .flash_miso (flash_miso),
379 .flash_clk (flash_clk),
380 .flash_cs_n (flash_cs_n),
381 .e1_led_rclk (e1_led_rclk),
382 .spi_mosi_i (flash_mosi_i),
383 .spi_mosi_o (flash_mosi_o),
384 .spi_mosi_oe (flash_mosi_oe),
385 .spi_miso_i (flash_miso_i),
386 .spi_miso_o (flash_miso_o),
387 .spi_miso_oe (flash_miso_oe),
388 .spi_clk_i (flash_clk_i),
389 .spi_clk_o (flash_clk_o),
390 .spi_clk_oe (flash_clk_oe),
391 .spi_csn_o (flash_csn_o),
392 .spi_csn_oe (1'b1),
393 .spi_req (spi_req),
394 .spi_gnt (spi_gnt),
395 .sr_val (sr_val),
396 .sr_go (sr_go),
397 .sr_rdy (sr_rdy),
398 .btn_val (btn_val),
399 .btn_stb (btn_stb),
400 .clk (clk_sys),
401 .rst (rst_sys)
402 );
403
404 assign spi_req = ~e1_led_run;
405 assign e1_led_active = ~spi_gnt;
406
407
408 // Clock / Reset
409 // -------------
410
411 sysmgr sys_mgr_I (
412 .clk_in (clk_in),
413 .rst_in (rst_req),
414 .clk_sys(clk_sys),
415 .rst_sys(rst_sys),
416 .clk_48m(clk_48m),
417 .rst_48m(rst_48m)
418 );
419
420endmodule // top