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