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

Subversion Repositories pcie_sg_dma

[/] [pcie_sg_dma/] [branches/] [Virtex6/] [ML605_ISE12.3/] [pcie_sg_dma/] [Virtex6/] [ML605/] [v6_pcie_v1_3/] [source/] [pcie_clocking_v6.v] - Blame information for rev 11

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 11 barabba
//-----------------------------------------------------------------------------
2
//
3
// (c) Copyright 2009 Xilinx, Inc. All rights reserved.
4
//
5
// This file contains confidential and proprietary information of Xilinx, Inc.
6
// and is protected under U.S. and international copyright and other
7
// intellectual property laws.
8
//
9
// DISCLAIMER
10
//
11
// This disclaimer is not a license and does not grant any rights to the
12
// materials distributed herewith. Except as otherwise provided in a valid
13
// license issued to you by Xilinx, and to the maximum extent permitted by
14
// applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
15
// FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
16
// IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
17
// MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
18
// and (2) Xilinx shall not be liable (whether in contract or tort, including
19
// negligence, or under any other theory of liability) for any loss or damage
20
// of any kind or nature related to, arising under or in connection with these
21
// materials, including for any direct, or any indirect, special, incidental,
22
// or consequential loss or damage (including loss of data, profits, goodwill,
23
// or any type of loss or damage suffered as a result of any action brought by
24
// a third party) even if such damage or loss was reasonably foreseeable or
25
// Xilinx had been advised of the possibility of the same.
26
//
27
// CRITICAL APPLICATIONS
28
//
29
// Xilinx products are not designed or intended to be fail-safe, or for use in
30
// any application requiring fail-safe performance, such as life-support or
31
// safety devices or systems, Class III medical devices, nuclear facilities,
32
// applications related to the deployment of airbags, or any other
33
// applications that could lead to death, personal injury, or severe property
34
// or environmental damage (individually and collectively, "Critical
35
// Applications"). Customer assumes the sole risk and liability of any use of
36
// Xilinx products in Critical Applications, subject only to applicable laws
37
// and regulations governing limitations on product liability.
38
//
39
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
40
// AT ALL TIMES.
41
//
42
//-----------------------------------------------------------------------------
43
// Project    : Virtex-6 Integrated Block for PCI Express
44
// File       : pcie_clocking_v6.v
45
//-- Description: Clocking module for Virtex6 PCIe Block
46
//--
47
//--
48
//--
49
//--------------------------------------------------------------------------------
50
 
