AMC13
Firmwares for the different applications of the AMC13 uTCA board made at Boston University
 All Classes Files Variables
mig_7series_v1_9_ddr_byte_group_io.v
1  /*****************************************************************
2 -- (c) Copyright 2011 - 2013 Xilinx, Inc. All rights reserved.
3 --
4 -- This file contains confidential and proprietary information
5 -- of Xilinx, Inc. and is protected under U.S. and
6 -- international copyright and other intellectual property
7 -- laws.
8 --
9 -- DISCLAIMER
10 -- This disclaimer is not a license and does not grant any
11 -- rights to the materials distributed herewith. Except as
12 -- otherwise provided in a valid license issued to you by
13 -- Xilinx, and to the maximum extent permitted by applicable
14 -- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
15 -- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
16 -- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
17 -- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
18 -- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
19 -- (2) Xilinx shall not be liable (whether in contract or tort,
20 -- including negligence, or under any other theory of
21 -- liability) for any loss or damage of any kind or nature
22 -- related to, arising under or in connection with these
23 -- materials, including for any direct, or any indirect,
24 -- special, incidental, or consequential loss or damage
25 -- (including loss of data, profits, goodwill, or any type of
26 -- loss or damage suffered as a result of any action brought
27 -- by a third party) even if such damage or loss was
28 -- reasonably foreseeable or Xilinx had been advised of the
29 -- possibility of the same.
30 --
31 -- CRITICAL APPLICATIONS
32 -- Xilinx products are not designed or intended to be fail-
33 -- safe, or for use in any application requiring fail-safe
34 -- performance, such as life-support or safety devices or
35 -- systems, Class III medical devices, nuclear facilities,
36 -- applications related to the deployment of airbags, or any
37 -- other applications that could lead to death, personal
38 -- injury, or severe property or environmental damage
39 -- (individually and collectively, "Critical
40 -- Applications"). A Customer assumes the sole risk and
41 -- liability of any use of Xilinx products in Critical
42 -- Applications, subject only to applicable laws and
43 -- regulations governing limitations on product liability.
44 --
45 -- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
46 -- PART OF THIS FILE AT ALL TIMES.
47 
48 //
49 //
50 // Owner: Gary Martin
51 // Revision: $Id: //depot/icm/proj/common/head/rtl/v32_cmt/rtl/phy/byte_group_io.v#4 $
52 // $Author: $
53 // $DateTime: $
54 // $Change: $
55 // Description:
56 // This verilog file is a paramertizable I/O termination for
57 // the single byte lane.
58 // to create a N byte-lane wide phy.
59 //
60 // History:
61 // Date Engineer Description
62 // 04/01/2010 G. Martin Initial Checkin.
63 //
64 //////////////////////////////////////////////////////////////////
65 ******************************************************************/
66 
67 `timescale 1ps/1ps
68 
70 // bit lane existance
71  parameter BITLANES = 12'b1111_1111_1111,
72  parameter BITLANES_OUTONLY = 12'b0000_0000_0000,
73  parameter PO_DATA_CTL = "FALSE",
74  parameter OSERDES_DATA_RATE = "DDR",
75  parameter OSERDES_DATA_WIDTH = 4,
76  parameter IDELAYE2_IDELAY_TYPE = "VARIABLE",
77  parameter IDELAYE2_IDELAY_VALUE = 00,
78  parameter IODELAY_GRP = "IODELAY_MIG",
79 // local usage only, don't pass down
80  parameter BUS_WIDTH = 12,
81  parameter SYNTHESIS = "FALSE"
82  )
83  (
84  input [9:0] mem_dq_in,
85  output [BUS_WIDTH-1:0] mem_dq_out,
86  output [BUS_WIDTH-1:0] mem_dq_ts,
87  input mem_dqs_in,
88  output mem_dqs_out,
89  output mem_dqs_ts,
90  output [(4*10)-1:0] iserdes_dout, // 2 extra 12-bit lanes not used
91  output dqs_to_phaser,
92  input iserdes_clk,
93  input iserdes_clkb,
94  input iserdes_clkdiv,
95  input phy_clk,
96  input rst,
97  input oserdes_rst,
98  input iserdes_rst,
99  input [1:0] oserdes_dqs,
100  input [1:0] oserdes_dqsts,
101  input [(4*BUS_WIDTH)-1:0] oserdes_dq,
102  input [1:0] oserdes_dqts,
103  input oserdes_clk,
104  input oserdes_clk_delayed,
105  input oserdes_clkdiv,
106  input idelay_inc,
107  input idelay_ce,
108  input idelay_ld,
109  input idelayctrl_refclk
110  );
111 
112 
113 
114 /// INSTANCES
115 
116 
117 localparam ISERDES_DQ_DATA_RATE = "DDR";
118 localparam ISERDES_DQ_DATA_WIDTH = 4;
119 localparam ISERDES_DQ_DYN_CLKDIV_INV_EN = "FALSE";
120 localparam ISERDES_DQ_DYN_CLK_INV_EN = "FALSE";
121 localparam ISERDES_DQ_INIT_Q1 = 1'b0;
122 localparam ISERDES_DQ_INIT_Q2 = 1'b0;
123 localparam ISERDES_DQ_INIT_Q3 = 1'b0;
124 localparam ISERDES_DQ_INIT_Q4 = 1'b0;
125 localparam ISERDES_DQ_INTERFACE_TYPE = "MEMORY_DDR3";
126 localparam ISERDES_NUM_CE = 2;
127 localparam ISERDES_DQ_IOBDELAY = "IFD";
128 localparam ISERDES_DQ_OFB_USED = "FALSE";
129 localparam ISERDES_DQ_SERDES_MODE = "MASTER";
130 localparam ISERDES_DQ_SRVAL_Q1 = 1'b0;
131 localparam ISERDES_DQ_SRVAL_Q2 = 1'b0;
132 localparam ISERDES_DQ_SRVAL_Q3 = 1'b0;
133 localparam ISERDES_DQ_SRVAL_Q4 = 1'b0;
134 
135 wire [BUS_WIDTH-1:0] data_in_dly;
136 wire [BUS_WIDTH-1:0] oserdes_dq_buf;
137 wire [BUS_WIDTH-1:0] oserdes_dqts_buf;
138 wire oserdes_dqs_buf;
139 wire oserdes_dqsts_buf;
140 wire [9:0] data_in;
141 wire tbyte_out;
142 
143 assign mem_dq_out = oserdes_dq_buf;
144 assign mem_dq_ts = oserdes_dqts_buf;
145 assign data_in = mem_dq_in;
146 
147 assign mem_dqs_out = oserdes_dqs_buf;
148 assign mem_dqs_ts = oserdes_dqsts_buf;
149 assign dqs_to_phaser = mem_dqs_in;
150 
151 reg iserdes_clk_d;
152 
153 always @(*)
154  iserdes_clk_d <= #(025) iserdes_clk;
155 
156 reg idelay_ld_rst;
157 reg rst_r1;
158 reg rst_r2;
159 reg rst_r3;
160 reg rst_r4;
161 
162 always @(posedge phy_clk) begin
163  rst_r1 <= #1 rst;
164  rst_r2 <= #1 rst_r1;
165  rst_r3 <= #1 rst_r2;
166  rst_r4 <= #1 rst_r3;
167 end
168 
169 always @(posedge phy_clk) begin
170  if (rst)
171  idelay_ld_rst <= #1 1'b1;
172  else if (rst_r4)
173  idelay_ld_rst <= #1 1'b0;
174 end
175 
176 
177 genvar i;
178 
179 generate
180 
181 for ( i = 0; i != 10 && PO_DATA_CTL == "TRUE" ; i=i+1) begin : input_
182  if ( BITLANES[i] && !BITLANES_OUTONLY[i]) begin : iserdes_dq_
183 
184  ISERDESE2 #(
185  .DATA_RATE ( ISERDES_DQ_DATA_RATE),
186  .DATA_WIDTH ( ISERDES_DQ_DATA_WIDTH),
187  .DYN_CLKDIV_INV_EN ( ISERDES_DQ_DYN_CLKDIV_INV_EN),
188  .DYN_CLK_INV_EN ( ISERDES_DQ_DYN_CLK_INV_EN),
189  .INIT_Q1 ( ISERDES_DQ_INIT_Q1),
190  .INIT_Q2 ( ISERDES_DQ_INIT_Q2),
191  .INIT_Q3 ( ISERDES_DQ_INIT_Q3),
192  .INIT_Q4 ( ISERDES_DQ_INIT_Q4),
193  .INTERFACE_TYPE ( ISERDES_DQ_INTERFACE_TYPE),
194  .NUM_CE ( ISERDES_NUM_CE),
195  .IOBDELAY ( ISERDES_DQ_IOBDELAY),
196  .OFB_USED ( ISERDES_DQ_OFB_USED),
197  .SERDES_MODE ( ISERDES_DQ_SERDES_MODE),
198  .SRVAL_Q1 ( ISERDES_DQ_SRVAL_Q1),
199  .SRVAL_Q2 ( ISERDES_DQ_SRVAL_Q2),
200  .SRVAL_Q3 ( ISERDES_DQ_SRVAL_Q3),
201  .SRVAL_Q4 ( ISERDES_DQ_SRVAL_Q4)
202  )
203  iserdesdq
204  (
205  .O (),
206  .Q1 (iserdes_dout[4*i + 3]),
207  .Q2 (iserdes_dout[4*i + 2]),
208  .Q3 (iserdes_dout[4*i + 1]),
209  .Q4 (iserdes_dout[4*i + 0]),
210  .Q5 (),
211  .Q6 (),
212  .SHIFTOUT1 (),
213  .SHIFTOUT2 (),
214 
215  .BITSLIP (1'b0),
216  .CE1 (1'b1),
217  .CE2 (1'b1),
218  .CLK (iserdes_clk_d),
219  .CLKB (!iserdes_clk_d),
220  .CLKDIVP (iserdes_clkdiv),
221  .CLKDIV (),
222  .DDLY (data_in_dly[i]),
223  .D (data_in[i]), // dedicated route to iob for debugging
224  // or as needed, select with IOBDELAY
225  .DYNCLKDIVSEL (1'b0),
226  .DYNCLKSEL (1'b0),
227 // NOTE: OCLK is not used in this design, but is required to meet
228 // a design rule check in map and bitgen. Do not disconnect it.
229  .OCLK (oserdes_clk),
230  .OFB (),
231  .RST (1'b0),
232 // .RST (iserdes_rst),
233  .SHIFTIN1 (1'b0),
234  .SHIFTIN2 (1'b0)
235  );
236 
237 localparam IDELAYE2_CINVCTRL_SEL = "FALSE";
238 localparam IDELAYE2_DELAY_SRC = "IDATAIN";
239 localparam IDELAYE2_HIGH_PERFORMANCE_MODE = "TRUE";
240 localparam IDELAYE2_PIPE_SEL = "FALSE";
241 localparam IDELAYE2_ODELAY_TYPE = "FIXED";
242 localparam IDELAYE2_REFCLK_FREQUENCY = 200.0;
243 localparam IDELAYE2_SIGNAL_PATTERN = "DATA";
244 
245 (* IODELAY_GROUP = IODELAY_GRP *)
246  IDELAYE2 #(
247  .CINVCTRL_SEL ( IDELAYE2_CINVCTRL_SEL),
248  .DELAY_SRC ( IDELAYE2_DELAY_SRC),
249  .HIGH_PERFORMANCE_MODE ( IDELAYE2_HIGH_PERFORMANCE_MODE),
250  .IDELAY_TYPE ( IDELAYE2_IDELAY_TYPE),
251  .IDELAY_VALUE ( IDELAYE2_IDELAY_VALUE),
252  .PIPE_SEL ( IDELAYE2_PIPE_SEL),
253  .REFCLK_FREQUENCY ( IDELAYE2_REFCLK_FREQUENCY ),
254  .SIGNAL_PATTERN ( IDELAYE2_SIGNAL_PATTERN)
255  )
256  idelaye2
257  (
258  .CNTVALUEOUT (),
259  .DATAOUT (data_in_dly[i]),
260  .C (phy_clk), // automatically wired by ISE
261  .CE (idelay_ce),
262  .CINVCTRL (),
263  .CNTVALUEIN (5'b00000),
264  .DATAIN (1'b0),
265  .IDATAIN (data_in[i]),
266  .INC (idelay_inc),
267  .LD (idelay_ld | idelay_ld_rst),
268  .LDPIPEEN (1'b0),
269  .REGRST (rst)
270  );
271 
272  end // iserdes_dq
273  else begin
274  assign iserdes_dout[4*i + 3] = 0;
275  assign iserdes_dout[4*i + 2] = 0;
276  assign iserdes_dout[4*i + 1] = 0;
277  assign iserdes_dout[4*i + 0] = 0;
278  end
279 end // input_
280 endgenerate // iserdes_dq_
281 
282 localparam OSERDES_DQ_DATA_RATE_OQ = OSERDES_DATA_RATE;
283 localparam OSERDES_DQ_DATA_RATE_TQ = OSERDES_DQ_DATA_RATE_OQ;
284 localparam OSERDES_DQ_DATA_WIDTH = OSERDES_DATA_WIDTH;
285 localparam OSERDES_DQ_INIT_OQ = 1'b1;
286 localparam OSERDES_DQ_INIT_TQ = 1'b1;
287 localparam OSERDES_DQ_INTERFACE_TYPE = "DEFAULT";
288 localparam OSERDES_DQ_ODELAY_USED = 0;
289 localparam OSERDES_DQ_SERDES_MODE = "MASTER";
290 localparam OSERDES_DQ_SRVAL_OQ = 1'b1;
291 localparam OSERDES_DQ_SRVAL_TQ = 1'b1;
292 // note: obuf used in control path case, no ts input so width irrelevant
293 localparam OSERDES_DQ_TRISTATE_WIDTH = (OSERDES_DQ_DATA_RATE_OQ == "DDR") ? 4 : 1;
294 
295 localparam OSERDES_DQS_DATA_RATE_OQ = "DDR";
296 localparam OSERDES_DQS_DATA_RATE_TQ = "DDR";
297 localparam OSERDES_DQS_TRISTATE_WIDTH = 4; // this is always ddr
298 localparam OSERDES_DQS_DATA_WIDTH = 4;
299 localparam ODDR_CLK_EDGE = "SAME_EDGE";
300 localparam OSERDES_TBYTE_CTL = "TRUE";
301 
302 
303 generate
304 
305 localparam NUM_BITLANES = PO_DATA_CTL == "TRUE" ? 10 : BUS_WIDTH;
306 
307  if ( PO_DATA_CTL == "TRUE" ) begin : slave_ts
308  OSERDESE2 #(
309  .DATA_RATE_OQ (OSERDES_DQ_DATA_RATE_OQ),
310  .DATA_RATE_TQ (OSERDES_DQ_DATA_RATE_TQ),
311  .DATA_WIDTH (OSERDES_DQ_DATA_WIDTH),
312  .INIT_OQ (OSERDES_DQ_INIT_OQ),
313  .INIT_TQ (OSERDES_DQ_INIT_TQ),
314  .SERDES_MODE (OSERDES_DQ_SERDES_MODE),
315  .SRVAL_OQ (OSERDES_DQ_SRVAL_OQ),
316  .SRVAL_TQ (OSERDES_DQ_SRVAL_TQ),
317  .TRISTATE_WIDTH (OSERDES_DQ_TRISTATE_WIDTH),
318  .TBYTE_CTL ("TRUE"),
319  .TBYTE_SRC ("TRUE")
320  )
321  oserdes_slave_ts
322  (
323  .OFB (),
324  .OQ (),
325  .SHIFTOUT1 (), // not extended
326  .SHIFTOUT2 (), // not extended
327  .TFB (),
328  .TQ (),
329  .CLK (oserdes_clk),
330  .CLKDIV (oserdes_clkdiv),
331  .D1 (),
332  .D2 (),
333  .D3 (),
334  .D4 (),
335  .D5 (),
336  .D6 (),
337  .OCE (1'b1),
338  .RST (oserdes_rst),
339  .SHIFTIN1 (), // not extended
340  .SHIFTIN2 (), // not extended
341  .T1 (oserdes_dqts[0]),
342  .T2 (oserdes_dqts[0]),
343  .T3 (oserdes_dqts[1]),
344  .T4 (oserdes_dqts[1]),
345  .TCE (1'b1),
346  .TBYTEOUT (tbyte_out),
347  .TBYTEIN (tbyte_out)
348  );
349  end // slave_ts
350 
351  for (i = 0; i != NUM_BITLANES; i=i+1) begin : output_
352  if ( BITLANES[i]) begin : oserdes_dq_
353 
354  if ( PO_DATA_CTL == "TRUE" ) begin : ddr
355 
356  OSERDESE2 #(
357  .DATA_RATE_OQ (OSERDES_DQ_DATA_RATE_OQ),
358  .DATA_RATE_TQ (OSERDES_DQ_DATA_RATE_TQ),
359  .DATA_WIDTH (OSERDES_DQ_DATA_WIDTH),
360  .INIT_OQ (OSERDES_DQ_INIT_OQ),
361  .INIT_TQ (OSERDES_DQ_INIT_TQ),
362  .SERDES_MODE (OSERDES_DQ_SERDES_MODE),
363  .SRVAL_OQ (OSERDES_DQ_SRVAL_OQ),
364  .SRVAL_TQ (OSERDES_DQ_SRVAL_TQ),
365  .TRISTATE_WIDTH (OSERDES_DQ_TRISTATE_WIDTH),
366  .TBYTE_CTL (OSERDES_TBYTE_CTL),
367  .TBYTE_SRC ("FALSE")
368  )
369  oserdes_dq_i
370  (
371  .OFB (),
372  .OQ (oserdes_dq_buf[i]),
373  .SHIFTOUT1 (), // not extended
374  .SHIFTOUT2 (), // not extended
375  .TFB (),
376  .TQ (oserdes_dqts_buf[i]),
377  .CLK (oserdes_clk),
378  .CLKDIV (oserdes_clkdiv),
379  .D1 (oserdes_dq[4 * i + 0]),
380  .D2 (oserdes_dq[4 * i + 1]),
381  .D3 (oserdes_dq[4 * i + 2]),
382  .D4 (oserdes_dq[4 * i + 3]),
383  .D5 (),
384  .D6 (),
385  .OCE (1'b1),
386  .RST (oserdes_rst),
387  .SHIFTIN1 (), // not extended
388  .SHIFTIN2 (), // not extended
389  .T1 (/*oserdes_dqts[0]**/),
390  .T2 (/*oserdes_dqts[0]**/),
391  .T3 (/*oserdes_dqts[1]**/),
392  .T4 (/*oserdes_dqts[1]**/),
393  .TCE (1'b1),
394  .TBYTEIN (tbyte_out)
395  );
396  end
397  else begin : sdr
398  OSERDESE2 #(
399  .DATA_RATE_OQ (OSERDES_DQ_DATA_RATE_OQ),
400  .DATA_RATE_TQ (OSERDES_DQ_DATA_RATE_TQ),
401  .DATA_WIDTH (OSERDES_DQ_DATA_WIDTH),
402  .INIT_OQ (1'b0 /*OSERDES_DQ_INIT_OQ**/),
403  .INIT_TQ (OSERDES_DQ_INIT_TQ),
404  .SERDES_MODE (OSERDES_DQ_SERDES_MODE),
405  .SRVAL_OQ (1'b0 /*OSERDES_DQ_SRVAL_OQ**/),
406  .SRVAL_TQ (OSERDES_DQ_SRVAL_TQ),
407  .TRISTATE_WIDTH (OSERDES_DQ_TRISTATE_WIDTH)
408  )
409  oserdes_dq_i
410  (
411  .OFB (),
412  .OQ (oserdes_dq_buf[i]),
413  .SHIFTOUT1 (), // not extended
414  .SHIFTOUT2 (), // not extended
415  .TFB (),
416  .TQ (),
417  .CLK (oserdes_clk),
418  .CLKDIV (oserdes_clkdiv),
419  .D1 (oserdes_dq[4 * i + 0]),
420  .D2 (oserdes_dq[4 * i + 1]),
421  .D3 (oserdes_dq[4 * i + 2]),
422  .D4 (oserdes_dq[4 * i + 3]),
423  .D5 (),
424  .D6 (),
425  .OCE (1'b1),
426  .RST (oserdes_rst),
427  .SHIFTIN1 (), // not extended
428  .SHIFTIN2 (), // not extended
429  .T1 (),
430  .T2 (),
431  .T3 (),
432  .T4 (),
433  .TCE (1'b1)
434  );
435  end // ddr
436  end // oserdes_dq_
437  end // output_
438 
439 endgenerate
440 
441 generate
442 
443  if ( PO_DATA_CTL == "TRUE" ) begin : dqs_gen
444 
445  ODDR
446  #(.DDR_CLK_EDGE (ODDR_CLK_EDGE))
447  oddr_dqs
448  (
449  .Q (oserdes_dqs_buf),
450  .D1 (oserdes_dqs[0]),
451  .D2 (oserdes_dqs[1]),
452  .C (oserdes_clk_delayed),
453  .R (1'b0),
454  .S (),
455  .CE (1'b1)
456  );
457 
458  ODDR
459  #(.DDR_CLK_EDGE (ODDR_CLK_EDGE))
460  oddr_dqsts
461  ( .Q (oserdes_dqsts_buf),
462  .D1 (oserdes_dqsts[0]),
463  .D2 (oserdes_dqsts[0]),
464  .C (oserdes_clk_delayed),
465  .R (),
466  .S (1'b0),
467  .CE (1'b1)
468  );
469 
470  end // sdr rate
471  else begin:null_dqs
472  end
473 endgenerate
474 
475 endmodule // byte_group_io