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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [core/] [ds_dma64/] [pcie_src/] [pcie_core64_m1/] [source_artix7/] [cl_a7pcie_x4_pipe_clock.v] - Blame information for rev 49

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 46 dsmv
//-----------------------------------------------------------------------------
2
//
3
// (c) Copyright 2010-2011 Xilinx, Inc. All rights reserved.
4
//
5
// This file contains confidential and proprietary information
6
// of Xilinx, Inc. and is protected under U.S. and
7
// international copyright and other intellectual property
8
// laws.
9
//
10
// DISCLAIMER
11
// This disclaimer is not a license and does not grant any
12
// rights to the materials distributed herewith. Except as
13
// otherwise provided in a valid license issued to you by
14
// Xilinx, and to the maximum extent permitted by applicable
15
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
16
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
17
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
18
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
19
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
20
// (2) Xilinx shall not be liable (whether in contract or tort,
21
// including negligence, or under any other theory of
22
// liability) for any loss or damage of any kind or nature
23
// related to, arising under or in connection with these
24
// materials, including for any direct, or any indirect,
25
// special, incidental, or consequential loss or damage
26
// (including loss of data, profits, goodwill, or any type of
27
// loss or damage suffered as a result of any action brought
28
// by a third party) even if such damage or loss was
29
// reasonably foreseeable or Xilinx had been advised of the
30
// possibility of the same.
31
//
32
// CRITICAL APPLICATIONS
33
// Xilinx products are not designed or intended to be fail-
34
// safe, or for use in any application requiring fail-safe
35
// performance, such as life-support or safety devices or
36
// systems, Class III medical devices, nuclear facilities,
37
// applications related to the deployment of airbags, or any
38
// other applications that could lead to death, personal
39
// injury, or severe property or environmental damage
40
// (individually and collectively, "Critical
41
// Applications"). Customer assumes the sole risk and
42
// liability of any use of Xilinx products in Critical
43
// Applications, subject only to applicable laws and
44
// regulations governing limitations on product liability.
45
//
46
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
47
// PART OF THIS FILE AT ALL TIMES.
48
//
49
//-----------------------------------------------------------------------------
50
// Project    : Series-7 Integrated Block for PCI Express
51
// File       : cl_a7pcie_x4_pipe_clock.v
52 49 dsmv
// Version    : 1.11
53 46 dsmv
//------------------------------------------------------------------------------
54
//  Filename     :  pipe_clock.v
55
//  Description  :  PIPE Clock Module for 7 Series Transceiver
56
//  Version      :  15.3
57
//------------------------------------------------------------------------------
58
 
59
 
60
 
