Statistics
| Branch: | Tag: | Revision:

root / usrp2 / top / N2x0 / u2plus.v @ 8c8da195

History | View | Annotate | Download (14.8 KB)

1
//
2
// Copyright 2011 Ettus Research LLC
3
//
4
// This program is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// This program is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
//
17

    
18
`timescale 1ns / 1ps
19
//`define LVDS 1
20
//`define DCM_FOR_RAMCLK
21
//////////////////////////////////////////////////////////////////////////////////
22

    
23
module u2plus
24
  (
25
   input CLK_FPGA_P, input CLK_FPGA_N,  // Diff
26
   
27
   // ADC
28
   input ADC_clkout_p, input ADC_clkout_n,
29
   input ADCA_12_p, input ADCA_12_n,
30
   input ADCA_10_p, input ADCA_10_n,
31
   input ADCA_8_p, input ADCA_8_n,
32
   input ADCA_6_p, input ADCA_6_n,
33
   input ADCA_4_p, input ADCA_4_n,
34
   input ADCA_2_p, input ADCA_2_n,
35
   input ADCA_0_p, input ADCA_0_n,
36
   input ADCB_12_p, input ADCB_12_n,
37
   input ADCB_10_p, input ADCB_10_n,
38
   input ADCB_8_p, input ADCB_8_n,
39
   input ADCB_6_p, input ADCB_6_n,
40
   input ADCB_4_p, input ADCB_4_n,
41
   input ADCB_2_p, input ADCB_2_n,
42
   input ADCB_0_p, input ADCB_0_n,
43
   
44
   // DAC
45
   output reg [15:0] DACA,
46
   output reg [15:0] DACB,
47
   input DAC_LOCK,     // unused for now
48
   
49
   // DB IO Pins
50
   inout [15:0] io_tx,
51
   inout [15:0] io_rx,
52

    
53
   // Misc, debug
54
   output [5:1] leds,  // LED4 is shared w/INIT_B
55
   input FPGA_RESET,
56
   output [1:0] debug_clk,
57
   output [31:0] debug,
58
   output [3:1] TXD, input [3:1] RXD, // UARTs
59
   //input [3:0] dipsw,  // Forgot DIP Switches...
60
   
61
   // Clock Gen Control
62
   output [1:0] clk_en,
63
   output [1:0] clk_sel,
64
   input CLK_FUNC,        // FIXME is an input to control the 9510
65
   input clk_status,
66

    
67
   inout SCL, inout SDA,   // I2C
68

    
69
   // PPS
70
   input PPS_IN, input PPS2_IN,
71

    
72
   // SPI
73
   output SEN_CLK, output SCLK_CLK, output MOSI_CLK, input MISO_CLK,
74
   output SEN_DAC, output SCLK_DAC, output MOSI_DAC, input MISO_DAC,
75
   output SEN_ADC, output SCLK_ADC, output MOSI_ADC,
76
   output SEN_TX_DB, output SCLK_TX_DB, output MOSI_TX_DB, input MISO_TX_DB,
77
   output SEN_TX_DAC, output SCLK_TX_DAC, output MOSI_TX_DAC,
78
   output SEN_TX_ADC, output SCLK_TX_ADC, output MOSI_TX_ADC, input MISO_TX_ADC,
79
   output SEN_RX_DB, output SCLK_RX_DB, output MOSI_RX_DB, input MISO_RX_DB,
80
   output SEN_RX_DAC, output SCLK_RX_DAC, output MOSI_RX_DAC,
81
   output SEN_RX_ADC, output SCLK_RX_ADC, output MOSI_RX_ADC, input MISO_RX_ADC,
82

    
83
   // GigE PHY
84
   input CLK_TO_MAC,
85

    
86
   output reg [7:0] GMII_TXD,
87
   output reg GMII_TX_EN,
88
   output reg GMII_TX_ER,
89
   output GMII_GTX_CLK,
90
   input GMII_TX_CLK,  // 100mbps clk
91

    
92
   input GMII_RX_CLK,
93
   input [7:0] GMII_RXD,
94
   input GMII_RX_DV,
95
   input GMII_RX_ER,
96
   input GMII_COL,
97
   input GMII_CRS,
98

    
99
   input PHY_INTn,   // open drain
100
   inout MDIO,
101
   output MDC,
102
   output PHY_RESETn,
103
   output ETH_LED,
104
   
105
//   input POR,
106
   
107
   // Expansion
108
   input exp_time_in_p, input exp_time_in_n, // Diff
109
   output exp_time_out_p, output exp_time_out_n, // Diff 
110
   input exp_user_in_p, input exp_user_in_n, // Diff
111
   output exp_user_out_p, output exp_user_out_n, // Diff 
112
   
113
   // SERDES
114
   output ser_enable,
115
   output ser_prbsen,
116
   output ser_loopen,
117
   output ser_rx_en,
118
   
119
   output ser_tx_clk,
120
   output reg [15:0] ser_t,
121
   output reg ser_tklsb,
122
   output reg ser_tkmsb,
123

    
124
   input ser_rx_clk,
125
   input [15:0] ser_r,
126
   input ser_rklsb,
127
   input ser_rkmsb,
128

    
129
   // SRAM
130
   inout [35:0] RAM_D,
131
   output [20:0] RAM_A,
132
   output [3:0] RAM_BWn,
133
   output RAM_ZZ,
134
   output RAM_LDn,
135
   output RAM_OEn,
136
   output RAM_WEn,
137
   output RAM_CENn,
138
   output RAM_CLK,
139
   
140
   // SPI Flash
141
   output flash_cs,
142
   output flash_clk,
143
   output flash_mosi,
144
   input flash_miso
145
   );
