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_qpll_drp.v] - Blame information for rev 46

Go to most recent revision | 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_qpll_drp.v
52
// Version    : 1.9
53
//------------------------------------------------------------------------------
54
//  Filename     :  qpll_drp.v
55
//  Description  :  QPLL DRP Module for 7 Series Transceiver
56
//  Version      :  18.2
57
//------------------------------------------------------------------------------
58
 
59
 
60
 
61
`timescale 1ns / 1ps
62
 
63
 
64
 
65
//---------- QPLL DRP Module ---------------------------------------------------
66
module cl_a7pcie_x4_qpll_drp #
67
(
68
 
69
    parameter PCIE_GT_DEVICE   = "GTX",                     // PCIe GT device
70
    parameter PCIE_USE_MODE    = "3.0",                     // PCIe use mode
71
    parameter PCIE_PLL_SEL     = "CPLL",                    // PCIe PLL select for Gen1/Gen2 only
72
    parameter PCIE_REFCLK_FREQ = 0,                         // PCIe reference clock frequency
73
    parameter LOAD_CNT_MAX     = 2'd3,                      // Load max count
74
    parameter INDEX_MAX        = 3'd6                       // Index max count
75
 
76
)
77
 
78
(
79
 
80
    //---------- Input -------------------------------------
81
    input               DRP_CLK,
82
    input               DRP_RST_N,
83
    input               DRP_OVRD,
84
    input               DRP_GEN3,
85
    input               DRP_QPLLLOCK,
86
    input               DRP_START,
87
    input       [15:0]  DRP_DO,
88
    input               DRP_RDY,
89
 
90
    //---------- Output ------------------------------------
91
    output      [ 7:0]  DRP_ADDR,
92
    output              DRP_EN,
93
    output      [15:0]  DRP_DI,
94
    output              DRP_WE,
95
    output              DRP_DONE,
96
    output              DRP_QPLLRESET,
97
    output      [ 5:0]  DRP_CRSCODE,
98
    output      [ 8:0]  DRP_FSM
99
 
100
);
101
 
102
    //---------- Input Registers ---------------------------
103
    reg                 ovrd_reg1;
104
    reg                 gen3_reg1;
105
    reg                 qplllock_reg1;
106
    reg                 start_reg1;
107
    reg         [15:0]  do_reg1;
108
    reg                 rdy_reg1;
109
 
110
    reg                 ovrd_reg2;
111
    reg                 gen3_reg2;
112
    reg                 qplllock_reg2;
113
    reg                 start_reg2;
114
    reg         [15:0]  do_reg2;
115
    reg                 rdy_reg2;
116
 
117
    //---------- Internal Signals --------------------------
118
    reg         [ 1:0]  load_cnt =  2'd0;
119
    reg         [ 2:0]  index    =  3'd0;
120
    reg                 mode     =  1'd0;
121
    reg         [ 5:0]  crscode  =  6'd0;
122
 
123
    //---------- Output Registers --------------------------
124
    reg         [ 7:0]  addr    =  8'd0;
125
    reg         [15:0]  di      = 16'd0;
126
    reg                 done    =  1'd0;
127
    reg         [ 8:0]  fsm     =  7'd1;
128
 
129
    //---------- DRP Address -------------------------------  
130
    localparam          ADDR_QPLL_FBDIV               = 8'h36;
131
    localparam          ADDR_QPLL_CFG                 = 8'h32;
132
    localparam          ADDR_QPLL_LPF                 = 8'h31;
133
    localparam          ADDR_CRSCODE                  = 8'h88;
134
    localparam          ADDR_QPLL_COARSE_FREQ_OVRD    = 8'h35;
135
    localparam          ADDR_QPLL_COARSE_FREQ_OVRD_EN = 8'h36;
136
    localparam          ADDR_QPLL_LOCK_CFG            = 8'h34;
137
 
138
    //---------- DRP Mask ----------------------------------
139
    localparam          MASK_QPLL_FBDIV               = 16'b1111110000000000;  // Unmask bit [ 9: 0] 
140
    localparam          MASK_QPLL_CFG                 = 16'b1111111110111111;  // Unmask bit [    6]
141
    localparam          MASK_QPLL_LPF                 = 16'b1000011111111111;  // Unmask bit [14:11]
142
    localparam          MASK_QPLL_COARSE_FREQ_OVRD    = 16'b0000001111111111;  // Unmask bit [15:10] 
143
    localparam          MASK_QPLL_COARSE_FREQ_OVRD_EN = 16'b1111011111111111;  // Unmask bit [   11]      
144
    localparam          MASK_QPLL_LOCK_CFG            = 16'b1110011111111111;  // Unmask bit [12:11]     
145
 
146
    //---------- DRP Data for Normal QPLLLOCK Mode ---------
147
    localparam          NORM_QPLL_COARSE_FREQ_OVRD    = 16'b0000000000000000;  // Coarse freq value
148
    localparam          NORM_QPLL_COARSE_FREQ_OVRD_EN = 16'b0000000000000000;  // Normal QPLL lock  
149
    localparam          NORM_QPLL_LOCK_CFG            = 16'b0000000000000000;  // Normal QPLL lock config 
150
 
151
    //---------- DRP Data for Optimize QPLLLOCK Mode -------
152
    localparam          OVRD_QPLL_COARSE_FREQ_OVRD    = 16'b0000000000000000;  // Coarse freq value
153
    localparam          OVRD_QPLL_COARSE_FREQ_OVRD_EN = 16'b0000100000000000;  // Override QPLL lock 
154
    localparam          OVRD_QPLL_LOCK_CFG            = 16'b0000000000000000;  // Override QPLL lock config 
155
 
156
    //---------- Select QPLL Feedback Divider --------------
157
    //  N = 100 for 100 MHz ref clk and 10Gb/s line rate
158
    //  N =  80 for 125 MHz ref clk and 10Gb/s line rate
159
    //  N =  40 for 250 MHz ref clk and 10Gb/s line rate
160
    //------------------------------------------------------
161
    //  N =  80 for 100 MHz ref clk and  8Gb/s line rate
162
    //  N =  64 for 125 MHz ref clk and  8Gb/s line rate
163
    //  N =  32 for 250 MHz ref clk and  8Gb/s line rate
164
    //------------------------------------------------------
165
    localparam          QPLL_FBDIV = (PCIE_REFCLK_FREQ == 2) && (PCIE_PLL_SEL == "QPLL") ? 16'b0000000010000000 :
166
                                     (PCIE_REFCLK_FREQ == 1) && (PCIE_PLL_SEL == "QPLL") ? 16'b0000000100100000 :
167
                                     (PCIE_REFCLK_FREQ == 0) && (PCIE_PLL_SEL == "QPLL") ? 16'b0000000101110000 :
168
                                     (PCIE_REFCLK_FREQ == 2) && (PCIE_PLL_SEL == "CPLL") ? 16'b0000000001100000 :
169
                                     (PCIE_REFCLK_FREQ == 1) && (PCIE_PLL_SEL == "CPLL") ? 16'b0000000011100000 : 16'b0000000100100000;
170
 
171
    localparam          GEN12_QPLL_FBDIV = (PCIE_REFCLK_FREQ == 2) ? 16'b0000000010000000 :
172
                                           (PCIE_REFCLK_FREQ == 1) ? 16'b0000000100100000 : 16'b0000000101110000;
173
 
174
    localparam          GEN3_QPLL_FBDIV  = (PCIE_REFCLK_FREQ == 2) ? 16'b0000000001100000 :
175
                                           (PCIE_REFCLK_FREQ == 1) ? 16'b0000000011100000 : 16'b0000000100100000;
176
 
177
    //---------- Select QPLL Configuration ---------------------------
178
    //  QPLL_CFG[6] = 0 for upper band
179
    //              = 1 for lower band
180
    //----------------------------------------------------------------
181
    localparam          GEN12_QPLL_CFG = (PCIE_PLL_SEL == "QPLL") ? 16'b0000000000000000 : 16'b0000000001000000;
182
    localparam          GEN3_QPLL_CFG  = 16'b0000000001000000;
183
 
184
    //---------- Select QPLL LPF -------------------------------------
185
    localparam          GEN12_QPLL_LPF = (PCIE_PLL_SEL == "QPLL") ? 16'b0_0100_00000000000 : 16'b0_1101_00000000000;
186
    localparam          GEN3_QPLL_LPF  = 16'b0_1101_00000000000;
187
 
188
 
189
 
190
    //---------- DRP Data ----------------------------------       
191
    wire        [15:0]  data_qpll_fbdiv;
192
    wire        [15:0]  data_qpll_cfg;
193
    wire        [15:0]  data_qpll_lpf;
194
    wire        [15:0]  data_qpll_coarse_freq_ovrd;
195
    wire        [15:0]  data_qpll_coarse_freq_ovrd_en;
196
    wire        [15:0]  data_qpll_lock_cfg;
197
 
198
    //---------- FSM ---------------------------------------  
199
    localparam          FSM_IDLE      = 9'b000000001;
200
    localparam          FSM_LOAD      = 9'b000000010;
201
    localparam          FSM_READ      = 9'b000000100;
202
    localparam          FSM_RRDY      = 9'b000001000;
203
    localparam          FSM_WRITE     = 9'b000010000;
204
    localparam          FSM_WRDY      = 9'b000100000;
205
    localparam          FSM_DONE      = 9'b001000000;
206
    localparam          FSM_QPLLRESET = 9'b010000000;
207
    localparam          FSM_QPLLLOCK  = 9'b100000000;
208
 
209
 
210
 
211
//---------- Input FF ----------------------------------------------------------
212
always @ (posedge DRP_CLK)
213
begin
214
 
215
    if (!DRP_RST_N)
216
        begin
217
        //---------- 1st Stage FF --------------------------
218
        ovrd_reg1     <=  1'd0;
219
        gen3_reg1     <=  1'd0;
220
        qplllock_reg1 <=  1'd0;
221
        start_reg1    <=  1'd0;
222
        do_reg1       <= 16'd0;
223
        rdy_reg1      <=  1'd0;
224
        //---------- 2nd Stage FF --------------------------
225
        ovrd_reg2     <=  1'd0;
226
        gen3_reg2     <=  1'd0;
227
        qplllock_reg2 <=  1'd0;
228
        start_reg2    <=  1'd0;
229
        do_reg2       <= 16'd0;
230
        rdy_reg2      <=  1'd0;
231
        end
232
 
233
    else
234
        begin
235
        //---------- 1st Stage FF --------------------------
236
        ovrd_reg1     <= DRP_OVRD;
237
        gen3_reg1     <= DRP_GEN3;
238
        qplllock_reg1 <= DRP_QPLLLOCK;
239
        start_reg1    <= DRP_START;
240
        do_reg1       <= DRP_DO;
241
        rdy_reg1      <= DRP_RDY;
242
        //---------- 2nd Stage FF --------------------------
243
        ovrd_reg2     <= ovrd_reg1;
244
        gen3_reg2     <= gen3_reg1;
245
        qplllock_reg2 <= qplllock_reg1;
246
        start_reg2    <= start_reg1;
247
        do_reg2       <= do_reg1;
248
        rdy_reg2      <= rdy_reg1;
249
        end
250
 
251
end
252
 
253
 
254
 
255
//---------- Select DRP Data ---------------------------------------------------
256
assign data_qpll_fbdiv               = (gen3_reg2) ? GEN3_QPLL_FBDIV : GEN12_QPLL_FBDIV;
257
assign data_qpll_cfg                 = (gen3_reg2) ? GEN3_QPLL_CFG   : GEN12_QPLL_CFG;
258
assign data_qpll_lpf                 = (gen3_reg2) ? GEN3_QPLL_LPF   : GEN12_QPLL_LPF;
259
assign data_qpll_coarse_freq_ovrd    =  NORM_QPLL_COARSE_FREQ_OVRD;
260
assign data_qpll_coarse_freq_ovrd_en = (ovrd_reg2) ? OVRD_QPLL_COARSE_FREQ_OVRD_EN : NORM_QPLL_COARSE_FREQ_OVRD_EN;
261
assign data_qpll_lock_cfg            = (ovrd_reg2) ? OVRD_QPLL_LOCK_CFG            : NORM_QPLL_LOCK_CFG;
262
 
263
 
264
//---------- Load Counter ------------------------------------------------------
265
always @ (posedge DRP_CLK)
266
begin
267
 
268
    if (!DRP_RST_N)
269
        load_cnt <= 2'd0;
270
    else
271
 
272
        //---------- Increment Load Counter ----------------
273
        if ((fsm == FSM_LOAD) && (load_cnt < LOAD_CNT_MAX))
274
            load_cnt <= load_cnt + 2'd1;
275
 
276
        //---------- Hold Load Counter ---------------------
277
        else if ((fsm == FSM_LOAD) && (load_cnt == LOAD_CNT_MAX))
278
            load_cnt <= load_cnt;
279
 
280
        //---------- Reset Load Counter --------------------
281
        else
282
            load_cnt <= 2'd0;
283
 
284
end
285
 
286
 
287
 
288
//---------- Update DRP Address and Data ---------------------------------------
289
always @ (posedge DRP_CLK)
290
begin
291
 
292
    if (!DRP_RST_N)
293
        begin
294
        addr    <=  8'd0;
295
        di      <= 16'd0;
296
        crscode <=  6'd0;
297
        end
298
    else
299
        begin
300
 
301
        case (index)
302
 
303
        //--------------------------------------------------    
304
        3'd0 :
305
            begin
306
            addr    <= ADDR_QPLL_FBDIV;
307
            di      <= (do_reg2 & MASK_QPLL_FBDIV) | (mode ? data_qpll_fbdiv : QPLL_FBDIV);
308
            crscode <= crscode;
309
            end
310
 
311
        //--------------------------------------------------    
312
        3'd1 :
313
            begin
314
            addr    <= ADDR_QPLL_CFG;
315
            if (PCIE_GT_DEVICE == "GTX")
316
                di <= (do_reg2 & MASK_QPLL_CFG) | data_qpll_cfg;
317
            else
318
                di <= (do_reg2 & 16'hFFFF) | data_qpll_cfg;
319
            crscode <= crscode;
320
            end
321
 
322
        //--------------------------------------------------    
323
        3'd2 :
324
            begin
325
            addr    <= ADDR_QPLL_LPF;
326
            if (PCIE_GT_DEVICE == "GTX")
327
                di <= (do_reg2 & MASK_QPLL_LPF) | data_qpll_lpf;
328
            else
329
                di <= (do_reg2 & 16'hFFFF) | data_qpll_lpf;
330
            crscode <= crscode;
331
            end
332
 
333
        //--------------------------------------------------
334
        3'd3 :
335
            begin
336
            addr <= ADDR_CRSCODE;
337
            di   <= do_reg2;
338
 
339
            //---------- Latch CRS Code --------------------
340
            if (ovrd_reg2)
341
                crscode <= do_reg2[6:1];
342
            else
343
                crscode <= crscode;
344
            end
345
 
346
        //--------------------------------------------------    
347
        3'd4 :
348
            begin
349
            addr    <= ADDR_QPLL_COARSE_FREQ_OVRD;
350
            di      <= (do_reg2 & MASK_QPLL_COARSE_FREQ_OVRD) | {(crscode - 6'd1), data_qpll_coarse_freq_ovrd[9:0]};
351
            crscode <= crscode;
352
            end
353
 
354
        //--------------------------------------------------    
355
        3'd5 :
356
            begin
357
            addr    <= ADDR_QPLL_COARSE_FREQ_OVRD_EN;
358
            di      <= (do_reg2 & MASK_QPLL_COARSE_FREQ_OVRD_EN) | data_qpll_coarse_freq_ovrd_en;
359
            crscode <= crscode;
360
            end
361
 
362
        //--------------------------------------------------    
363
        3'd6 :
364
            begin
365
            addr    <= ADDR_QPLL_LOCK_CFG;
366
            di      <= (do_reg2 & MASK_QPLL_LOCK_CFG) | data_qpll_lock_cfg;
367
            crscode <= crscode;
368
            end
369
 
370
        //--------------------------------------------------
371
        default :
372
            begin
373
            addr    <=  8'd0;
374
            di      <= 16'd0;
375
            crscode <=  6'd0;
376
            end
377
 
378
        endcase
379
 
380
        end
381
 
382
end
383
 
384
 
385
 
386
//---------- QPLL DRP FSM ------------------------------------------------------
387
always @ (posedge DRP_CLK)
388
begin
389
 
390
    if (!DRP_RST_N)
391
        begin
392
        fsm   <= FSM_IDLE;
393
        index <= 3'd0;
394
        mode  <= 1'd0;
395
        done  <= 1'd0;
396
        end
397
    else
398
        begin
399
 
400
        case (fsm)
401
 
402
        //---------- Idle State ----------------------------
403
        FSM_IDLE :
404
 
405
            begin
406
            if (start_reg2)
407
                begin
408
                fsm   <= FSM_LOAD;
409
                index <= 3'd0;
410
                mode  <= 1'd0;
411
                done  <= 1'd0;
412
                end
413
            else if ((gen3_reg2 != gen3_reg1) && (PCIE_PLL_SEL == "QPLL"))
414
                begin
415
                fsm   <= FSM_LOAD;
416
                index <= 3'd0;
417
                mode  <= 1'd1;
418
                done  <= 1'd0;
419
                end
420
            else
421
                begin
422
                fsm   <= FSM_IDLE;
423
                index <= 3'd0;
424
                mode  <= 1'd0;
425
                done  <= 1'd1;
426
                end
427
            end
428
 
429
        //---------- Load DRP Address  ---------------------
430
        FSM_LOAD :
431
 
432
            begin
433
            fsm   <= (load_cnt == LOAD_CNT_MAX) ? FSM_READ : FSM_LOAD;
434
            index <= index;
435
            mode  <= mode;
436
            done  <= 1'd0;
437
            end
438
 
439
        //---------- Read DRP ------------------------------
440
        FSM_READ :
441
 
442
            begin
443
            fsm   <= FSM_RRDY;
444
            index <= index;
445
            mode  <= mode;
446
            done  <= 1'd0;
447
            end
448
 
449
        //---------- Read DRP Ready ------------------------
450
        FSM_RRDY :
451
 
452
            begin
453
            fsm   <= (rdy_reg2 ? FSM_WRITE : FSM_RRDY);
454
            index <= index;
455
            mode  <= mode;
456
            done  <= 1'd0;
457
            end
458
 
459
        //---------- Write DRP -----------------------------
460
        FSM_WRITE :
461
 
462
            begin
463
            fsm   <= FSM_WRDY;
464
            index <= index;
465
            mode  <= mode;
466
            done  <= 1'd0;
467
            end
468
 
469
        //---------- Write DRP Ready -----------------------
470
        FSM_WRDY :
471
 
472
            begin
473
            fsm   <= (rdy_reg2 ? FSM_DONE : FSM_WRDY);
474
            index <= index;
475
            mode  <= mode;
476
            done  <= 1'd0;
477
            end
478
 
479
        //---------- DRP Done ------------------------------
480
        FSM_DONE :
481
 
482
            begin
483
            if ((index == INDEX_MAX) || (mode && (index == 3'd2)))
484
                begin
485
                fsm   <= mode ? FSM_QPLLRESET : FSM_IDLE;
486
                index <= 3'd0;
487
                mode  <= mode;
488
                done  <= 1'd0;
489
                end
490
            else
491
                begin
492
                fsm   <= FSM_LOAD;
493
                index <= index + 3'd1;
494
                mode  <= mode;
495
                done  <= 1'd0;
496
                end
497
            end
498
 
499
        //---------- QPLL Reset ----------------------------      
500
        FSM_QPLLRESET :
501
 
502
            begin
503
            fsm   <= !qplllock_reg2 ? FSM_QPLLLOCK : FSM_QPLLRESET;
504
            index <= 3'd0;
505
            mode  <= mode;
506
            done  <= 1'd0;
507
            end
508
 
509
        //---------- QPLL Reset ----------------------------      
510
        FSM_QPLLLOCK :
511
 
512
            begin
513
            fsm   <= qplllock_reg2 ? FSM_IDLE : FSM_QPLLLOCK;
514
            index <= 3'd0;
515
            mode  <= mode;
516
            done  <= 1'd0;
517
            end
518
 
519
        //---------- Default State -------------------------
520
        default :
521
 
522
            begin
523
            fsm   <= FSM_IDLE;
524
            index <= 3'd0;
525
            mode  <= 1'd0;
526
            done  <= 1'd0;
527
            end
528
 
529
        endcase
530
 
531
        end
532
 
533
end
534
 
535
 
536
 
537
//---------- QPLL DRP Output ---------------------------------------------------
538
assign DRP_ADDR      = addr;
539
assign DRP_EN        = (fsm == FSM_READ) || (fsm == FSM_WRITE);
540
assign DRP_DI        = di;
541
assign DRP_WE        = (fsm == FSM_WRITE); // || (fsm == FSM_WRDY);
542
assign DRP_DONE      = done;
543
assign DRP_QPLLRESET = (fsm == FSM_QPLLRESET);
544
assign DRP_CRSCODE   = crscode;
545
assign DRP_FSM       = fsm;
546
 
547
 
548
 
549
endmodule

powered by: WebSVN 2.1.0

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