61
`timescale 1ns / 1ps
62
 
63
 
64
 
65
//---------- PIPE Clock Module -------------------------------------------------
66
module cl_a7pcie_x4_pipe_clock #
67
(
68
 
69
    parameter PCIE_ASYNC_EN      = "FALSE",                 // PCIe async enable
70
    parameter PCIE_TXBUF_EN      = "FALSE",                 // PCIe TX buffer enable for Gen1/Gen2 only
71
    parameter PCIE_LANE          = 1,                       // PCIe number of lanes
72
    parameter PCIE_LINK_SPEED    = 3,                       // PCIe link speed 
73
    parameter PCIE_REFCLK_FREQ   = 0,                       // PCIe reference clock frequency
74
    parameter PCIE_USERCLK1_FREQ = 2,                       // PCIe user clock 1 frequency
75
    parameter PCIE_USERCLK2_FREQ = 2,                       // PCIe user clock 2 frequency
76
    parameter PCIE_OOBCLK_MODE   = 1,                       // PCIe oob clock mode
77
    parameter PCIE_DEBUG_MODE    = 0                        // PCIe Debug mode
78
 
79
)
80
 
81
(
82
 
83
    //---------- Input -------------------------------------
84
    input                       CLK_CLK,
85
    input                       CLK_TXOUTCLK,
86
    input       [PCIE_LANE-1:0] CLK_RXOUTCLK_IN,
87
    input                       CLK_RST_N,
88
    input       [PCIE_LANE-1:0] CLK_PCLK_SEL,
89
    input                       CLK_GEN3,
90
 
91
    //---------- Output ------------------------------------
92
    output                      CLK_PCLK,
93
    output                      CLK_RXUSRCLK,
94
    output      [PCIE_LANE-1:0] CLK_RXOUTCLK_OUT,
95
    output                      CLK_DCLK,
96
    output                      CLK_OOBCLK,
97
    output                      CLK_USERCLK1,
98
    output                      CLK_USERCLK2,
99
    output                      CLK_MMCM_LOCK
100
 
101
);
102
 
103
    //---------- Select Clock Divider ----------------------
104
    localparam          DIVCLK_DIVIDE    = (PCIE_REFCLK_FREQ == 2) ? 1 :
105
                                           (PCIE_REFCLK_FREQ == 1) ? 1 : 1;
106
 
107
    localparam          CLKFBOUT_MULT_F  = (PCIE_REFCLK_FREQ == 2) ? 4 :
108
                                           (PCIE_REFCLK_FREQ == 1) ? 8 : 10;
109
 
110
    localparam          CLKIN1_PERIOD    = (PCIE_REFCLK_FREQ == 2) ? 4 :
111
                                           (PCIE_REFCLK_FREQ == 1) ? 8 : 10;
112
 
113
    localparam          CLKOUT0_DIVIDE_F = 8;
114
 
115
    localparam          CLKOUT1_DIVIDE   = 4;
116
 
117
    localparam          CLKOUT2_DIVIDE   = (PCIE_USERCLK1_FREQ == 5) ?  2 :
118
                                           (PCIE_USERCLK1_FREQ == 4) ?  4 :
119
                                           (PCIE_USERCLK1_FREQ == 3) ?  8 :
120
                                           (PCIE_USERCLK1_FREQ == 1) ? 32 : 16;
121
 
122
    localparam          CLKOUT3_DIVIDE   = (PCIE_USERCLK2_FREQ == 5) ?  2 :
123
                                           (PCIE_USERCLK2_FREQ == 4) ?  4 :
124
                                           (PCIE_USERCLK2_FREQ == 3) ?  8 :
125
                                           (PCIE_USERCLK2_FREQ == 1) ? 32 : 16;
126
 
127
    localparam          CLKOUT4_DIVIDE   = 20;
128
 
129
    //---------- Select Reference Clock --------------------                                       
130
    localparam          REFCLK_SEL = ((PCIE_TXBUF_EN == "TRUE") && (PCIE_LINK_SPEED != 3)) ? 1'd1 : 1'd0;
131
 
132
    //---------- Input Registers ---------------------------
133 48 dsmv
(* ASYNC_REG = "TRUE", SHIFT_EXTRACT = "NO" *)    reg         [PCIE_LANE-1:0] pclk_sel_reg1 = {PCIE_LANE{1'd0}};
134
(* ASYNC_REG = "TRUE", SHIFT_EXTRACT = "NO" *)    reg                         gen3_reg1     = 1'd0;
135 46 dsmv
 
136 48 dsmv
(* ASYNC_REG = "TRUE", SHIFT_EXTRACT = "NO" *)    reg         [PCIE_LANE-1:0] pclk_sel_reg2 = {PCIE_LANE{1'd0}};
137
(* ASYNC_REG = "TRUE", SHIFT_EXTRACT = "NO" *)    reg                         gen3_reg2     = 1'd0;
138 46 dsmv
 
139
    //---------- Internal Signals -------------------------- 
140
    wire                        refclk;
141
    wire                        mmcm_fb;
142
    wire                        clk_125mhz;
143
    wire                        clk_125mhz_buf;
144
    wire                        clk_250mhz;
145
    wire                        userclk1;
146
    wire                        userclk2;
147
    wire                        oobclk;
148
    reg                         pclk_sel = 1'd0;
149
 
150
    //---------- Output Registers --------------------------
151
    wire                        pclk_1;
152
    wire                        pclk;
153
    wire                        userclk1_1;
154
    wire                        userclk2_1;
155
    wire                        mmcm_lock;
156
 
157
    //---------- Generate Per-Lane Signals -----------------
158
    genvar              i;                                  // Index for per-lane signals
159
 
160
 
161
 
162
//---------- Input FF ----------------------------------------------------------
163
always @ (posedge pclk)
164
begin
165
 
166
    if (!CLK_RST_N)
167
        begin
168
        //---------- 1st Stage FF --------------------------
169
        pclk_sel_reg1 <= {PCIE_LANE{1'd0}};
170
        gen3_reg1     <= 1'd0;
171
        //---------- 2nd Stage FF --------------------------
172
        pclk_sel_reg2 <= {PCIE_LANE{1'd0}};
173
        gen3_reg2     <= 1'd0;
174
        end
175
    else
176
        begin
177
        //---------- 1st Stage FF --------------------------
178
        pclk_sel_reg1 <= CLK_PCLK_SEL;
179
        gen3_reg1     <= CLK_GEN3;
180
        //---------- 2nd Stage FF --------------------------
181
        pclk_sel_reg2 <= pclk_sel_reg1;
182
        gen3_reg2     <= gen3_reg1;
183
        end
184
 
185
end
186
 
187
 
188
 
189
//---------- Select Reference clock or TXOUTCLK --------------------------------   
190
generate if ((PCIE_TXBUF_EN == "TRUE") && (PCIE_LINK_SPEED != 3))
191
 
192
    begin : refclk_i
193
 
194
    //---------- Select Reference Clock ----------------------------------------
195
    BUFG refclk_i
196
    (
197
 
198
        //---------- Input -------------------------------------
199
        .I                          (CLK_CLK),
200
        //---------- Output ------------------------------------
201
        .O                          (refclk)
202
 
203
    );
204
 
205
    end
206
 
207
else
208
 
209
    begin : txoutclk_i
210
 
211
    //---------- Select TXOUTCLK -----------------------------------------------
212
    BUFG txoutclk_i
213
    (
214
 
215
        //---------- Input -------------------------------------
216
        .I                          (CLK_TXOUTCLK),
217
        //---------- Output ------------------------------------
218
        .O                          (refclk)
219
 
220
    );
221
 
222
    end
223
 
224
endgenerate
225
 
226
 
227
 
228
//---------- MMCM --------------------------------------------------------------
229
MMCME2_ADV #
230
(
231
 
232
    .BANDWIDTH                  ("OPTIMIZED"),
233
    .CLKOUT4_CASCADE            ("FALSE"),
234
    .COMPENSATION               ("ZHOLD"),
235
    .STARTUP_WAIT               ("FALSE"),
236
    .DIVCLK_DIVIDE              (DIVCLK_DIVIDE),
237
    .CLKFBOUT_MULT_F            (CLKFBOUT_MULT_F),
238
    .CLKFBOUT_PHASE             (0.000),
239
    .CLKFBOUT_USE_FINE_PS       ("FALSE"),
240
    .CLKOUT0_DIVIDE_F           (CLKOUT0_DIVIDE_F),
241
    .CLKOUT0_PHASE              (0.000),
242
    .CLKOUT0_DUTY_CYCLE         (0.500),
243
    .CLKOUT0_USE_FINE_PS        ("FALSE"),
244
    .CLKOUT1_DIVIDE             (CLKOUT1_DIVIDE),
245
    .CLKOUT1_PHASE              (0.000),
246
    .CLKOUT1_DUTY_CYCLE         (0.500),
247
    .CLKOUT1_USE_FINE_PS        ("FALSE"),
248
    .CLKOUT2_DIVIDE             (CLKOUT2_DIVIDE),
249
    .CLKOUT2_PHASE              (0.000),
250
    .CLKOUT2_DUTY_CYCLE         (0.500),
251
    .CLKOUT2_USE_FINE_PS        ("FALSE"),
252
    .CLKOUT3_DIVIDE             (CLKOUT3_DIVIDE),
253
    .CLKOUT3_PHASE              (0.000),
254
    .CLKOUT3_DUTY_CYCLE         (0.500),
255
    .CLKOUT3_USE_FINE_PS        ("FALSE"),
256
    .CLKOUT4_DIVIDE             (CLKOUT4_DIVIDE),
257
    .CLKOUT4_PHASE              (0.000),
258
    .CLKOUT4_DUTY_CYCLE         (0.500),
259
    .CLKOUT4_USE_FINE_PS        ("FALSE"),
260
    .CLKIN1_PERIOD              (CLKIN1_PERIOD),
261
    .REF_JITTER1                (0.010)
262
 
263
)
264
mmcm_i
265
(
266
 
267
     //---------- Input ------------------------------------
268
    .CLKIN1                     (refclk),
269 49 dsmv
    .CLKIN2                     (1'd0),                     // not used, comment out CLKIN2 if it cause implementation issues
270 46 dsmv
  //.CLKIN2                     (refclk),                   // not used, comment out CLKIN2 if it cause implementation issues
271
    .CLKINSEL                   (1'd1),
272
    .CLKFBIN                    (mmcm_fb),
273
    .RST                        (!CLK_RST_N),
274
    .PWRDWN                     (1'd0),
275
 
276
    //---------- Output ------------------------------------
277
    .CLKFBOUT                   (mmcm_fb),
278
    .CLKFBOUTB                  (),
279
    .CLKOUT0                    (clk_125mhz),
280
    .CLKOUT0B                   (),
281
    .CLKOUT1                    (clk_250mhz),
282
    .CLKOUT1B                   (),
283
    .CLKOUT2                    (userclk1),
284
    .CLKOUT2B                   (),
285
    .CLKOUT3                    (userclk2),
286
    .CLKOUT3B                   (),
287
    .CLKOUT4                    (oobclk),
288
    .CLKOUT5                    (),
289
    .CLKOUT6                    (),
290
    .LOCKED                     (mmcm_lock),
291
 
292
    //---------- Dynamic Reconfiguration -------------------
293
    .DCLK                       ( 1'd0),
294
    .DADDR                      ( 7'd0),
295
    .DEN                        ( 1'd0),
296
    .DWE                        ( 1'd0),
297
    .DI                         (16'd0),
298
    .DO                         (),
299
    .DRDY                       (),
300
 
301
    //---------- Dynamic Phase Shift -----------------------
302
    .PSCLK                      (1'd0),
303
    .PSEN                       (1'd0),
304
    .PSINCDEC                   (1'd0),
305
    .PSDONE                     (),
306
 
307
    //---------- Status ------------------------------------
308
    .CLKINSTOPPED               (),
309
    .CLKFBSTOPPED               ()
310
 
311
);
312
 
313
 
314
 
315
//---------- Select PCLK MUX ---------------------------------------------------
316
generate if (PCIE_LINK_SPEED != 1)
317
 
318
    begin : pclk_i1_bufgctrl
319
    //---------- PCLK Mux ----------------------------------
320
    BUFGCTRL pclk_i1
321
    (
322
        //---------- Input ---------------------------------
323
        .CE0                        (1'd1),
324
        .CE1                        (1'd1),
325
        .I0                         (clk_125mhz),
326
        .I1                         (clk_250mhz),
327
        .IGNORE0                    (1'd0),
328
        .IGNORE1                    (1'd0),
329
        .S0                         (~pclk_sel),
330
        .S1                         ( pclk_sel),
331
        //---------- Output --------------------------------
332
        .O                          (pclk_1)
333
    );
334
    end
335
 
336
else
337
 
338
    //---------- Select PCLK Buffer ------------------------
339
    begin : pclk_i1_bufg
340
    //---------- PCLK Buffer -------------------------------
341
    BUFG pclk_i1
342
    (
343
        //---------- Input ---------------------------------
344
        .I                          (clk_125mhz),
345
        //---------- Output --------------------------------
346
        .O                          (clk_125mhz_buf)
347
    );
348
    assign pclk_1 = clk_125mhz_buf;
349
    end
350
 
351
endgenerate
352
 
353
 
354
 
355
//---------- Generate RXOUTCLK Buffer for Debug --------------------------------
356
generate if ((PCIE_DEBUG_MODE == 1) || (PCIE_ASYNC_EN == "TRUE"))
357
 
358
    begin : rxoutclk_per_lane
359
    //---------- Generate per Lane -------------------------
360
    for (i=0; i<PCIE_LANE; i=i+1)
361
 
362
        begin : rxoutclk_i
363
        //---------- RXOUTCLK Buffer -----------------------
364
        BUFG rxoutclk_i
365
        (
366
            //---------- Input -----------------------------
367
            .I                          (CLK_RXOUTCLK_IN[i]),
368
            //---------- Output ----------------------------
369
            .O                          (CLK_RXOUTCLK_OUT[i])
370
        );
371
        end
372
 
373
    end
374
 
375
else
376
 
377
    //---------- Disable RXOUTCLK Buffer for Normal Operation 
378
    begin : rxoutclk_i_disable
379
    assign CLK_RXOUTCLK_OUT = {PCIE_LANE{1'd0}};
380
    end
381
 
382
endgenerate
383
 
384
 
385
//---------- Generate DCLK Buffer ----------------------------------------------
386
generate if (PCIE_LINK_SPEED != 1)
387
 
388
    begin : dclk_i_bufg
389
    //---------- DCLK Buffer -------------------------------
390
    BUFG dclk_i
391
    (
392
        //---------- Input ---------------------------------
393
        .I                          (clk_125mhz),
394
        //---------- Output --------------------------------
395
        .O                          (CLK_DCLK)
396
    );
397
    end
398
 
399
else
400
 
401
    //---------- Disable DCLK Buffer -----------------------
402
    begin : dclk_i
403
    assign CLK_DCLK = clk_125mhz_buf;                       // always 125 MHz in Gen1
404
    end
405
 
406
endgenerate
407
 
408
 
409
 
410
//---------- Generate USERCLK1 Buffer ------------------------------------------
411
generate if (PCIE_USERCLK1_FREQ != 0)
412
 
413
    begin : userclk1_i1
414
    //---------- USERCLK1 Buffer ---------------------------
415
    BUFG usrclk1_i1
416
    (
417
        //---------- Input ---------------------------------
418
        .I                          (userclk1),
419
        //---------- Output --------------------------------
420
        .O                          (userclk1_1)
421
    );
422
    end
423
 
424
else
425
 
426
    //---------- Disable USERCLK1 Buffer -------------------
427
    begin : disable_userclk1_i1
428
    assign userclk1_1 = 1'd0;
429
    end
430
 
431
endgenerate
432
 
433
 
434
 
435
//---------- Generate USERCLK2 Buffer ------------------------------------------
436
generate if (PCIE_USERCLK2_FREQ != 0)
437
 
438
    begin : userclk2_i1
439
    //---------- USERCLK2 Buffer ---------------------------
440
    BUFG usrclk2_i1
441
    (
442
        //---------- Input ---------------------------------
443
        .I                          (userclk2),
444
        //---------- Output --------------------------------
445
        .O                          (userclk2_1)
446
    );
447
    end
448
 
449
else
450
 
451
    //---------- Disable USERCLK2 Buffer -------------------
452
    begin : userclk2_i1_disable
453
    assign userclk2_1 = 1'd0;
454
    end
455
 
456
endgenerate
457
 
458
 
459
 
460
//---------- Generate OOBCLK Buffer --------------------------------------------
461
generate if (PCIE_OOBCLK_MODE == 2)
462
 
463
    begin : oobclk_i1
464
    //---------- OOBCLK Buffer -----------------------------
465
    BUFG oobclk_i1
466
    (
467
        //---------- Input ---------------------------------
468
        .I                          (oobclk),
469
        //---------- Output --------------------------------
470
        .O                          (CLK_OOBCLK)
471
    );
472
    end
473
 
474
else
475
 
476
    //---------- Disable OOBCLK Buffer ---------------------
477
    begin : oobclk_i1_disable
478
    assign CLK_OOBCLK = pclk;
479
    end
480
 
481
endgenerate
482
 
483
 
484
 
485
//---------- Generate 2nd Stage Buffers ----------------------------------------
486
generate if ((PCIE_LINK_SPEED == 3) && (PCIE_ASYNC_EN == "TRUE"))
487
 
488
    begin : second_stage_buf
489
 
490
    //---------- PCLK Buffer ---------------------------------------------------
491
    BUFG pclk_i2
492
    (
493
        //---------- Input -------------------------------------
494
        .I                          (pclk_1),
495
        //---------- Output ------------------------------------
496
        .O                          (pclk)
497
    );
498
 
499
 
500
 
501
    //---------- RXUSRCLK Mux --------------------------------------------------
502
    BUFGCTRL rxusrclk_i2
503
    (
504
        //---------- Input ---------------------------------
505
        .CE0                        (1'b1),
506
        .CE1                        (1'b1),
507
        .I0                         (pclk_1),
508
        .I1                         (CLK_RXOUTCLK_IN[0]),
509
        .IGNORE0                    (1'b0),
510
        .IGNORE1                    (1'b0),
511
        .S0                         (~gen3_reg2),
512
        .S1                         ( gen3_reg2),
513
        //---------- Output --------------------------------
514
        .O                          (CLK_RXUSRCLK)
515
    );
516
 
517
 
518
 
519
    //---------- Generate USERCLK1 Buffer --------------------------------------
520
    if (PCIE_USERCLK1_FREQ != 0)
521
 
522
        begin : userclk1_i2
523
        //---------- USERCLK1 Buffer -----------------------
524
        BUFG usrclk1_i2
525
        (
526
            //---------- Input -----------------------------
527
            .I                          (userclk1_1),
528
            //---------- Output ----------------------------
529
            .O                          (CLK_USERCLK1)
530
        );
531
        end
532
 
533
    else
534
 
535
        //---------- Disable USERCLK1 Buffer ---------------
536
        begin : userclk1_i2_disable
537
        assign CLK_USERCLK1 = userclk1_1;
538
        end
539
 
540
 
541
 
542
    //---------- Generate USERCLK2 Buffer --------------------------------------
543
    if (PCIE_USERCLK2_FREQ != 0)
544
 
545
        begin : userclk2_i2
546
        //---------- USERCLK2 Buffer -----------------------
547
        BUFG usrclk2_i2
548
        (
549
            //---------- Input -----------------------------
550
            .I                          (userclk2_1),
551
            //---------- Output ----------------------------
552
            .O                          (CLK_USERCLK2)
553
        );
554
        end
555
 
556
    else
557
 
558
        //---------- Disable USERCLK2 Buffer ---------------
559
        begin : userclk2_i2_disable
560
        assign CLK_USERCLK2 = userclk2_1;
561
        end
562
 
563
    end
564
 
565
else
566
 
567
    //---------- Disable 2nd Stage Buffer --------------------------------------
568
    begin : second_stage_buf_disable
569
    assign pclk         = pclk_1;
570
    assign CLK_RXUSRCLK = pclk_1;
571
    assign CLK_USERCLK1 = userclk1_1;
572
    assign CLK_USERCLK2 = userclk2_1;
573
    end
574
 
575
endgenerate
576
 
577
 
578
 
579
//---------- Select PCLK -------------------------------------------------------
580
always @ (posedge pclk)
581
begin
582
 
583
    if (!CLK_RST_N)
584
        pclk_sel <= 1'd0;
585
    else
586
        begin
587
        //---------- Select 250 MHz ------------------------
588
        if (&pclk_sel_reg2)
589
            pclk_sel <= 1'd1;
590
        //---------- Select 125 MHz ------------------------  
591
        else if (&(~pclk_sel_reg2))
592
            pclk_sel <= 1'd0;
593
        //---------- Hold PCLK -----------------------------
594
        else
595
            pclk_sel <= pclk_sel;
596
        end
597
 
598
end
599
 
600
 
601
 
602
//---------- PIPE Clock Output -------------------------------------------------
603
assign CLK_PCLK      = pclk;
604
assign CLK_MMCM_LOCK = mmcm_lock;
605
 
606
 
607
 
608
endmodule

powered by: WebSVN 2.1.0

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