Statistics
| Branch: | Tag: | Revision:

root / usrp2 / top / u2plus / u2plus.v @ e7eb44d5

History | View | Annotate | Download (14 KB)

1
`timescale 1ns / 1ps
2
`define LVDS 1
3
//`define DCM_FOR_RAMCLK
4
//////////////////////////////////////////////////////////////////////////////////
5

    
6
module u2plus
7
  (
8
   input CLK_FPGA_P, input CLK_FPGA_N,  // Diff
9
   
10
   // ADC
11
   input ADC_clkout_p, input ADC_clkout_n,
12
   input ADCA_12_p, input ADCA_12_n,
13
   input ADCA_10_p, input ADCA_10_n,
14
   input ADCA_8_p, input ADCA_8_n,
15
   input ADCA_6_p, input ADCA_6_n,
16
   input ADCA_4_p, input ADCA_4_n,
17
   input ADCA_2_p, input ADCA_2_n,
18
   input ADCA_0_p, input ADCA_0_n,
19
   input ADCB_12_p, input ADCB_12_n,
20
   input ADCB_10_p, input ADCB_10_n,
21
   input ADCB_8_p, input ADCB_8_n,
22
   input ADCB_6_p, input ADCB_6_n,
23
   input ADCB_4_p, input ADCB_4_n,
24
   input ADCB_2_p, input ADCB_2_n,
25
   input ADCB_0_p, input ADCB_0_n,
26
   
27
   // DAC
28
   output reg [15:0] DACA,
29
   output reg [15:0] DACB,
30
   input DAC_LOCK,     // unused for now
31
   
32
   // DB IO Pins
33
   inout [15:0] io_tx,
34
   inout [15:0] io_rx,
35

    
36
   // Misc, debug
37
   output [5:1] leds,  // LED4 is shared w/INIT_B
38
   input FPGA_RESET,
39
   output [1:0] debug_clk,
40
   output [31:0] debug,
41
   output [3:1] TXD, input [3:1] RXD, // UARTs
42
   //input [3:0] dipsw,  // Forgot DIP Switches...
43
   
44
   // Clock Gen Control
45
   output [1:0] clk_en,
46
   output [1:0] clk_sel,
47
   input CLK_FUNC,        // FIXME is an input to control the 9510
48
   input clk_status,
49

    
50
   inout SCL, inout SDA,   // I2C
51

    
52
   // PPS
53
   input PPS_IN, input PPS2_IN,
54

    
55
   // SPI
56
   output SEN_CLK, output SCLK_CLK, output MOSI_CLK, input MISO_CLK,
57
   output SEN_DAC, output SCLK_DAC, output MOSI_DAC, input MISO_DAC,
58
   output SEN_ADC, output SCLK_ADC, output MOSI_ADC,
59
   output SEN_TX_DB, output SCLK_TX_DB, output MOSI_TX_DB, input MISO_TX_DB,
60
   output SEN_TX_DAC, output SCLK_TX_DAC, output MOSI_TX_DAC,
61
   output SEN_TX_ADC, output SCLK_TX_ADC, output MOSI_TX_ADC, input MISO_TX_ADC,
62
   output SEN_RX_DB, output SCLK_RX_DB, output MOSI_RX_DB, input MISO_RX_DB,
63
   output SEN_RX_DAC, output SCLK_RX_DAC, output MOSI_RX_DAC,
64
   output SEN_RX_ADC, output SCLK_RX_ADC, output MOSI_RX_ADC, input MISO_RX_ADC,
65

    
66
   // GigE PHY
67
   input CLK_TO_MAC,
68

    
69
   output reg [7:0] GMII_TXD,
70
   output reg GMII_TX_EN,
71
   output reg GMII_TX_ER,
72
   output GMII_GTX_CLK,
73
   input GMII_TX_CLK,  // 100mbps clk
74

    
75
   input GMII_RX_CLK,
76
   input [7:0] GMII_RXD,
77
   input GMII_RX_DV,
78
   input GMII_RX_ER,
79
   input GMII_COL,
80
   input GMII_CRS,
81

    
82
   input PHY_INTn,   // open drain
83
   inout MDIO,
84
   output MDC,
85
   output PHY_RESETn,
86
   output ETH_LED,
87
   
88
//   input POR,
89
   
90
   // Expansion
91
   input exp_time_in_p, input exp_time_in_n, // Diff
92
   output exp_time_out_p, output exp_time_out_n, // Diff 
93
   input exp_user_in_p, input exp_user_in_n, // Diff
94
   output exp_user_out_p, output exp_user_out_n, // Diff 
95
   
96
   // SERDES
97
   output ser_enable,
98
   output ser_prbsen,
99
   output ser_loopen,
100
   output ser_rx_en,
101
   
102
   output ser_tx_clk,
103
   output reg [15:0] ser_t,
104
   output reg ser_tklsb,
105
   output reg ser_tkmsb,
106

    
107
   input ser_rx_clk,
108
   input [15:0] ser_r,
109
   input ser_rklsb,
110
   input ser_rkmsb,
111

    
112
   // SRAM
113
   inout [35:0] RAM_D,
114
   output [20:0] RAM_A,
115
   output [3:0] RAM_BWn,
116
   output RAM_ZZ,
117
   output RAM_LDn,
118
   output RAM_OEn,
119
   output RAM_WEn,
120
   output RAM_CENn,
121
   output RAM_CLK,
122
   
123
   // SPI Flash
124
   output flash_cs,
125
   output flash_clk,
126
   output flash_mosi,
127
   input flash_miso
128
   );
