1 /* ****************************************************************************
\r
2 -- Source file: top.v
\r
3 -- Date: October 08, 2016
\r
5 -- Description: Top Level Verilog RTL for Lattice ICE5LP FPGA Design
\r
6 -- Language: Verilog-2001 and VHDL-1993
\r
7 -- Simulation: Mentor-Modelsim
\r
8 -- Synthesis: Lattice
\r
9 -- License: This project is licensed with the CERN Open Hardware Licence
\r
10 -- v1.2. You may redistribute and modify this project under the
\r
11 -- terms of the CERN OHL v.1.2. (http://ohwr.org/cernohl).
\r
12 -- This project is distributed WITHOUT ANY EXPRESS OR IMPLIED
\r
13 -- WARRANTY, INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY
\r
14 -- AND FITNESS FOR A PARTICULAR PURPOSE. Please see the CERN OHL
\r
15 -- v.1.2 for applicable Conditions.
\r
17 -- Lattice ICE-Stick
\r
18 -- -----------------------------------------------------------
\r
19 -- / 119 118 117 116 115 114 113 112 GND 3V |
\r
20 -- / o o o o o o o o o o |
\r
22 -- ------- --------- R 3V |o o|3V |
\r
23 -- | ------- | | | GND |o P o|GND |
\r
24 -- |USB | FTDI | |Lattice | R--G--R event[7]|o M o|event[6] |
\r
25 -- | |FT2232H| |iCE40HX1K| | event[5]|o O o|event[4] |
\r
26 -- | ------- | | R event[3]|o D o|event[2] |
\r
27 -- ------- --------- event[1]|o o|event[0] |
\r
29 -- \ o o o o o o o o o o |
\r
30 -- \ 44 45 47 48 56 60 61 62 GND 3V |
\r
31 -- -----------------------------------------------------------
\r
32 -- event [15][14][13][12][11][10] [9] [8]
\r
34 -- Revision History:
\r
35 -- Ver# When Who What
\r
36 -- ---- -------- -------- ---------------------------------------------------
\r
37 -- 0.1 10.08.16 khubbard Creation
\r
38 -- ***************************************************************************/
\r
39 `default_nettype none // Strictly enforce all nets to be declared
\r
45 output wire ftdi_ro,
\r
46 input wire [7:0] events_din,
\r
68 output wire spi_sck,
\r
69 output wire spi_cs_l,
\r
70 output wire spi_mosi,
\r
71 input wire spi_miso,
\r
86 wire [31:0] lb_addr;
\r
87 wire [31:0] lb_wr_d;
\r
88 wire [31:0] lb_rd_d;
\r
90 wire [23:0] events_loc;
\r
104 wire mesa_wi_nib_en;
\r
105 wire [3:0] mesa_wi_nib_d;
\r
106 wire mesa_wo_byte_en;
\r
107 wire [7:0] mesa_wo_byte_d;
\r
109 wire mesa_ro_byte_en;
\r
110 wire [7:0] mesa_ro_byte_d;
\r
113 wire [7:0] mesa_core_ro_byte_d;
\r
114 wire mesa_core_ro_byte_en;
\r
115 wire mesa_core_ro_done;
\r
116 wire mesa_core_ro_busy;
\r
119 wire mesa_wi_baudlock;
\r
120 wire [3:0] led_bus;
\r
121 reg [7:0] test_cnt;
\r
124 assign LED1 = led_bus[0];
\r
125 assign LED2 = led_bus[1];
\r
126 assign LED3 = led_bus[2];
\r
127 assign LED4 = led_bus[3];
\r
128 assign LED5 = 1'b1;// Green LED always ON. Not enough resources to flash
\r
130 assign ir_sd = 1'b1;// 1==Shutdown 0==ON
\r
131 assign ir_txd = 1'b0;
\r
133 assign reset_loc = 0;
\r
134 //assign reset_core = ~ pll_lock;// didn't fit
\r
136 // Hookup FTDI RX and TX pins to MesaBus Phy
\r
137 assign mesa_wi_loc = ftdi_wi;
\r
138 assign ftdi_ro = mesa_ro_loc;
\r
141 assign events_loc[7:0] = events_din[7:0];
\r
142 assign events_loc[15:8] = { p44,p45,p47,p48,p56,p60,p61,p62 };
\r
143 //assign events_loc[23:16] = { p119,p118,p117,p116,p115,p114,p113,p112 };
\r
144 assign events_loc[23:16] = 8'd0;// Didn't fit
\r
147 //-----------------------------------------------------------------------------
\r
148 // PLL generated by Lattice GUI to multiply 12 MHz to 96 MHz
\r
149 // PLL's RESET port is active low. How messed up of a signal name is that?
\r
150 //-----------------------------------------------------------------------------
\r
153 .REFERENCECLK ( clk_12m ),
\r
155 .PLLOUTGLOBAL ( clk_96m_loc ),
\r
156 .LOCK ( pll_lock ),
\r
163 //.USER_SIGNAL_TO_GLOBAL_BUFFER ( clk_12m ),
\r
164 .USER_SIGNAL_TO_GLOBAL_BUFFER ( ck_togl ),
\r
165 //.USER_SIGNAL_TO_GLOBAL_BUFFER ( clk_96m_loc ),
\r
166 .GLOBAL_BUFFER_OUTPUT ( clk_lb_tree )
\r
168 // Note: sump2.v modified to conserve resources requires single clock domain
\r
169 //assign clk_cap_tree = clk_lb_tree;
\r
173 //.USER_SIGNAL_TO_GLOBAL_BUFFER ( ck_cap_togl ),
\r
174 .USER_SIGNAL_TO_GLOBAL_BUFFER ( clk_96m_loc ),
\r
175 .GLOBAL_BUFFER_OUTPUT ( clk_cap_tree )
\r
177 // assign clk_lb_tree = clk_12m;
\r
180 //-----------------------------------------------------------------------------
\r
181 // Note: 40kHz modulated ir_rxd signal looks like this
\r
182 // \_____/ \___/ \___/
\r
183 // |<2us>|<-------24us----------->
\r
184 //-----------------------------------------------------------------------------
\r
187 //-----------------------------------------------------------------------------
\r
188 // Toggle Flop To generate slower capture clocks.
\r
189 // 12MHz div-6 = 1 MHz toggle 1uS Sample
\r
190 // 12MHz div-48 = 125 kHz toggle 8uS Sample
\r
191 //-----------------------------------------------------------------------------
\r
192 //always @ ( posedge clk_12m ) begin : proc_div
\r
193 always @ ( posedge clk_cap_tree ) begin : proc_div
\r
195 test_cnt <= test_cnt[7:0] + 1;
\r
196 // ck_togl <= ~ ck_togl;// 48 MHz
\r
197 ck_togl <= test_cnt[1];// 24 MHz
\r
200 //assign p119 = test_cnt[7];
\r
201 //assign p118 = test_cnt[6];
\r
202 //assign p117 = test_cnt[5];
\r
203 //assign p116 = test_cnt[4];
\r
204 //assign p115 = test_cnt[3];
\r
205 //assign p114 = test_cnt[2];
\r
206 //assign p113 = test_cnt[1];
\r
207 //assign p112 = test_cnt[0];
\r
209 assign p119 = test_cnt[5];
\r
210 assign p118 = test_cnt[4];
\r
211 assign p117 = test_cnt[3];
\r
212 assign p116 = test_cnt[2];
\r
213 assign p115 = test_cnt[1];
\r
214 assign p114 = test_cnt[0];
\r
215 //assign p116 = lb_rd_rdy;
\r
216 //assign p115 = lb_rd;
\r
217 //assign p114 = lb_wr;
\r
219 //assign p119 = 1'b0;
\r
220 //assign p118 = 1'b0;
\r
221 //assign p117 = 1'b0;
\r
222 //assign p116 = 1'b0;
\r
223 //assign p115 = 1'b0;
\r
224 //assign p114 = 1'b0;
\r
225 assign p113 = mesa_ro_loc;
\r
226 assign p112 = ftdi_wi;
\r
229 //-----------------------------------------------------------------------------
\r
230 // FSM for reporting ID : This also muxes in Ro Byte path from Core
\r
231 // This didn't fit in ICE-Stick, so removed.
\r
232 //-----------------------------------------------------------------------------
\r
233 //mesa_id u_mesa_id
\r
235 // .reset ( reset_loc ),
\r
236 // .clk ( clk_lb_tree ),
\r
237 // .report_id ( report_id ),
\r
238 // .id_mfr ( 32'h00000001 ),
\r
239 // .id_dev ( 32'h00000002 ),
\r
240 // .id_snum ( 32'h00000001 ),
\r
242 // .mesa_core_ro_byte_en ( mesa_core_ro_byte_en ),
\r
243 // .mesa_core_ro_byte_d ( mesa_core_ro_byte_d[7:0] ),
\r
244 // .mesa_core_ro_done ( mesa_core_ro_done ),
\r
245 // .mesa_ro_byte_en ( mesa_ro_byte_en ),
\r
246 // .mesa_ro_byte_d ( mesa_ro_byte_d[7:0] ),
\r
247 // .mesa_ro_done ( mesa_ro_done ),
\r
248 // .mesa_ro_busy ( mesa_ro_busy )
\r
249 //);// module mesa_id
\r
250 assign mesa_ro_byte_d[7:0] = mesa_core_ro_byte_d[7:0];
\r
251 assign mesa_ro_byte_en = mesa_core_ro_byte_en;
\r
252 assign mesa_ro_done = mesa_core_ro_done;
\r
253 assign mesa_core_ro_busy = mesa_ro_busy;
\r
256 //-----------------------------------------------------------------------------
\r
257 // MesaBus Phy : Convert UART serial to/from binary for Mesa Bus Interface
\r
258 // This translates between bits and bytes
\r
259 //-----------------------------------------------------------------------------
\r
260 mesa_phy u_mesa_phy
\r
262 //.reset ( reset_core ),
\r
263 .reset ( reset_loc ),
\r
264 .clk ( clk_lb_tree ),
\r
265 .clr_baudlock ( 1'b0 ),
\r
266 .disable_chain ( 1'b1 ),
\r
267 .mesa_wi_baudlock ( mesa_wi_baudlock ),
\r
268 .mesa_wi ( mesa_wi_loc ),
\r
269 .mesa_ro ( mesa_ro_loc ),
\r
270 .mesa_wo ( mesa_wo_loc ),
\r
271 .mesa_ri ( mesa_ri_loc ),
\r
272 .mesa_wi_nib_en ( mesa_wi_nib_en ),
\r
273 .mesa_wi_nib_d ( mesa_wi_nib_d[3:0] ),
\r
274 .mesa_wo_byte_en ( mesa_wo_byte_en ),
\r
275 .mesa_wo_byte_d ( mesa_wo_byte_d[7:0] ),
\r
276 .mesa_wo_busy ( mesa_wo_busy ),
\r
277 .mesa_ro_byte_en ( mesa_ro_byte_en ),
\r
278 .mesa_ro_byte_d ( mesa_ro_byte_d[7:0] ),
\r
279 .mesa_ro_busy ( mesa_ro_busy ),
\r
280 .mesa_ro_done ( mesa_ro_done )
\r
281 );// module mesa_phy
\r
284 //-----------------------------------------------------------------------------
\r
285 // MesaBus Core : Decode Slot,Subslot,Command Info and translate to LocalBus
\r
286 //-----------------------------------------------------------------------------
\r
290 .spi_prom_en ( 1'b0 )
\r
294 //.reset ( reset_core ),
\r
295 .reset ( ~mesa_wi_baudlock ),
\r
296 .clk ( clk_lb_tree ),
\r
297 .spi_sck ( spi_sck ),
\r
298 .spi_cs_l ( spi_cs_l ),
\r
299 .spi_mosi ( spi_mosi ),
\r
300 .spi_miso ( spi_miso ),
\r
301 .rx_in_d ( mesa_wi_nib_d[3:0] ),
\r
302 .rx_in_rdy ( mesa_wi_nib_en ),
\r
303 .tx_byte_d ( mesa_core_ro_byte_d[7:0] ),
\r
304 .tx_byte_rdy ( mesa_core_ro_byte_en ),
\r
305 .tx_done ( mesa_core_ro_done ),
\r
306 .tx_busy ( mesa_core_ro_busy ),
\r
307 .tx_wo_byte ( mesa_wo_byte_d[7:0] ),
\r
308 .tx_wo_rdy ( mesa_wo_byte_en ),
\r
312 .reconfig_addr ( ),
\r
314 .oob_done ( 1'b0 ),
\r
317 .lb_wr_d ( lb_wr_d[31:0] ),
\r
318 .lb_addr ( lb_addr[31:0] ),
\r
319 .lb_rd_d ( lb_rd_d[31:0] ),
\r
320 .lb_rd_rdy ( lb_rd_rdy )
\r
321 );// module mesa_core
\r
324 //-----------------------------------------------------------------------------
\r
325 // Design Specific Logic
\r
326 //-----------------------------------------------------------------------------
\r
329 //.reset ( reset_core ),
\r
330 .reset ( ~mesa_wi_baudlock ),
\r
331 .clk_lb ( clk_lb_tree ),
\r
332 .clk_cap ( clk_cap_tree ),
\r
335 .lb_wr_d ( lb_wr_d[31:0] ),
\r
336 .lb_addr ( lb_addr[31:0] ),
\r
337 .lb_rd_d ( lb_rd_d[31:0] ),
\r
338 .lb_rd_rdy ( lb_rd_rdy ),
\r
339 .led_bus ( led_bus[3:0] ),
\r
340 .events_din ( events_loc[23:0] )
\r