OpenCores
URL https://opencores.org/ocsvn/usb_fpga_2_14/usb_fpga_2_14/trunk

Subversion Repositories usb_fpga_2_14

[/] [usb_fpga_2_14/] [trunk/] [examples/] [memfifo/] [fpga-2.13/] [memfifo.srcs/] [sources_1/] [ip/] [mig_7series_0/] [mig_7series_0/] [user_design/] [rtl/] [phy/] [mig_7series_v2_3_ddr_byte_group_io.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ZTEX
/*****************************************************************
2
-- (c) Copyright 2011 - 2014 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
 
69
module mig_7series_v2_3_ddr_byte_group_io #(
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
    parameter  FPGA_SPEED_GRADE              = 1,
80
    parameter  real TCK                      = 2500.0,
81
// local usage only, don't pass down
82
    parameter  BUS_WIDTH                     = 12,
83
    parameter  SYNTHESIS                     = "FALSE"
84
   )
85
   (
86
   input  [9:0]                    mem_dq_in,
87
   output [BUS_WIDTH-1:0]          mem_dq_out,
88
   output [BUS_WIDTH-1:0]          mem_dq_ts,
89
   input                           mem_dqs_in,
90
   output                          mem_dqs_out,
91
   output                          mem_dqs_ts,
92
   output [(4*10)-1:0]             iserdes_dout, // 2 extra 12-bit lanes not used
93
   output                          dqs_to_phaser,
94
   input                           iserdes_clk,
95
   input                           iserdes_clkb,
96
   input                           iserdes_clkdiv,
97
   input                           phy_clk,
98
   input                           rst,
99
   input                           oserdes_rst,
100
   input                           iserdes_rst,
101
   input [1:0]                     oserdes_dqs,
102
   input [1:0]                     oserdes_dqsts,
103
   input [(4*BUS_WIDTH)-1:0]       oserdes_dq,
104
   input [1:0]                     oserdes_dqts,
105
   input                           oserdes_clk,
106
   input                           oserdes_clk_delayed,
107
   input                           oserdes_clkdiv,
108
   input                           idelay_inc,
109
   input                           idelay_ce,
110
   input                           idelay_ld,
111
   input                           idelayctrl_refclk,
112
   input [29:0]                    fine_delay ,
113
   input                           fine_delay_sel
114
   );
115
 
116
 
117
 
118
/// INSTANCES
119
 
120
 
121
localparam    ISERDES_DQ_DATA_RATE          = "DDR";
122
localparam    ISERDES_DQ_DATA_WIDTH         = 4;
123
localparam    ISERDES_DQ_DYN_CLKDIV_INV_EN  = "FALSE";
124
localparam    ISERDES_DQ_DYN_CLK_INV_EN     = "FALSE";
125
localparam    ISERDES_DQ_INIT_Q1            = 1'b0;
126
localparam    ISERDES_DQ_INIT_Q2            = 1'b0;
127
localparam    ISERDES_DQ_INIT_Q3            = 1'b0;
128
localparam    ISERDES_DQ_INIT_Q4            = 1'b0;
129
localparam    ISERDES_DQ_INTERFACE_TYPE     = "MEMORY_DDR3";
130
localparam    ISERDES_NUM_CE                = 2;
131
localparam    ISERDES_DQ_IOBDELAY           = "IFD";
132
localparam    ISERDES_DQ_OFB_USED           = "FALSE";
133
localparam    ISERDES_DQ_SERDES_MODE        = "MASTER";
134
localparam    ISERDES_DQ_SRVAL_Q1           = 1'b0;
135
localparam    ISERDES_DQ_SRVAL_Q2           = 1'b0;
136
localparam    ISERDES_DQ_SRVAL_Q3           = 1'b0;
137
localparam    ISERDES_DQ_SRVAL_Q4           = 1'b0;
138
 
139
localparam    IDELAY_FINEDELAY_USE          = (TCK > 1500) ? "FALSE" : "TRUE";
140
 
141
wire [BUS_WIDTH-1:0]                    data_in_dly;
142
wire [BUS_WIDTH-1:0]                    oserdes_dq_buf;
143
wire [BUS_WIDTH-1:0]                    oserdes_dqts_buf;
144
wire                                    oserdes_dqs_buf;
145
wire                                    oserdes_dqsts_buf;
146
wire [9:0]                              data_in;
147
wire                                    tbyte_out;
148
reg [29:0]                              fine_delay_r;
149
 
150
assign mem_dq_out  = oserdes_dq_buf;
151
assign mem_dq_ts   = oserdes_dqts_buf;
152
assign data_in = mem_dq_in;
153
 
154
assign mem_dqs_out = oserdes_dqs_buf;
155
assign mem_dqs_ts  = oserdes_dqsts_buf;
156
assign dqs_to_phaser = mem_dqs_in;
157
 
158
reg iserdes_clk_d;
159
 
160
always @(*)
161
   iserdes_clk_d = iserdes_clk;
162
 
163
reg  idelay_ld_rst;
164
reg  rst_r1;
165
reg  rst_r2;
166
reg  rst_r3;
167
reg  rst_r4;
168
 
169
always @(posedge phy_clk) begin
170
  rst_r1 <= #1 rst;
171
  rst_r2 <= #1 rst_r1;
172
  rst_r3 <= #1 rst_r2;
173
  rst_r4 <= #1 rst_r3;
174
end
175
 
176
always @(posedge phy_clk) begin
177
  if (rst)
178
    idelay_ld_rst <= #1 1'b1;
179
  else if (rst_r4)
180
    idelay_ld_rst <= #1 1'b0;
181
end
182
 
183
always @ (posedge phy_clk) begin
184
 if(rst)
185
   fine_delay_r <= #1 1'b0;
186
 else if(fine_delay_sel)
187
   fine_delay_r <= #1 fine_delay;
188
end
189
 
190
 
191
genvar i;
192
 
193
generate
194
 
195
for ( i = 0; i != 10 && PO_DATA_CTL == "TRUE" ; i=i+1) begin : input_
196
  if ( BITLANES[i] && !BITLANES_OUTONLY[i]) begin  : iserdes_dq_
197
 
198
     ISERDESE2 #(
199
         .DATA_RATE                  ( ISERDES_DQ_DATA_RATE),
200
         .DATA_WIDTH                 ( ISERDES_DQ_DATA_WIDTH),
201
         .DYN_CLKDIV_INV_EN          ( ISERDES_DQ_DYN_CLKDIV_INV_EN),
202
         .DYN_CLK_INV_EN             ( ISERDES_DQ_DYN_CLK_INV_EN),
203
         .INIT_Q1                    ( ISERDES_DQ_INIT_Q1),
204
         .INIT_Q2                    ( ISERDES_DQ_INIT_Q2),
205
         .INIT_Q3                    ( ISERDES_DQ_INIT_Q3),
206
         .INIT_Q4                    ( ISERDES_DQ_INIT_Q4),
207
         .INTERFACE_TYPE             ( ISERDES_DQ_INTERFACE_TYPE),
208
         .NUM_CE                     ( ISERDES_NUM_CE),
209
         .IOBDELAY                   ( ISERDES_DQ_IOBDELAY),
210
         .OFB_USED                   ( ISERDES_DQ_OFB_USED),
211
         .SERDES_MODE                ( ISERDES_DQ_SERDES_MODE),
212
         .SRVAL_Q1                   ( ISERDES_DQ_SRVAL_Q1),
213
         .SRVAL_Q2                   ( ISERDES_DQ_SRVAL_Q2),
214
         .SRVAL_Q3                   ( ISERDES_DQ_SRVAL_Q3),
215
         .SRVAL_Q4                   ( ISERDES_DQ_SRVAL_Q4)
216
         )
217
         iserdesdq
218
         (
219
         .O                          (),
220
         .Q1                         (iserdes_dout[4*i + 3]),
221
         .Q2                         (iserdes_dout[4*i + 2]),
222
         .Q3                         (iserdes_dout[4*i + 1]),
223
         .Q4                         (iserdes_dout[4*i + 0]),
224
         .Q5                         (),
225
         .Q6                         (),
226
         .Q7                         (),
227
         .Q8                         (),
228
         .SHIFTOUT1                  (),
229
         .SHIFTOUT2                  (),
230
 
231
         .BITSLIP                    (1'b0),
232
         .CE1                        (1'b1),
233
         .CE2                        (1'b1),
234
         .CLK                        (iserdes_clk_d),
235
         .CLKB                       (!iserdes_clk_d),
236
         .CLKDIVP                    (iserdes_clkdiv),
237
         .CLKDIV                     (),
238
         .DDLY                       (data_in_dly[i]),
239
         .D                          (data_in[i]), // dedicated route to iob for debugging
240
                                                   // or as needed, select with IOBDELAY
241
         .DYNCLKDIVSEL               (1'b0),
242
         .DYNCLKSEL                  (1'b0),
243
// NOTE: OCLK is not used in this design, but is required to meet 
244
// a design rule check in map and bitgen. Do not disconnect it.
245
         .OCLK                       (oserdes_clk),
246
         .OCLKB                      (),
247
         .OFB                        (),
248
         .RST                        (1'b0),
249
//         .RST                        (iserdes_rst),
250
         .SHIFTIN1                   (1'b0),
251
         .SHIFTIN2                   (1'b0)
252
         );
253
 
254
localparam IDELAYE2_CINVCTRL_SEL          = "FALSE";
255
localparam IDELAYE2_DELAY_SRC             = "IDATAIN";
256
localparam IDELAYE2_HIGH_PERFORMANCE_MODE = "TRUE";
257
localparam IDELAYE2_PIPE_SEL              = "FALSE";
258
localparam IDELAYE2_ODELAY_TYPE           = "FIXED";
259
localparam IDELAYE2_REFCLK_FREQUENCY      = ((FPGA_SPEED_GRADE == 2 || FPGA_SPEED_GRADE == 3) && TCK <= 1500) ? 400.0 :
260
                                             (FPGA_SPEED_GRADE == 1 && TCK <= 1500) ?  300.0 : 200.0;
261
localparam IDELAYE2_SIGNAL_PATTERN        = "DATA";
262
localparam IDELAYE2_FINEDELAY_IN          = "ADD_DLY";
263
 
264
    if(IDELAY_FINEDELAY_USE == "TRUE") begin: idelay_finedelay_dq
265
      (* IODELAY_GROUP = IODELAY_GRP *)
266
        IDELAYE2_FINEDELAY #(
267
         .CINVCTRL_SEL             ( IDELAYE2_CINVCTRL_SEL),
268
         .DELAY_SRC                ( IDELAYE2_DELAY_SRC),
269
         .HIGH_PERFORMANCE_MODE    ( IDELAYE2_HIGH_PERFORMANCE_MODE),
270
         .IDELAY_TYPE              ( IDELAYE2_IDELAY_TYPE),
271
         .IDELAY_VALUE             ( IDELAYE2_IDELAY_VALUE),
272
         .PIPE_SEL                 ( IDELAYE2_PIPE_SEL),
273
         .FINEDELAY                ( IDELAYE2_FINEDELAY_IN),
274
         .REFCLK_FREQUENCY         ( IDELAYE2_REFCLK_FREQUENCY ),
275
         .SIGNAL_PATTERN           ( IDELAYE2_SIGNAL_PATTERN)
276
         )
277
         idelaye2
278
         (
279
         .CNTVALUEOUT              (),
280
         .DATAOUT                  (data_in_dly[i]),
281
         .C                        (phy_clk), // automatically wired by ISE
282
         .CE                       (idelay_ce),
283
         .CINVCTRL                 (),
284
         .CNTVALUEIN               (5'b00000),
285
         .DATAIN                   (1'b0),
286
         .IDATAIN                  (data_in[i]),
287
         .IFDLY                    (fine_delay_r[i*3+:3]),
288
         .INC                      (idelay_inc),
289
         .LD                       (idelay_ld | idelay_ld_rst),
290
         .LDPIPEEN                 (1'b0),
291
         .REGRST                   (rst)
292
     );
293
    end else begin : idelay_dq
294
      (* IODELAY_GROUP = IODELAY_GRP *)
295
        IDELAYE2 #(
296
         .CINVCTRL_SEL             ( IDELAYE2_CINVCTRL_SEL),
297
         .DELAY_SRC                ( IDELAYE2_DELAY_SRC),
298
         .HIGH_PERFORMANCE_MODE    ( IDELAYE2_HIGH_PERFORMANCE_MODE),
299
         .IDELAY_TYPE              ( IDELAYE2_IDELAY_TYPE),
300
         .IDELAY_VALUE             ( IDELAYE2_IDELAY_VALUE),
301
         .PIPE_SEL                 ( IDELAYE2_PIPE_SEL),
302
         .REFCLK_FREQUENCY         ( IDELAYE2_REFCLK_FREQUENCY ),
303
         .SIGNAL_PATTERN           ( IDELAYE2_SIGNAL_PATTERN)
304
         )
305
         idelaye2
306
         (
307
         .CNTVALUEOUT              (),
308
         .DATAOUT                  (data_in_dly[i]),
309
         .C                        (phy_clk), // automatically wired by ISE
310
         .CE                       (idelay_ce),
311
         .CINVCTRL                 (),
312
         .CNTVALUEIN               (5'b00000),
313
         .DATAIN                   (1'b0),
314
         .IDATAIN                  (data_in[i]),
315
         .INC                      (idelay_inc),
316
         .LD                       (idelay_ld | idelay_ld_rst),
317
         .LDPIPEEN                 (1'b0),
318
         .REGRST                   (rst)
319
     );
320
 
321
     end
322
    end // iserdes_dq
323
    else begin
324
        assign iserdes_dout[4*i + 3] = 0;
325
        assign iserdes_dout[4*i + 2] = 0;
326
        assign iserdes_dout[4*i + 1] = 0;
327
        assign iserdes_dout[4*i + 0] = 0;
328
    end
329
end // input_
330
endgenerate                     // iserdes_dq_
331
 
332
localparam OSERDES_DQ_DATA_RATE_OQ    = OSERDES_DATA_RATE;
333
localparam OSERDES_DQ_DATA_RATE_TQ    = OSERDES_DQ_DATA_RATE_OQ;
334
localparam OSERDES_DQ_DATA_WIDTH      = OSERDES_DATA_WIDTH;
335
localparam OSERDES_DQ_INIT_OQ         = 1'b1;
336
localparam OSERDES_DQ_INIT_TQ         = 1'b1;
337
localparam OSERDES_DQ_INTERFACE_TYPE  = "DEFAULT";
338
localparam OSERDES_DQ_ODELAY_USED     = 0;
339
localparam OSERDES_DQ_SERDES_MODE     = "MASTER";
340
localparam OSERDES_DQ_SRVAL_OQ        = 1'b1;
341
localparam OSERDES_DQ_SRVAL_TQ        = 1'b1;
342
// note: obuf used in control path case, no ts input so width irrelevant
343
localparam OSERDES_DQ_TRISTATE_WIDTH  = (OSERDES_DQ_DATA_RATE_OQ == "DDR") ? 4 : 1;
344
 
345
localparam OSERDES_DQS_DATA_RATE_OQ   = "DDR";
346
localparam OSERDES_DQS_DATA_RATE_TQ   = "DDR";
347
localparam OSERDES_DQS_TRISTATE_WIDTH = 4;      // this is always ddr
348
localparam OSERDES_DQS_DATA_WIDTH     = 4;
349
localparam ODDR_CLK_EDGE              = "SAME_EDGE";
350
localparam OSERDES_TBYTE_CTL          = "TRUE";
351
 
352
 
353
generate
354
 
355
localparam NUM_BITLANES = PO_DATA_CTL == "TRUE" ? 10 : BUS_WIDTH;
356
 
357
     if ( PO_DATA_CTL == "TRUE" ) begin  : slave_ts
358
           OSERDESE2 #(
359
               .DATA_RATE_OQ         (OSERDES_DQ_DATA_RATE_OQ),
360
               .DATA_RATE_TQ         (OSERDES_DQ_DATA_RATE_TQ),
361
               .DATA_WIDTH           (OSERDES_DQ_DATA_WIDTH),
362
               .INIT_OQ              (OSERDES_DQ_INIT_OQ),
363
               .INIT_TQ              (OSERDES_DQ_INIT_TQ),
364
               .SERDES_MODE          (OSERDES_DQ_SERDES_MODE),
365
               .SRVAL_OQ             (OSERDES_DQ_SRVAL_OQ),
366
               .SRVAL_TQ             (OSERDES_DQ_SRVAL_TQ),
367
               .TRISTATE_WIDTH       (OSERDES_DQ_TRISTATE_WIDTH),
368
               .TBYTE_CTL            ("TRUE"),
369
               .TBYTE_SRC            ("TRUE")
370
            )
371
            oserdes_slave_ts
372
            (
373
                .OFB                 (),
374
                .OQ                  (),
375
                .SHIFTOUT1           (),        // not extended
376
                .SHIFTOUT2           (),        // not extended
377
                .TFB                 (),
378
                .TQ                  (),
379
                .CLK                 (oserdes_clk),
380
                .CLKDIV              (oserdes_clkdiv),
381
                .D1                  (),
382
                .D2                  (),
383
                .D3                  (),
384
                .D4                  (),
385
                .D5                  (),
386
                .D6                  (),
387
                .D7                  (),
388
                .D8                  (),
389
               .OCE                  (1'b1),
390
               .RST                  (oserdes_rst),
391
               .SHIFTIN1             (),     // not extended
392
               .SHIFTIN2             (),     // not extended
393
               .T1                   (oserdes_dqts[0]),
394
               .T2                   (oserdes_dqts[0]),
395
               .T3                   (oserdes_dqts[1]),
396
               .T4                   (oserdes_dqts[1]),
397
               .TCE                  (1'b1),
398
               .TBYTEOUT             (tbyte_out),
399
               .TBYTEIN              (tbyte_out)
400
             );
401
     end // slave_ts
402
 
403
  for (i = 0; i != NUM_BITLANES; i=i+1) begin : output_
404
     if ( BITLANES[i]) begin  : oserdes_dq_
405
 
406
        if ( PO_DATA_CTL == "TRUE" ) begin  : ddr
407
 
408
           OSERDESE2 #(
409
               .DATA_RATE_OQ         (OSERDES_DQ_DATA_RATE_OQ),
410
               .DATA_RATE_TQ         (OSERDES_DQ_DATA_RATE_TQ),
411
               .DATA_WIDTH           (OSERDES_DQ_DATA_WIDTH),
412
               .INIT_OQ              (OSERDES_DQ_INIT_OQ),
413
               .INIT_TQ              (OSERDES_DQ_INIT_TQ),
414
               .SERDES_MODE          (OSERDES_DQ_SERDES_MODE),
415
               .SRVAL_OQ             (OSERDES_DQ_SRVAL_OQ),
416
               .SRVAL_TQ             (OSERDES_DQ_SRVAL_TQ),
417
               .TRISTATE_WIDTH       (OSERDES_DQ_TRISTATE_WIDTH),
418
               .TBYTE_CTL            (OSERDES_TBYTE_CTL),
419
               .TBYTE_SRC            ("FALSE")
420
             )
421
              oserdes_dq_i
422
              (
423
                .OFB               (),
424
                .OQ                (oserdes_dq_buf[i]),
425
                .SHIFTOUT1         (),  // not extended
426
                .SHIFTOUT2         (),  // not extended
427
                .TBYTEOUT          (),
428
                .TFB               (),
429
                .TQ                (oserdes_dqts_buf[i]),
430
                .CLK               (oserdes_clk),
431
                .CLKDIV            (oserdes_clkdiv),
432
                .D1                (oserdes_dq[4 * i + 0]),
433
                .D2                (oserdes_dq[4 * i + 1]),
434
                .D3                (oserdes_dq[4 * i + 2]),
435
                .D4                (oserdes_dq[4 * i + 3]),
436
                .D5                (),
437
                .D6                (),
438
                .D7                (),
439
                .D8                (),
440
               .OCE                (1'b1),
441
               .RST                (oserdes_rst),
442
               .SHIFTIN1           (),     // not extended
443
               .SHIFTIN2           (),     // not extended
444
               .T1                 (/*oserdes_dqts[0]*/),