129

    
130
   wire  CLK_TO_MAC_int, CLK_TO_MAC_int2;
131
   IBUFG phyclk (.O(CLK_TO_MAC_int), .I(CLK_TO_MAC));
132
   BUFG phyclk2 (.O(CLK_TO_MAC_int2), .I(CLK_TO_MAC_int));
133
      
134
   // FPGA-specific pins connections
135
   wire 	clk_fpga, dsp_clk, clk_div, dcm_out, wb_clk, clock_ready;
136

    
137
   IBUFGDS clk_fpga_pin (.O(clk_fpga),.I(CLK_FPGA_P),.IB(CLK_FPGA_N));
138
   defparam 	clk_fpga_pin.IOSTANDARD = "LVPECL_25";
139
   
140
   wire 	exp_time_in;
141
   IBUFDS exp_time_in_pin (.O(exp_time_in),.I(exp_time_in_p),.IB(exp_time_in_n));
142
   defparam 	exp_time_in_pin.IOSTANDARD = "LVDS_25";
143
   
144
   wire 	exp_time_out;
145
   OBUFDS exp_time_out_pin (.O(exp_time_out_p),.OB(exp_time_out_n),.I(exp_time_out));
146
   defparam 	exp_time_out_pin.IOSTANDARD  = "LVDS_25";
147

    
148
   wire 	exp_user_in;
149
   IBUFDS exp_user_in_pin (.O(exp_user_in),.I(exp_user_in_p),.IB(exp_user_in_n));
150
   defparam 	exp_user_in_pin.IOSTANDARD = "LVDS_25";
151
   
152
   wire 	exp_user_out;
153
   OBUFDS exp_user_out_pin (.O(exp_user_out_p),.OB(exp_user_out_n),.I(exp_user_out));
154
   defparam 	exp_user_out_pin.IOSTANDARD  = "LVDS_25";
155

    
156
   reg [5:0] 	clock_ready_d;
157
   always @(posedge clk_fpga)
158
     clock_ready_d[5:0] <= {clock_ready_d[4:0],clock_ready};
159
   wire 	dcm_rst = ~&clock_ready_d & |clock_ready_d;
160

    
161
   // ADC A is inverted on the schematic to facilitate a clean layout
162
   //  We account for that here by inverting it