146

    
147
   wire  CLK_TO_MAC_int, CLK_TO_MAC_int2;
148
   IBUFG phyclk (.O(CLK_TO_MAC_int), .I(CLK_TO_MAC));
149
   BUFG phyclk2 (.O(CLK_TO_MAC_int2), .I(CLK_TO_MAC_int));
150
      
151
   // FPGA-specific pins connections
152
   wire 	clk_fpga, dsp_clk, clk_div, dcm_out, wb_clk, clock_ready;
153

    
154
   IBUFGDS clk_fpga_pin (.O(clk_fpga),.I(CLK_FPGA_P),.IB(CLK_FPGA_N));
155
   defparam 	clk_fpga_pin.IOSTANDARD = "LVPECL_25";
156
   
157
   wire 	exp_time_in;
158
   IBUFDS exp_time_in_pin (.O(exp_time_in),.I(exp_time_in_p),.IB(exp_time_in_n));
159
   defparam 	exp_time_in_pin.IOSTANDARD = "LVDS_25";
160
   
161
   wire 	exp_time_out;
162
   OBUFDS exp_time_out_pin (.O(exp_time_out_p),.OB(exp_time_out_n),.I(exp_time_out));
163
   defparam 	exp_time_out_pin.IOSTANDARD  = "LVDS_25";
164

    
165
   wire 	exp_user_in;
166
   IBUFDS exp_user_in_pin (.O(exp_user_in),.I(exp_user_in_p),.IB(exp_user_in_n));
167
   defparam 	exp_user_in_pin.IOSTANDARD = "LVDS_25";
168
   
169
   wire 	exp_user_out;
170
   OBUFDS exp_user_out_pin (.O(exp_user_out_p),.OB(exp_user_out_n),.I(exp_user_out));
171
   defparam 	exp_user_out_pin.IOSTANDARD  = "LVDS_25";
172

    
173
   reg [5:0] 	clock_ready_d;
174
   always @(posedge clk_fpga)
175
     clock_ready_d[5:0] <= {clock_ready_d[4:0],clock_ready};
176
   wire 	dcm_rst = ~&clock_ready_d & |clock_ready_d;
177

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

    
238
   BUFG dspclk_BUFG (.I(dcm_out), .O(dsp_clk));
239
   BUFG wbclk_BUFG (.I(clk_div), .O(wb_clk));
240

    
241
   // Create clock for external SRAM thats -90degree phase to DSPCLK (i.e) 2nS earlier at 100MHz.
242
   BUFG  clk270_100_buf_i1 (.I(clk270_100), 
243
			    .O(clk270_100_buf));