51
`timescale 1ns/1ns
52
 
53
module pcie_clocking_v6 # (
54
 
55
  parameter CAP_LINK_WIDTH = 8,        // 1 - x1 , 2 - x2 , 4 - x4 , 8 - x8
56
  parameter CAP_LINK_SPEED = 4'h1,     // 1 - Gen1 , 2 - Gen2
57
  parameter REF_CLK_FREQ = 0,          // 0 - 100 MHz , 1 - 125 MHz , 2 - 250 MHz
58
  parameter USER_CLK_FREQ = 3          // 0 - 31.25 MHz , 1 - 62.5 MHz , 2 - 125 MHz , 3 - 250 MHz , 4 - 500Mhz
59
 
60
)
61
(
62
 
63
  input  wire        sys_clk,
64
  input  wire        gt_pll_lock,
65
  input  wire        sel_lnk_rate,
66
  input  wire [1:0]  sel_lnk_width,
67
 
68
  output wire        sys_clk_bufg,
69
  output wire        pipe_clk,
70
  output wire        user_clk,
71
  output wire        block_clk,
72
  output wire        clock_locked
73
 
74
);
75
 
76
 
77
  wire               mmcm_locked;
78
  wire               mmcm_clkfbin;
79
  wire               mmcm_clkfbout;
80
  wire               clk_500;
81
  wire               clk_250;
82
  wire               clk_125;
83
  wire               user_clk_prebuf;
84
  wire               sel_lnk_rate_d;
85
 
86
  assign             clock_locked = mmcm_locked;
87
 
88
  // MMCM Configuration
89
 
90
 
91
  localparam         mmcm_clockin_period  = (REF_CLK_FREQ == 0) ? 10 :
92
                                            (REF_CLK_FREQ == 1) ? 8 :
93
                                            (REF_CLK_FREQ == 2) ? 4 : 0;
94
 
95
  localparam         mmcm_clockfb_mult = (REF_CLK_FREQ == 0) ? 10 :
96
                                         (REF_CLK_FREQ == 1) ? 8 :
97
                                         (REF_CLK_FREQ == 2) ? 8 : 0;
98
 
99
 
100
  localparam         mmcm_divclk_divide = (REF_CLK_FREQ == 0) ? 1 :
101
                                          (REF_CLK_FREQ == 1) ? 1 :
102
                                          (REF_CLK_FREQ == 2) ? 2 : 0;
103
 
104
  localparam         mmcm_clock0_div = 4;
105
  localparam         mmcm_clock1_div = 8;
106
  localparam         mmcm_clock2_div = ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 0)) ? 32 :
107
                                       ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 1)) ? 16 :
108
                                       ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 1)) ? 16 :
109
                                       ((CAP_LINK_WIDTH == 6'h02) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 1)) ? 16 : 2;
110
  localparam         mmcm_clock3_div = 2;
111
  generate
112
 
113
    // PIPE Clock BUFG.
114
 
115
    if (CAP_LINK_SPEED == 4'h1) begin : GEN1_LINK
116
 
117
      BUFG pipe_clk_bufg (.O(pipe_clk),.I(clk_125));
118
 
119
    end else if (CAP_LINK_SPEED == 4'h2) begin : GEN2_LINK
120
 
121
      SRL16E #(.INIT(0)) sel_lnk_rate_delay (.Q(sel_lnk_rate_d),
122
             .D(sel_lnk_rate), .CLK(pipe_clk),.CE(mmcm_locked), .A3(1'b1),.A2(1'b1),.A1(1'b1),.A0(1'b1));
123
 
124
      BUFGMUX pipe_clk_bufgmux (.O(pipe_clk), .I0(clk_125),.I1(clk_250),.S(sel_lnk_rate_d));
125
 
126
    end else begin : ILLEGAL_LINK_SPEED
127
 
128
      //$display("Confiuration Error : CAP_LINK_SPEED = %d, must be either 1 or 2.", CAP_LINK_SPEED);
129
      //$finish;
130
 
131
    end
132
 
133
    // User Clock BUFG.
134
 
135
    if ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 0)) begin : x1_GEN1_31_25
136
 
137
      BUFG user_clk_bufg (.O(user_clk),.I(user_clk_prebuf));
138
 
139
    end else if ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 1)) begin : x1_GEN1_62_50
140
 
141
      BUFG user_clk_bufg (.O(user_clk),.I(user_clk_prebuf));
142
 
143
    end else if ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 2)) begin : x1_GEN1_125_00
144
 
145
      BUFG user_clk_bufg (.O(user_clk),.I(clk_125));
146
 
147
    end else if ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 3)) begin : x1_GEN1_250_00
148
 
149
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
150
 
151
    end else if ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 1)) begin : x1_GEN2_62_50
152
 
153
      BUFG user_clk_bufg (.O(user_clk),.I(user_clk_prebuf));
154
 
155
    end else if ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 2)) begin : x1_GEN2_125_00
156
 
157
      BUFG user_clk_bufg (.O(user_clk),.I(clk_125));
158
 
159
    end else if ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 3)) begin : x1_GEN2_250_00
160
 
161
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
162
 
163
    end else if ((CAP_LINK_WIDTH == 6'h02) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 1)) begin : x2_GEN1_62_50
164
 
165
      BUFG user_clk_bufg (.O(user_clk),.I(user_clk_prebuf));
166
 
167
    end else if ((CAP_LINK_WIDTH == 6'h02) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 2)) begin : x2_GEN1_125_00
168
 
169
      BUFG user_clk_bufg (.O(user_clk),.I(clk_125));
170
 
171
    end else if ((CAP_LINK_WIDTH == 6'h02) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 3)) begin : x2_GEN1_250_00
172
 
173
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
174
 
175
    end else if ((CAP_LINK_WIDTH == 6'h02) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 2)) begin : x2_GEN2_125_00
176
 
177
      BUFG user_clk_bufg (.O(user_clk),.I(clk_125));
178
 
179
    end else if ((CAP_LINK_WIDTH == 6'h02) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 3)) begin : x2_GEN2_250_00
180
 
181
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
182
 
183
    end else if ((CAP_LINK_WIDTH == 6'h04) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 2)) begin : x4_GEN1_125_00
184
 
185
      BUFG user_clk_bufg (.O(user_clk),.I(clk_125));
186
 
187
    end else if ((CAP_LINK_WIDTH == 6'h04) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 3)) begin : x4_GEN1_250_00
188
 
189
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
190
 
191
    end else if ((CAP_LINK_WIDTH == 6'h04) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 3)) begin : x4_GEN2_250_00
192
 
193
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
194
 
195
    end else if ((CAP_LINK_WIDTH == 6'h08) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 3)) begin : x8_GEN1_250_00
196
 
197
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
198
 
199
    end else if ((CAP_LINK_WIDTH == 6'h08) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 4)) begin : x8_GEN2_250_00
200
 
201
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
202
      BUFG block_clk_bufg (.O(block_clk),.I(clk_500));
203
 
204
    end else begin : ILLEGAL_CONFIGURATION
205
 
206
      //$display("Confiuration Error : Unsupported Link Width, Link Speed and User Clock Frequency Combination");
207
      //$finish;
208
 
209
    end
210
 
211
  endgenerate
212
 
213
  // Feedback BUFG. Required for Temp Compensation
214
  BUFG clkfbin_bufg_i  (.O(mmcm_clkfbin), .I(mmcm_clkfbout));
215
 
216
  // sys_clk BUFG. Required for routability from IBUFDS_GTXE1
217
  BUFG sys_clk_bufg_i  (.O(sys_clk_bufg), .I(sys_clk));
218
 
219
  MMCM_ADV # (
220
 
221
    // 5 for 100 MHz , 4 for 125 MHz , 2 for 250 MHz
222
    .CLKFBOUT_MULT_F (mmcm_clockfb_mult),
223
        .DIVCLK_DIVIDE (mmcm_divclk_divide),
224
        .CLKFBOUT_PHASE(0),
225
 
226
    // 10 for 100 MHz, 4 for 250 MHz
227
    .CLKIN1_PERIOD (mmcm_clockin_period),
228
    .CLKIN2_PERIOD (mmcm_clockin_period),
229
 
230
    // 500 MHz / mmcm_clockx_div  
231
    .CLKOUT0_DIVIDE_F (mmcm_clock0_div),
232
    .CLKOUT0_PHASE (0),
233
 
234
    .CLKOUT1_DIVIDE (mmcm_clock1_div),
235
    .CLKOUT1_PHASE (0),
236
 
237
    .CLKOUT2_DIVIDE (mmcm_clock2_div),
238
    .CLKOUT2_PHASE (0),
239
 
240
    .CLKOUT3_DIVIDE (mmcm_clock3_div),
241
    .CLKOUT3_PHASE (0)
242
 
243
  ) mmcm_adv_i (
244
 
245
    .CLKFBOUT     (mmcm_clkfbout),
246
    .CLKOUT0      (clk_250),            // 250 MHz for pipe_clk
247
    .CLKOUT1      (clk_125),            // 125 MHz for pipe_clk
248
    .CLKOUT2      (user_clk_prebuf),    // user clk
249
    .CLKOUT3      (clk_500),
250
    .CLKOUT4      (),
251
    .CLKOUT5      (),
252
    .CLKOUT6      (),
253
    .DO           (),
254
    .DRDY         (),
255
    .CLKFBOUTB    (),
256
    .CLKFBSTOPPED (),
257
    .CLKINSTOPPED (),
258
    .CLKOUT0B     (),
259
    .CLKOUT1B     (),
260
    .CLKOUT2B     (),
261
    .CLKOUT3B     (),
262
    .PSDONE       (),
263
    .LOCKED       (mmcm_locked),
264
    .CLKFBIN      (mmcm_clkfbin),
265
    .CLKIN1       (sys_clk),
266
    .CLKIN2       (1'b0),
267
    .CLKINSEL     (1'b1),
268
    .DADDR        (7'b0),
269
    .DCLK         (1'b0),
270
    .DEN          (1'b0),
271
    .DI           (16'b0),
272
    .DWE          (1'b0),
273
    .PSEN         (1'b0),
274
    .PSINCDEC     (1'b0),
275
    .PWRDWN       (1'b0),
276
    .PSCLK        (1'b0),
277
    .RST          (~gt_pll_lock)
278
  );
279
 
280
 
281
endmodule
282
 

powered by: WebSVN 2.1.0

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