163
`ifdef LVDS
164
   wire [13:0] 	adc_a, adc_a_inv, adc_b;
165
   capture_ddrlvds #(.WIDTH(14)) capture_ddrlvds
166
     (.clk(dsp_clk), .ssclk_p(ADC_clkout_p), .ssclk_n(ADC_clkout_n), 
167
      .in_p({{ADCA_12_p, ADCA_10_p, ADCA_8_p, ADCA_6_p, ADCA_4_p, ADCA_2_p, ADCA_0_p},
168
	     {ADCB_12_p, ADCB_10_p, ADCB_8_p, ADCB_6_p, ADCB_4_p, ADCB_2_p, ADCB_0_p}}), 
169
      .in_n({{ADCA_12_n, ADCA_10_n, ADCA_8_n, ADCA_6_n, ADCA_4_n, ADCA_2_n, ADCA_0_n},
170
	     {ADCB_12_n, ADCB_10_n, ADCB_8_n, ADCB_6_n, ADCB_4_n, ADCB_2_n, ADCB_0_n}}), 
171
      .out({adc_a_inv,adc_b}));
172
   assign adc_a = ~adc_a_inv;
173
`else
174
   reg [13:0] 	adc_a, adc_b;
175
   always @(posedge dsp_clk)
176
     begin
177
	adc_a <= ~{ADCA_12_p,ADCA_12_n, ADCA_10_p,ADCA_10_n, ADCA_8_p,ADCA_8_n, ADCA_6_p,ADCA_6_n,
178
		   ADCA_4_p,ADCA_4_n, ADCA_2_p,ADCA_2_n, ADCA_0_p,ADCA_0_n };
179
	adc_b <= {ADCB_12_p,ADCB_12_n, ADCB_10_p,ADCB_10_n, ADCB_8_p,ADCB_8_n, ADCB_6_p,ADCB_6_n,
180
		   ADCB_4_p,ADCB_4_n, ADCB_2_p,ADCB_2_n, ADCB_0_p,ADCB_0_n };
181
     end
182
`endif // !`ifdef LVDS
183
   
184
   // Handle Clocks
185
   DCM DCM_INST (.CLKFB(dsp_clk), 
186
                 .CLKIN(clk_fpga), 
187
                 .DSSEN(0), 
188
                 .PSCLK(0), 
189
                 .PSEN(0), 
190
                 .PSINCDEC(0), 
191
                 .RST(dcm_rst), 
192
                 .CLKDV(clk_div), 
193
                 .CLKFX(), 
194
                 .CLKFX180(), 
195
                 .CLK0(dcm_out), 
196
                 .CLK2X(), 
197
                 .CLK2X180(), 
198
                 .CLK90(), 
199
                 .CLK180(), 
200
                 .CLK270(clk270_100), 
201
                 .LOCKED(LOCKED_OUT), 
202
                 .PSDONE(), 
203
                 .STATUS());
204
   defparam DCM_INST.CLK_FEEDBACK = "1X";
205
   defparam DCM_INST.CLKDV_DIVIDE = 2.0;
206
   defparam DCM_INST.CLKFX_DIVIDE = 1;
207
   defparam DCM_INST.CLKFX_MULTIPLY = 4;
208
   defparam DCM_INST.CLKIN_DIVIDE_BY_2 = "FALSE";
209
   defparam DCM_INST.CLKIN_PERIOD = 10.000;
210
   defparam DCM_INST.CLKOUT_PHASE_SHIFT = "NONE";
211
   defparam DCM_INST.DESKEW_ADJUST = "SYSTEM_SYNCHRONOUS";
212
   defparam DCM_INST.DFS_FREQUENCY_MODE = "LOW";
213
   defparam DCM_INST.DLL_FREQUENCY_MODE = "LOW";
214
   defparam DCM_INST.DUTY_CYCLE_CORRECTION = "TRUE";
215
   defparam DCM_INST.FACTORY_JF = 16'h8080;
216
   defparam DCM_INST.PHASE_SHIFT = 0;
217
   defparam DCM_INST.STARTUP_WAIT = "FALSE";
218

    
219
   BUFG dspclk_BUFG (.I(dcm_out), .O(dsp_clk));
220
   BUFG wbclk_BUFG (.I(clk_div), .O(wb_clk));
221

    
222
   // Create clock for external SRAM thats -90degree phase to DSPCLK (i.e) 2nS earlier at 100MHz.
223
   BUFG  clk270_100_buf_i1 (.I(clk270_100), 
224
			    .O(clk270_100_buf));