244
   OFDDRRSE RAM_CLK_i1 (.Q(RAM_CLK),
245
			.C0(clk270_100_buf),
246
			.C1(~clk270_100_buf),
247
			.CE(1'b1),
248
			.D0(1'b1),
249
			.D1(1'b0),
250
			.R(1'b0),
251
			.S(1'b0));
252
  
253
   // I2C -- Don't use external transistors for open drain, the FPGA implements this
254
   IOBUF scl_pin(.O(scl_pad_i), .IO(SCL), .I(scl_pad_o), .T(scl_pad_oen_o));
255
   IOBUF sda_pin(.O(sda_pad_i), .IO(SDA), .I(sda_pad_o), .T(sda_pad_oen_o));
256

    
257
   // LEDs are active low outputs
258
   wire [5:0] leds_int;
259
   assign     {ETH_LED,leds} = {6'b011111 ^ leds_int};  // drive low to turn on leds
260
   
261
   // SPI
262
   wire       miso, mosi, sclk;
263

    
264
   assign 	{SCLK_CLK,MOSI_CLK} 	   = ~SEN_CLK ? {sclk,mosi} : 2'B0;
265
   assign 	{SCLK_DAC,MOSI_DAC} 	   = ~SEN_DAC ? {sclk,mosi} : 2'B0;
266
   assign 	{SCLK_ADC,MOSI_ADC} 	   = ~SEN_ADC ? {sclk,mosi} : 2'B0;
267
   assign 	{SCLK_TX_DB,MOSI_TX_DB}    = ~SEN_TX_DB ? {sclk,mosi} : 2'B0;
268
   assign 	{SCLK_TX_DAC,MOSI_TX_DAC}  = ~SEN_TX_DAC ? {sclk,mosi} : 2'B0;
269
   assign 	{SCLK_TX_ADC,MOSI_TX_ADC}  = ~SEN_TX_ADC ? {sclk,mosi} : 2'B0;
270
   assign 	{SCLK_RX_DB,MOSI_RX_DB}    = ~SEN_RX_DB ? {sclk,mosi} : 2'B0;
271
   assign 	{SCLK_RX_DAC,MOSI_RX_DAC}  = ~SEN_RX_DAC ? {sclk,mosi} : 2'B0;
272
   assign 	{SCLK_RX_ADC,MOSI_RX_ADC}  = ~SEN_RX_ADC ? {sclk,mosi} : 2'B0;
273
   
274
   assign 	miso 			   = (~SEN_CLK & MISO_CLK) | (~SEN_DAC & MISO_DAC) |
275
					     (~SEN_TX_DB & MISO_TX_DB) | (~SEN_TX_ADC & MISO_TX_ADC) |
276
					     (~SEN_RX_DB & MISO_RX_DB) | (~SEN_RX_ADC & MISO_RX_ADC);
277
   
278
   wire 	GMII_TX_EN_unreg, GMII_TX_ER_unreg;
279
   wire [7:0] 	GMII_TXD_unreg;
280
   wire 	GMII_GTX_CLK_int;
281
   
282
   always @(posedge GMII_GTX_CLK_int)
283
     begin
284
	GMII_TX_EN <= GMII_TX_EN_unreg;
285
	GMII_TX_ER <= GMII_TX_ER_unreg;
286
	GMII_TXD <= GMII_TXD_unreg;
287
     end
288

    
289
   OFDDRRSE OFDDRRSE_gmii_inst 
290
     (.Q(GMII_GTX_CLK),      // Data output (connect directly to top-level port)
291
      .C0(GMII_GTX_CLK_int),    // 0 degree clock input
292
      .C1(~GMII_GTX_CLK_int),    // 180 degree clock input
293
      .CE(1),    // Clock enable input
294
      .D0(0),    // Posedge data input
295
      .D1(1),    // Negedge data input
296
      .R(0),      // Synchronous reset input
297
      .S(0)       // Synchronous preset input
298
      );
299
   
300
   wire ser_tklsb_unreg, ser_tkmsb_unreg;
301
   wire [15:0] ser_t_unreg;
302
   wire        ser_tx_clk_int;
303
   
304
   always @(posedge ser_tx_clk_int)
305
     begin
306
	ser_tklsb <= ser_tklsb_unreg;
307
	ser_tkmsb <= ser_tkmsb_unreg;
308
	ser_t <= ser_t_unreg;
309
     end
310

    
311
   assign ser_tx_clk = clk_fpga;
312

    
313
   reg [15:0] ser_r_int;
314
   reg 	      ser_rklsb_int, ser_rkmsb_int;
315

    
316
   always @(posedge ser_rx_clk)
317
     begin
318
	ser_r_int <= ser_r;
319
	ser_rklsb_int <= ser_rklsb;
320
	ser_rkmsb_int <= ser_rkmsb;
321
     end
322
   
323
   /*
324
   OFDDRRSE OFDDRRSE_serdes_inst 
325
     (.Q(ser_tx_clk),      // Data output (connect directly to top-level port)
326
      .C0(ser_tx_clk_int),    // 0 degree clock input
327
      .C1(~ser_tx_clk_int),    // 180 degree clock input
328
      .CE(1),    // Clock enable input
329
      .D0(0),    // Posedge data input
330
      .D1(1),    // Negedge data input
331
      .R(0),      // Synchronous reset input
332
      .S(0)       // Synchronous preset input
333
      );
334
   */
335

    
336

    
337
   //
338
   // Instantiate IO for Bidirectional bus to SRAM
339
   //
340
   wire [35:0] RAM_D_pi;
341
   wire [35:0] RAM_D_po;
342
   wire        RAM_D_poe;
343
   
344
   genvar      i;
345
   
346
   generate  
347
      for (i=0;i<36;i=i+1)
348
        begin : gen_RAM_D_IO
349

    
350
	   IOBUF #(
351
		   .DRIVE(12),
352
		   .IOSTANDARD("LVCMOS25"),
353
		   .SLEW("FAST")
354
		   )
355
	     RAM_D_i (
356
		      .O(RAM_D_pi[i]),
357
		      .I(RAM_D_po[i]),
358
		      .IO(RAM_D[i]),
359
		      .T(RAM_D_poe)
360
		      );
361
	end // block: gen_RAM_D_IO
362
   endgenerate
363

    
364
   
365
   
366
   wire [15:0] dac_a_int, dac_b_int;
367
   // DAC A and B are swapped in schematic to facilitate clean layout
368
   // DAC A is also inverted in schematic to facilitate clean layout
369
   always @(negedge dsp_clk) DACA <= ~dac_b_int;
370
   always @(negedge dsp_clk) DACB <= dac_a_int;
371

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

    
467
   // Drive low so that RAM does not sleep.
468
   assign RAM_ZZ = 0;
469
   // Byte Writes are qualified by the global write enable
470
   // Always do 36bit operations to extram.
471
   assign RAM_BWn = 4'b0000;
472
   
473
endmodule // u2plus