blob: 7cefeac3a61f2f621dc5c53d2e91217886310586 [file] [log] [blame]
Sylvain Munautda651572020-09-14 10:10:49 +02001/*
2 * top.v
3 *
4 * vim: ts=4 sw=4
5 *
6 * Top-level for the icE1usb icebreaker/bitsy based prototypes
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
14module top (
15 // E1 PHY
16 input wire e1_rx_hi_p,
17// input wire e1_rx_hi_n,
18 input wire e1_rx_lo_p,
19// input wire e1_rx_lo_n,
20
21 output wire e1_tx_hi,
22 output wire e1_tx_lo,
23
24 output wire e1_vref_ct_pdm,
25 output wire e1_vref_p_pdm,
26 output wire e1_vref_n_pdm,
27
28 // USB
29 inout wire usb_dp,
30 inout wire usb_dn,
31 output wire usb_pu,
32
33 // Flash
34 inout wire flash_mosi,
35 inout wire flash_miso,
36 inout wire flash_clk,
37 inout wire flash_cs_n,
38
39 // Button
40 input wire btn,
41
42 // Clock (30.72 MHz)
43 input wire clk_in,
44 output wire clk_tune_hi,
45 output wire clk_tune_lo,
46
47 // Debug UART
48 input wire dbg_rx,
49 output wire dbg_tx,
50
51 // RGB LEDs
52 output wire [2:0] rgb
53);
54
55 localparam integer WB_N = 1;
56
57 genvar i;
58
59
60 // Signals
61 // -------
62
63 // Flash SPI internal signals
64 wire flash_mosi_i, flash_miso_i, flash_clk_i;
65 wire flash_mosi_o, flash_miso_o, flash_clk_o;
66 wire flash_mosi_oe, flash_miso_oe, flash_clk_oe;
67 wire flash_csn_o;
68
69 // Peripheral wishbone
70 wire [15:0] wb_addr;
71 wire [31:0] wb_rdata [0:WB_N-1];
72 wire [31:0] wb_wdata;
73 wire [ 3:0] wb_wmsk;
74 wire wb_we;
75 wire [WB_N-1:0] wb_cyc;
76 wire [WB_N-1:0] wb_ack;
77
78 wire [(WB_N*32)-1:0] wb_rdata_flat;
79
80 // Ticks
81 wire tick_e1_rx;
82 wire tick_e1_tx;
83 wire tick_usb_sof;
84
85 // Clocks / Reset
86 wire rst_req;
87
88 wire clk_sys;
89 wire rst_sys;
90 wire clk_48m;
91 wire rst_48m;
92
93
94 // SoC base
95 // --------
96
97 // Instance
98 soc_base #(
99 .WB_N(WB_N),
100 .E1_N(1),
101 .E1_UNIT_HAS_RX(1'b1),
102 .E1_UNIT_HAS_TX(1'b1),
103 .E1_LIU(0)
104 ) soc_I (
105 .e1_rx_hi_p (e1_rx_hi_p),
106// .e1_rx_hi_n (e1_rx_hi_n),
107 .e1_rx_lo_p (e1_rx_lo_p),
108// .e1_rx_lo_n (e1_rx_lo_n),
109 .e1_tx_hi (e1_tx_hi),
110 .e1_tx_lo (e1_tx_lo),
111 .e1_rx_data (),
112 .e1_rx_clk (),
113 .e1_tx_data (),
114 .e1_tx_clk (),
115 .usb_dp (usb_dp),
116 .usb_dn (usb_dn),
117 .usb_pu (usb_pu),
118 .flash_mosi_i (flash_mosi_i),
119 .flash_mosi_o (flash_mosi_o),
120 .flash_mosi_oe(flash_mosi_oe),
121 .flash_miso_i (flash_miso_i),
122 .flash_miso_o (flash_miso_o),
123 .flash_miso_oe(flash_miso_oe),
124 .flash_clk_i (flash_clk_i),
125 .flash_clk_o (flash_clk_o),
126 .flash_clk_oe (flash_clk_oe),
127 .flash_csn_o (flash_csn_o),
128 .dbg_rx (dbg_rx),
129 .dbg_tx (dbg_tx),
130 .rgb (rgb),
131 .wb_m_addr (wb_addr),
132 .wb_m_rdata (wb_rdata_flat),
133 .wb_m_wdata (wb_wdata),
134 .wb_m_wmsk (wb_wmsk),
135 .wb_m_we (wb_we),
136 .wb_m_cyc (wb_cyc),
137 .wb_m_ack (wb_ack),
138 .tick_e1_rx (tick_e1_rx),
139 .tick_e1_tx (tick_e1_tx),
140 .tick_usb_sof (tick_usb_sof),
141 .clk_sys (clk_sys),
142 .rst_sys (rst_sys),
143 .clk_48m (clk_48m),
144 .rst_48m (rst_48m)
145 );
146
147 // WB read data flattening
148 for (i=0; i<WB_N; i=i+1)
149 assign wb_rdata_flat[i*32+:32] = wb_rdata[i];
150
151 // SPI IO
152 SB_IO #(
153 .PIN_TYPE(6'b101001),
154 .PULLUP(1'b1)
155 ) spi_io_I[2:0] (
156 .PACKAGE_PIN ({flash_mosi, flash_miso, flash_clk }),
157 .OUTPUT_ENABLE({flash_mosi_oe, flash_miso_oe, flash_clk_oe}),
158 .D_OUT_0 ({flash_mosi_o, flash_miso_o, flash_clk_o }),
159 .D_IN_0 ({flash_mosi_i, flash_miso_i, flash_clk_i })
160 );
161
162 assign flash_cs_n = flash_csn_o;
163
164
165 // Misc [0]
166 // ----
167
168 misc misc_I (
169 .e1_vref_ct_pdm(e1_vref_ct_pdm),
170 .e1_vref_p_pdm (e1_vref_p_pdm),
171 .e1_vref_n_pdm (e1_vref_n_pdm),
172 .clk_tune_hi (clk_tune_hi),
173 .clk_tune_lo (clk_tune_lo),
174 .btn (btn),
175 .tick_e1_rx (tick_e1_rx),
176 .tick_e1_tx (tick_e1_tx),
177 .tick_usb_sof (tick_usb_sof),
178 .rst_req (rst_req),
179 .wb_addr (wb_addr[7:0]),
180 .wb_rdata (wb_rdata[0]),
181 .wb_wdata (wb_wdata),
182 .wb_we (wb_we),
183 .wb_cyc (wb_cyc[0]),
184 .wb_ack (wb_ack[0]),
185 .clk (clk_sys),
186 .rst (rst_sys)
187 );
188
189
190 // Clock / Reset
191 // -------------
192
193 sysmgr sys_mgr_I (
194 .clk_in (clk_in),
195 .rst_in (rst_req),
196 .clk_sys(clk_sys),
197 .rst_sys(rst_sys),
198 .clk_48m(clk_48m),
199 .rst_48m(rst_48m)
200 );
201
202endmodule // top