225
   OFDDRRSE RAM_CLK_i1 (.Q(RAM_CLK),
226
			.C0(clk270_100_buf),
227
			.C1(~clk270_100_buf),
228
			.CE(1'b1),
229
			.D0(1'b1),
230
			.D1(1'b0),
231
			.R(1'b0),
232
			.S(1'b0));
233
  
234
   // I2C -- Don't use external transistors for open drain, the FPGA implements this
235
   IOBUF scl_pin(.O(scl_pad_i), .IO(SCL), .I(scl_pad_o), .T(scl_pad_oen_o));
236
   IOBUF sda_pin(.O(sda_pad_i), .IO(SDA), .I(sda_pad_o), .T(sda_pad_oen_o));
237

    
238
   // LEDs are active low outputs
239
   wire [5:0] leds_int;
240
   assign     {ETH_LED,leds} = {6'b011111 ^ leds_int};  // drive low to turn on leds
241
   
242
   // SPI
243
   wire       miso, mosi, sclk;
244

    
245
   assign 	{SCLK_CLK,MOSI_CLK} 	   = ~SEN_CLK ? {sclk,mosi} : 2'B0;
246
   assign 	{SCLK_DAC,MOSI_DAC} 	   = ~SEN_DAC ? {sclk,mosi} : 2'B0;
247
   assign 	{SCLK_ADC,MOSI_ADC} 	   = ~SEN_ADC ? {sclk,mosi} : 2'B0;
248
   assign 	{SCLK_TX_DB,MOSI_TX_DB}    = ~SEN_TX_DB ? {sclk,mosi} : 2'B0;
249
   assign 	{SCLK_TX_DAC,MOSI_TX_DAC}  = ~SEN_TX_DAC ? {sclk,mosi} : 2'B0;
250
   assign 	{SCLK_TX_ADC,MOSI_TX_ADC}  = ~SEN_TX_ADC ? {sclk,mosi} : 2'B0;
251
   assign 	{SCLK_RX_DB,MOSI_RX_DB}    = ~SEN_RX_DB ? {sclk,mosi} : 2'B0;
252
   assign 	{SCLK_RX_DAC,MOSI_RX_DAC}  = ~SEN_RX_DAC ? {sclk,mosi} : 2'B0;
253
   assign 	{SCLK_RX_ADC,MOSI_RX_ADC}  = ~SEN_RX_ADC ? {sclk,mosi} : 2'B0;
254
   
255
   assign 	miso 			   = (~SEN_CLK & MISO_CLK) | (~SEN_DAC & MISO_DAC) |
256
					     (~SEN_TX_DB & MISO_TX_DB) | (~SEN_TX_ADC & MISO_TX_ADC) |
257
					     (~SEN_RX_DB & MISO_RX_DB) | (~SEN_RX_ADC & MISO_RX_ADC);
258
   
259
   wire 	GMII_TX_EN_unreg, GMII_TX_ER_unreg;
260
   wire [7:0] 	GMII_TXD_unreg;
261
   wire 	GMII_GTX_CLK_int;
262
   
263
   always @(posedge GMII_GTX_CLK_int)
264
     begin
265
	GMII_TX_EN <= GMII_TX_EN_unreg;
266
	GMII_TX_ER <= GMII_TX_ER_unreg;
267
	GMII_TXD <= GMII_TXD_unreg;
268
     end
269

    
270
   OFDDRRSE OFDDRRSE_gmii_inst 
271
     (.Q(GMII_GTX_CLK),      // Data output (connect directly to top-level port)
272
      .C0(GMII_GTX_CLK_int),    // 0 degree clock input
273
      .C1(~GMII_GTX_CLK_int),    // 180 degree clock input
274
      .CE(1),    // Clock enable input
275
      .D0(0),    // Posedge data input
276
      .D1(1),    // Negedge data input
277
      .R(0),      // Synchronous reset input
278
      .S(0)       // Synchronous preset input
279
      );
280
   
281
   wire ser_tklsb_unreg, ser_tkmsb_unreg;
282
   wire [15:0] ser_t_unreg;
283
   wire        ser_tx_clk_int;
284
   
285
   always @(posedge ser_tx_clk_int)
286
     begin
287
	ser_tklsb <= ser_tklsb_unreg;
288
	ser_tkmsb <= ser_tkmsb_unreg;
289
	ser_t <= ser_t_unreg;
290
     end
291

    
292
   assign ser_tx_clk = clk_fpga;
293

    
294
   reg [15:0] ser_r_int;
295
   reg 	      ser_rklsb_int, ser_rkmsb_int;
296

    
297
   always @(posedge ser_rx_clk)
298
     begin
299
	ser_r_int <= ser_r;
300
	ser_rklsb_int <= ser_rklsb;
301
	ser_rkmsb_int <= ser_rkmsb;
302
     end
303
   
304
   /*
305
   OFDDRRSE OFDDRRSE_serdes_inst 
306
     (.Q(ser_tx_clk),      // Data output (connect directly to top-level port)
307
      .C0(ser_tx_clk_int),    // 0 degree clock input
308
      .C1(~ser_tx_clk_int),    // 180 degree clock input
309
      .CE(1),    // Clock enable input
310
      .D0(0),    // Posedge data input
311
      .D1(1),    // Negedge data input
312
      .R(0),      // Synchronous reset input
313
      .S(0)       // Synchronous preset input
314
      );
315
   */
316

    
317

    
318
   //
319
   // Instantiate IO for Bidirectional bus to SRAM
320
   //
321
   wire [35:0] RAM_D_pi;
322
   wire [35:0] RAM_D_po;
323
   wire        RAM_D_poe;
324
   
325
   genvar      i;
326
   
327
   generate  
328
      for (i=0;i<36;i=i+1)
329
        begin : gen_RAM_D_IO
330

    
331
	   IOBUF #(
332
		   .DRIVE(12),
333
		   .IOSTANDARD("LVCMOS25"),
334
		   .SLEW("FAST")
335
		   )
336
	     RAM_D_i (
337
		      .O(RAM_D_pi[i]),
338
		      .I(RAM_D_po[i]),
339
		      .IO(RAM_D[i]),
340
		      .T(RAM_D_poe)
341
		      );
342
	end // block: gen_RAM_D_IO
343
   endgenerate
344

    
345
   
346
   
347
   wire [15:0] dac_a_int, dac_b_int;
348
   // DAC A and B are swapped in schematic to facilitate clean layout
349
   // DAC A is also inverted in schematic to facilitate clean layout
350
   always @(negedge dsp_clk) DACA <= ~dac_b_int;
351
   always @(negedge dsp_clk) DACB <= dac_a_int;
352

    
353
   wire 	pps;
354
   assign pps = PPS_IN ^ PPS2_IN;
355
   
356
   u2plus_core u2p_c(.dsp_clk           (dsp_clk),
357
		     .wb_clk            (wb_clk),
358
		     .clock_ready       (clock_ready),
359
		     .clk_to_mac	(CLK_TO_MAC_int2),
360
		     .pps_in		(pps),
361
		     .leds		(leds_int),
362
		     .debug		(debug[31:0]),
363
		     .debug_clk		(debug_clk[1:0]),
364
		     .exp_time_in	(exp_time_in),
365
		     .exp_time_out	(exp_time_out),
366
		     .GMII_COL		(GMII_COL),
367
		     .GMII_CRS		(GMII_CRS),
368
		     .GMII_TXD		(GMII_TXD_unreg[7:0]),
369
		     .GMII_TX_EN	(GMII_TX_EN_unreg),
370
		     .GMII_TX_ER	(GMII_TX_ER_unreg),
371
		     .GMII_GTX_CLK	(GMII_GTX_CLK_int),
372
		     .GMII_TX_CLK	(GMII_TX_CLK),
373
		     .GMII_RXD		(GMII_RXD[7:0]),
374
		     .GMII_RX_CLK	(GMII_RX_CLK),
375
		     .GMII_RX_DV	(GMII_RX_DV),
376
		     .GMII_RX_ER	(GMII_RX_ER),
377
		     .MDIO		(MDIO),
378
		     .MDC		(MDC),
379
		     .PHY_INTn		(PHY_INTn),
380
		     .PHY_RESETn	(PHY_RESETn),
381
		     .ser_enable	(ser_enable),
382
		     .ser_prbsen	(ser_prbsen),
383
		     .ser_loopen	(ser_loopen),
384
		     .ser_rx_en		(ser_rx_en),
385
		     .ser_tx_clk	(ser_tx_clk_int),
386
		     .ser_t		(ser_t_unreg[15:0]),
387
		     .ser_tklsb		(ser_tklsb_unreg),
388
		     .ser_tkmsb		(ser_tkmsb_unreg),
389
		     .ser_rx_clk	(ser_rx_clk),
390
		     .ser_r		(ser_r_int[15:0]),
391
		     .ser_rklsb		(ser_rklsb_int),
392
		     .ser_rkmsb		(ser_rkmsb_int),
393
		     .adc_a		(adc_a[13:0]),
394
		     .adc_ovf_a		(1'b0),
395
		     .adc_on_a		(),
396
		     .adc_oe_a		(),
397
		     .adc_b		(adc_b[13:0]),
398
		     .adc_ovf_b		(1'b0),
399
		     .adc_on_b		(),
400
		     .adc_oe_b		(),
401
		     .dac_a		(dac_a_int[15:0]),
402
		     .dac_b		(dac_b_int[15:0]),
403
		     .scl_pad_i		(scl_pad_i),
404
		     .scl_pad_o		(scl_pad_o),
405
		     .scl_pad_oen_o	(scl_pad_oen_o),
406
		     .sda_pad_i		(sda_pad_i),
407
		     .sda_pad_o		(sda_pad_o),
408
		     .sda_pad_oen_o	(sda_pad_oen_o),
409
		     .clk_en		(clk_en[1:0]),
410
		     .clk_sel		(clk_sel[1:0]),
411
		     .clk_func		(clk_func),
412
		     .clk_status	(clk_status),
413
		     .sclk		(sclk),
414
		     .mosi		(mosi),
415
		     .miso		(miso),
416
		     .sen_clk		(SEN_CLK),
417
		     .sen_dac		(SEN_DAC),
418
		     .sen_adc           (SEN_ADC),
419
		     .sen_tx_db		(SEN_TX_DB),
420
		     .sen_tx_adc	(SEN_TX_ADC),
421
		     .sen_tx_dac	(SEN_TX_DAC),
422
		     .sen_rx_db		(SEN_RX_DB),
423
		     .sen_rx_adc	(SEN_RX_ADC),
424
		     .sen_rx_dac	(SEN_RX_DAC),
425
		     .io_tx		(io_tx[15:0]),
426
		     .io_rx		(io_rx[15:0]),
427
		     .RAM_D_po          (RAM_D_po),
428
		     .RAM_D_pi          (RAM_D_pi),
429
		     .RAM_D_poe         (RAM_D_poe),
430
		     .RAM_A             (RAM_A),
431
		     .RAM_CE1n          (RAM_CE1n),
432
		     .RAM_CENn          (RAM_CENn),
433
		     .RAM_WEn           (RAM_WEn),
434
		     .RAM_OEn           (RAM_OEn),
435
		     .RAM_LDn           (RAM_LDn), 
436
		     .uart_tx_o         (TXD[3:1]),
437
		     .uart_rx_i         ({1'b1,RXD[3:1]}),
438
		     .uart_baud_o       (),
439
		     .sim_mode          (1'b0),
440
		     .clock_divider     (2),
441
		     .button            (FPGA_RESET),
442
		     .spiflash_cs       (flash_cs),
443
		     .spiflash_clk      (flash_clk),
444
		     .spiflash_miso     (flash_miso),
445
		     .spiflash_mosi     (flash_mosi)
446
		     );
447

    
448
   // Drive low so that RAM does not sleep.
449
   assign RAM_ZZ = 0;
450
   // Byte Writes are qualified by the global write enable
451
   // Always do 36bit operations to extram.
452
   assign RAM_BWn = 4'b0000;
453
   
454
endmodule // u2plus