https://blackmesalabs.wordpress.com/2016/10/24/sump2-96-msps-logic-analyzer-for-22/
[BML_sump2] / sump2 / source / top.v
1 /* ****************************************************************************\r
2 -- Source file: top.v                \r
3 -- Date:        October 08, 2016\r
4 -- Author:      khubbard\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
16 -- \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
21 --           /                                               -----          |\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
28 --           \                                               -----          |\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
33 --\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
40 \r
41 module top\r
42 (\r
43   input  wire         clk_12m,\r
44   input  wire         ftdi_wi,\r
45   output wire         ftdi_ro,\r
46   input  wire [7:0]   events_din,\r
47 \r
48   input  wire         p44,\r
49   input  wire         p45,\r
50   input  wire         p47,\r
51   input  wire         p48,\r
52   input  wire         p56,\r
53   input  wire         p60,\r
54   input  wire         p61,\r
55   input  wire         p62,\r
56 \r
57   output wire         p119,    \r
58   output wire         p118,    \r
59   output wire         p117,    \r
60   output wire         p116,    \r
61   output wire         p115,    \r
62   output wire         p114,    \r
63   output wire         p113,    \r
64   output wire         p112,    \r
65 \r
66   input  wire         p128,    \r
67 \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
72 \r
73   output wire         ir_sd,\r
74   output wire         ir_txd,\r
75   input  wire         ir_rxd,\r
76 \r
77   output wire         LED1,\r
78   output wire         LED2,\r
79   output wire         LED3,\r
80   output wire         LED4,\r
81   output wire         LED5\r
82 );// module top\r
83 \r
84   wire          lb_wr;\r
85   wire          lb_rd;\r
86   wire [31:0]   lb_addr;\r
87   wire [31:0]   lb_wr_d;\r
88   wire [31:0]   lb_rd_d;\r
89   wire          lb_rd_rdy;\r
90   wire [23:0]   events_loc;\r
91 \r
92   wire          clk_96m_loc;\r
93   wire          clk_cap_tree;\r
94   wire          clk_lb_tree;\r
95 //wire          reset_core;\r
96   wire          reset_loc;\r
97   wire          pll_lock;\r
98 \r
99   wire          mesa_wi_loc;\r
100   wire          mesa_wo_loc;\r
101   wire          mesa_ri_loc;\r
102   wire          mesa_ro_loc;\r
103 \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
108   wire          mesa_wo_busy;\r
109   wire          mesa_ro_byte_en;\r
110   wire [7:0]    mesa_ro_byte_d;\r
111   wire          mesa_ro_busy;\r
112   wire          mesa_ro_done;\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
117 \r
118 \r
119   wire          mesa_wi_baudlock;\r
120   wire [3:0]    led_bus;\r
121   reg  [7:0]    test_cnt;\r
122   reg           ck_togl;\r
123 \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
129 \r
130   assign ir_sd  = 1'b1;// 1==Shutdown 0==ON\r
131   assign ir_txd = 1'b0;\r
132 \r
133   assign reset_loc = 0;\r
134 //assign reset_core = ~ pll_lock;// didn't fit\r
135 \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
139 \r
140 \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
145 \r
146 \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
151 top_pll u_top_pll\r
152 (\r
153   .REFERENCECLK ( clk_12m     ),\r
154   .PLLOUTCORE   (             ),\r
155   .PLLOUTGLOBAL ( clk_96m_loc ),\r
156   .LOCK         ( pll_lock    ),\r
157   .RESET        ( 1'b1        )\r
158 );\r
159 \r
160 \r
161 SB_GB u0_sb_gb \r
162 (\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
167 );\r
168 // Note: sump2.v modified to conserve resources requires single clock domain\r
169 //assign clk_cap_tree = clk_lb_tree;\r
170 \r
171 SB_GB u1_sb_gb \r
172 (\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
176 );\r
177 // assign clk_lb_tree = clk_12m;\r
178 \r
179 \r
180 //-----------------------------------------------------------------------------\r
181 // Note: 40kHz modulated ir_rxd signal looks like this\r
182 //  \_____/                       \___/                      \___/\r
183 //  |<2us>|<-------24us----------->\r
184 //-----------------------------------------------------------------------------\r
185 \r
186 \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
194  begin\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
198  end\r
199 end // proc_div\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
208   \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
218 \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
227 \r
228 \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
234 //(\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
241 //\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
254 \r
255 \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
261 (\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
282 \r
283 \r
284 //-----------------------------------------------------------------------------\r
285 // MesaBus Core : Decode Slot,Subslot,Command Info and translate to LocalBus\r
286 //-----------------------------------------------------------------------------\r
287 mesa_core \r
288 #\r
289 (\r
290   .spi_prom_en       ( 1'b0                       )\r
291 )\r
292 u_mesa_core\r
293 (\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
309   .subslot_ctrl        (                          ),\r
310   .bist_req            (                          ),\r
311   .reconfig_req        (                          ),\r
312   .reconfig_addr       (                          ),\r
313   .oob_en              ( 1'b0                     ),\r
314   .oob_done            ( 1'b0                     ),\r
315   .lb_wr               ( lb_wr                    ),\r
316   .lb_rd               ( lb_rd                    ),\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
322 \r
323 \r
324 //-----------------------------------------------------------------------------\r
325 // Design Specific Logic\r
326 //-----------------------------------------------------------------------------\r
327 core u_core \r
328 (\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
333   .lb_wr               ( lb_wr                    ),\r
334   .lb_rd               ( lb_rd                    ),\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
341 );  \r
342 \r
343 \r
344 endmodule // top.v\r