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

Subversion Repositories pcie_sg_dma

[/] [pcie_sg_dma/] [branches/] [Virtex6/] [ML605_ISE13.3/] [ipcore_dir_ISE13.3/] [v6_pcie_v1_6/] [source/] [pcie_clocking_v6.v] - Blame information for rev 13

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 13 barabba
//-----------------------------------------------------------------------------
2
//
3
// (c) Copyright 2009-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    : Virtex-6 Integrated Block for PCI Express
51
// File       : pcie_clocking_v6.v
52
// Version    : 1.7
53
//-- Description: Clocking module for Virtex6 PCIe Block
54
//--
55
//--
56
//--
57
//--------------------------------------------------------------------------------
58
 
59
`timescale 1ns/1ns
60
 
61
module pcie_clocking_v6 # (
62
 
63
  parameter IS_ENDPOINT = "TRUE",
64
  parameter CAP_LINK_WIDTH = 8,        // 1 - x1 , 2 - x2 , 4 - x4 , 8 - x8
65
  parameter CAP_LINK_SPEED = 4'h1,     // 1 - Gen1 , 2 - Gen2
66
  parameter REF_CLK_FREQ = 0,          // 0 - 100 MHz , 1 - 125 MHz , 2 - 250 MHz
67
  parameter USER_CLK_FREQ = 3          // 0 - 31.25 MHz , 1 - 62.5 MHz , 2 - 125 MHz , 3 - 250 MHz , 4 - 500Mhz
68
 
69
)
70
(
71
 
72
  input  wire        sys_clk,
73
  input  wire        gt_pll_lock,
74
  input  wire        sel_lnk_rate,
75
  input  wire [1:0]  sel_lnk_width,
76
 
77
  output wire        sys_clk_bufg,
78
  output wire        pipe_clk,
79
  output wire        user_clk,
80
  output wire        block_clk,
81
  output wire        drp_clk,
82
  output wire        clock_locked
83
 
84
);
85
 
86
  parameter TCQ = 1;
87
 
88
  wire               mmcm_locked;
89
  wire               mmcm_clkfbin;
90
  wire               mmcm_clkfbout;
91
  wire               mmcm_reset;
92
  wire               clk_500;
93
  wire               clk_250;
94
  wire               clk_125;
95
  wire               user_clk_prebuf;
96
  wire               sel_lnk_rate_d;
97
 
98
  reg  [1:0]         reg_clock_locked = 2'b11;
99
 
100
 
101
  // MMCM Configuration
102
 
103
  localparam         mmcm_clockin_period  = (REF_CLK_FREQ == 0) ? 10 :
104
                                            (REF_CLK_FREQ == 1) ? 8 :
105
                                            (REF_CLK_FREQ == 2) ? 4 : 0;
106
 
107
  localparam         mmcm_clockfb_mult = (REF_CLK_FREQ == 0) ? 10 :
108
                                         (REF_CLK_FREQ == 1) ? 8 :
109
                                         (REF_CLK_FREQ == 2) ? 8 : 0;
110
 
111
 
112
  localparam         mmcm_divclk_divide = (REF_CLK_FREQ == 0) ? 1 :
113
                                          (REF_CLK_FREQ == 1) ? 1 :
114
                                          (REF_CLK_FREQ == 2) ? 2 : 0;
115
 
116
  localparam         mmcm_clock0_div = 4;
117
  localparam         mmcm_clock1_div = 8;
118
  localparam         mmcm_clock2_div = ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 0)) ?  32 :
119
                                       ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 1)) ?  16 :
120
                                       ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 1)) ?  16 :
121
                                       ((CAP_LINK_WIDTH == 6'h02) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 1)) ?  16 : 2;
122
  localparam         mmcm_clock3_div = 2;
123
 
124
  // MMCM Reset
125
 
126
  assign             mmcm_reset = 1'b0;
127
 
128
  generate
129
 
130
 
131
    // PIPE Clock BUFG.
132
 
133
    if (CAP_LINK_SPEED == 4'h1) begin : GEN1_LINK
134
 
135
      BUFG pipe_clk_bufg (.O(pipe_clk),.I(clk_125));
136
 
137
    end else if (CAP_LINK_SPEED == 4'h2) begin : GEN2_LINK
138
 
139
      SRL16E #(.INIT(0)) sel_lnk_rate_delay (.Q(sel_lnk_rate_d),
140
             .D(sel_lnk_rate), .CLK(pipe_clk),.CE(clock_locked), .A3(1'b1),.A2(1'b1),.A1(1'b1),.A0(1'b1));
141
 
142
      BUFGMUX pipe_clk_bufgmux (.O(pipe_clk), .I0(clk_125),.I1(clk_250),.S(sel_lnk_rate_d));
143
 
144
    end else begin : ILLEGAL_LINK_SPEED
145
 
146
      //$display("Confiuration Error : CAP_LINK_SPEED = %d, must be either 1 or 2.", CAP_LINK_SPEED);
147
      //$finish;
148
 
149
    end
150
 
151
    // User Clock BUFG.
152
 
153
    if ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 0)) begin : x1_GEN1_31_25
154
 
155
      BUFG user_clk_bufg (.O(user_clk),.I(user_clk_prebuf));
156
 
157
    end else if ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 1)) begin : x1_GEN1_62_50
158
 
159
      BUFG user_clk_bufg (.O(user_clk),.I(user_clk_prebuf));
160
 
161
    end else if ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 2)) begin : x1_GEN1_125_00
162
 
163
      BUFG user_clk_bufg (.O(user_clk),.I(clk_125));
164
 
165
    end else if ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 3)) begin : x1_GEN1_250_00
166
 
167
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
168
 
169
    end else if ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 1)) begin : x1_GEN2_62_50
170
 
171
      BUFG user_clk_bufg (.O(user_clk),.I(user_clk_prebuf));
172
 
173
    end else if ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 2)) begin : x1_GEN2_125_00
174
 
175
      BUFG user_clk_bufg (.O(user_clk),.I(clk_125));
176
 
177
    end else if ((CAP_LINK_WIDTH == 6'h01) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 3)) begin : x1_GEN2_250_00
178
 
179
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
180
 
181
    end else if ((CAP_LINK_WIDTH == 6'h02) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 1)) begin : x2_GEN1_62_50
182
 
183
      BUFG user_clk_bufg (.O(user_clk),.I(user_clk_prebuf));
184
 
185
    end else if ((CAP_LINK_WIDTH == 6'h02) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 2)) begin : x2_GEN1_125_00
186
 
187
      BUFG user_clk_bufg (.O(user_clk),.I(clk_125));
188
 
189
    end else if ((CAP_LINK_WIDTH == 6'h02) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 3)) begin : x2_GEN1_250_00
190
 
191
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
192
 
193
    end else if ((CAP_LINK_WIDTH == 6'h02) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 2)) begin : x2_GEN2_125_00
194
 
195
      BUFG user_clk_bufg (.O(user_clk),.I(clk_125));
196
 
197
    end else if ((CAP_LINK_WIDTH == 6'h02) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 3)) begin : x2_GEN2_250_00
198
 
199
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
200
 
201
    end else if ((CAP_LINK_WIDTH == 6'h04) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 2)) begin : x4_GEN1_125_00
202
 
203
      BUFG user_clk_bufg (.O(user_clk),.I(clk_125));
204
 
205
    end else if ((CAP_LINK_WIDTH == 6'h04) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 3)) begin : x4_GEN1_250_00
206
 
207
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
208
 
209
    end else if ((CAP_LINK_WIDTH == 6'h04) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 3)) begin : x4_GEN2_250_00
210
 
211
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
212
 
213
    end else if ((CAP_LINK_WIDTH == 6'h08) && (CAP_LINK_SPEED == 4'h1) && (USER_CLK_FREQ == 3)) begin : x8_GEN1_250_00
214
 
215
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
216
 
217
    end else if ((CAP_LINK_WIDTH == 6'h08) && (CAP_LINK_SPEED == 4'h2) && (USER_CLK_FREQ == 4)) begin : x8_GEN2_250_00
218
 
219
      BUFG user_clk_bufg (.O(user_clk),.I(clk_250));
220
      BUFG block_clk_bufg (.O(block_clk),.I(clk_500));
221
 
222
    end else begin : ILLEGAL_CONFIGURATION
223
 
224
      //$display("Confiuration Error : Unsupported Link Width, Link Speed and User Clock Frequency Combination");
225
      //$finish;
226
 
227
    end
228
 
229
  endgenerate
230
 
231
  // DRP clk
232
  BUFG drp_clk_bufg_i  (.O(drp_clk), .I(clk_125));
233
 
234
  // Feedback BUFG. Required for Temp Compensation
235
  BUFG clkfbin_bufg_i  (.O(mmcm_clkfbin), .I(mmcm_clkfbout));
236
 
237
  // sys_clk BUFG.
238
  BUFG sys_clk_bufg_i  (.O(sys_clk_bufg), .I(sys_clk));
239
 
240
  MMCM_ADV # (
241
 
242
    // 5 for 100 MHz , 4 for 125 MHz , 2 for 250 MHz
243
    .CLKFBOUT_MULT_F (mmcm_clockfb_mult),
244
    .DIVCLK_DIVIDE (mmcm_divclk_divide),
245
    .CLKFBOUT_PHASE(0),
246
 
247
    // 10 for 100 MHz, 4 for 250 MHz
248
    .CLKIN1_PERIOD (mmcm_clockin_period),
249
    .CLKIN2_PERIOD (mmcm_clockin_period),
250
 
251
    // 500 MHz / mmcm_clockx_div  
252
    .CLKOUT0_DIVIDE_F (mmcm_clock0_div),
253
    .CLKOUT0_PHASE (0),
254
 
255
    .CLKOUT1_DIVIDE (mmcm_clock1_div),
256
    .CLKOUT1_PHASE (0),
257
 
258
    .CLKOUT2_DIVIDE (mmcm_clock2_div),
259
    .CLKOUT2_PHASE (0),
260
 
261
    .CLKOUT3_DIVIDE (mmcm_clock3_div),
262
    .CLKOUT3_PHASE (0)
263
 
264
  ) mmcm_adv_i (
265
 
266
    .CLKFBOUT     (mmcm_clkfbout),
267
    .CLKOUT0      (clk_250),            // 250 MHz for pipe_clk
268
    .CLKOUT1      (clk_125),            // 125 MHz for pipe_clk
269
    .CLKOUT2      (user_clk_prebuf),    // user clk
270
    .CLKOUT3      (clk_500),
271
    .CLKOUT4      (),
272
    .CLKOUT5      (),
273
    .CLKOUT6      (),
274
    .DO           (),
275
    .DRDY         (),
276
    .CLKFBOUTB    (),
277
    .CLKFBSTOPPED (),
278
    .CLKINSTOPPED (),
279
    .CLKOUT0B     (),
280
    .CLKOUT1B     (),
281
    .CLKOUT2B     (),
282
    .CLKOUT3B     (),
283
    .PSDONE       (),
284
    .LOCKED       (mmcm_locked),
285
    .CLKFBIN      (mmcm_clkfbin),
286
    .CLKIN1       (sys_clk),
287
    .CLKIN2       (1'b0),
288
    .CLKINSEL     (1'b1),
289
    .DADDR        (7'b0),
290
    .DCLK         (1'b0),
291
    .DEN          (1'b0),
292
    .DI           (16'b0),
293
    .DWE          (1'b0),
294
    .PSEN         (1'b0),
295
    .PSINCDEC     (1'b0),
296
    .PWRDWN       (1'b0),
297
    .PSCLK        (1'b0),
298
    .RST          (mmcm_reset)
299
  );
300
 
301
  // Synchronize MMCM locked output
302
  always @ (posedge pipe_clk or negedge gt_pll_lock) begin
303
 
304
    if (!gt_pll_lock)
305
      reg_clock_locked[1:0] <= #TCQ 2'b11;
306
    else
307
      reg_clock_locked[1:0] <= #TCQ {reg_clock_locked[0], 1'b0};
308
 
309
  end
310
  assign  clock_locked = !reg_clock_locked[1] & mmcm_locked;
311
 
312
endmodule
313
 

powered by: WebSVN 2.1.0

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