445
               .T2                 (/*oserdes_dqts[0]*/),
446
               .T3                 (/*oserdes_dqts[1]*/),
447
               .T4                 (/*oserdes_dqts[1]*/),
448
               .TCE                (1'b1),
449
               .TBYTEIN            (tbyte_out)
450
              );
451
           end
452
           else begin :  sdr
453
           OSERDESE2 #(
454
               .DATA_RATE_OQ         (OSERDES_DQ_DATA_RATE_OQ),
455
               .DATA_RATE_TQ         (OSERDES_DQ_DATA_RATE_TQ),
456
               .DATA_WIDTH           (OSERDES_DQ_DATA_WIDTH),
457
               .INIT_OQ              (1'b0 /*OSERDES_DQ_INIT_OQ*/),
458
               .INIT_TQ              (OSERDES_DQ_INIT_TQ),
459
               .SERDES_MODE          (OSERDES_DQ_SERDES_MODE),
460
               .SRVAL_OQ             (1'b0 /*OSERDES_DQ_SRVAL_OQ*/),
461
               .SRVAL_TQ             (OSERDES_DQ_SRVAL_TQ),
462
               .TRISTATE_WIDTH       (OSERDES_DQ_TRISTATE_WIDTH)
463
              )
464
              oserdes_dq_i
465
              (
466
                .OFB               (),
467
                .OQ                (oserdes_dq_buf[i]),
468
                .SHIFTOUT1         (),  // not extended
469
                .SHIFTOUT2         (),  // not extended
470
                .TBYTEOUT          (),
471
                .TFB               (),
472
                .TQ                (),
473
                .CLK               (oserdes_clk),
474
                .CLKDIV            (oserdes_clkdiv),
475
                .D1                (oserdes_dq[4 * i + 0]),
476
                .D2                (oserdes_dq[4 * i + 1]),
477
                .D3                (oserdes_dq[4 * i + 2]),
478
                .D4                (oserdes_dq[4 * i + 3]),
479
                .D5                (),
480
                .D6                (),
481
                .D7                (),
482
                .D8                (),
483
               .OCE                (1'b1),
484
               .RST                (oserdes_rst),
485
               .SHIFTIN1           (),     // not extended
486
               .SHIFTIN2           (),     // not extended
487
               .T1                 (),
488
               .T2                 (),
489
               .T3                 (),
490
               .T4                 (),
491
               .TCE                (1'b1),
492
               .TBYTEIN            ()
493
              );
494
           end // ddr
495
     end // oserdes_dq_
496
  end // output_
497
 
498
endgenerate
499
 
500
generate
501
 
502
 if ( PO_DATA_CTL == "TRUE" )  begin : dqs_gen
503
 
504
   ODDR
505
      #(.DDR_CLK_EDGE  (ODDR_CLK_EDGE))
506
      oddr_dqs
507
   (
508
       .Q   (oserdes_dqs_buf),
509
       .D1  (oserdes_dqs[0]),
510
       .D2  (oserdes_dqs[1]),
511
       .C   (oserdes_clk_delayed),
512
       .R   (1'b0),
513
       .S   (),
514
       .CE  (1'b1)
515
   );
516
 
517
   ODDR
518
     #(.DDR_CLK_EDGE  (ODDR_CLK_EDGE))
519
     oddr_dqsts
520
   (    .Q  (oserdes_dqsts_buf),
521
        .D1 (oserdes_dqsts[0]),
522
        .D2 (oserdes_dqsts[0]),
523
        .C  (oserdes_clk_delayed),
524
        .R  (),
525
        .S  (1'b0),
526
        .CE (1'b1)
527
   );
528
 
529
 end // sdr rate
530
 else begin:null_dqs
531
 end
532
endgenerate
533
 
534
endmodule                       // byte_group_io

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.