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_gtp_pipe_rate.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_gtp_pipe_rate.v
52
// Version    : 1.9
53
//------------------------------------------------------------------------------
54
//  Filename     :  gtp_pipe_rate.v
55
//  Description  :  PIPE Rate Module for 7 Series Transceiver
56
//  Version      :  19.0
57
//------------------------------------------------------------------------------
58
 
59
 
60
 
61
`timescale 1ns / 1ps
62
 
63
 
64
 
65
//---------- PIPE Rate Module --------------------------------------------------
66
module cl_a7pcie_x4_gtp_pipe_rate #
67
(
68
 
69
    parameter PCIE_SIM_SPEEDUP = "FALSE",                   // PCIe sim mode 
70
    parameter TXDATA_WAIT_MAX  = 4'd15                      // TXDATA wait max
71
 
72
)
73
 
74
(
75
 
76
    //---------- Input -------------------------------------
77
    input               RATE_CLK,
78
    input               RATE_RST_N,
79
    input       [ 1:0]  RATE_RATE_IN,
80
    input               RATE_DRP_DONE,
81
    input               RATE_RXPMARESETDONE,
82
    input               RATE_TXRATEDONE,
83
    input               RATE_RXRATEDONE,
84
    input               RATE_TXSYNC_DONE,
85
    input               RATE_PHYSTATUS,
86
 
87
    //---------- Output ------------------------------------
88
    output              RATE_PCLK_SEL,
89
    output              RATE_DRP_START,
90
    output              RATE_DRP_X16,
91
    output      [ 2:0]  RATE_RATE_OUT,
92
    output              RATE_TXSYNC_START,
93
    output              RATE_DONE,
94
    output              RATE_IDLE,
95
    output      [ 4:0]  RATE_FSM
96
 
97
);
98
 
99
    //---------- Input FF or Buffer ------------------------
100
    reg         [ 1:0]  rate_in_reg1;
101
    reg                 drp_done_reg1;
102
    reg                 rxpmaresetdone_reg1;
103
    reg                 txratedone_reg1;
104
    reg                 rxratedone_reg1;
105
    reg                 phystatus_reg1;
106
    reg                 txsync_done_reg1;
107
 
108
    reg         [ 1:0]  rate_in_reg2;
109
    reg                 drp_done_reg2;
110
    reg                 rxpmaresetdone_reg2;
111
    reg                 txratedone_reg2;
112
    reg                 rxratedone_reg2;
113
    reg                 phystatus_reg2;
114
    reg                 txsync_done_reg2;
115
 
116
    //---------- Internal Signals --------------------------
117
    wire        [ 2:0]  rate;
118
    reg         [ 3:0]  txdata_wait_cnt = 4'd0;
119
    reg                 txratedone      = 1'd0;
120
    reg                 rxratedone      = 1'd0;
121
    reg                 phystatus       = 1'd0;
122
    reg                 ratedone        = 1'd0;
123
 
124
    //---------- Output FF or Buffer -----------------------
125
    reg                 pclk_sel =  1'd0;
126
    reg         [ 2:0]  rate_out =  3'd0;
127
    reg         [ 3:0]  fsm      =  0;
128
 
129
    //---------- FSM ---------------------------------------                                         
130
    localparam          FSM_IDLE           = 0;
131
    localparam          FSM_TXDATA_WAIT    = 1;
132
    localparam          FSM_PCLK_SEL       = 2;
133
    localparam          FSM_DRP_X16_START  = 3;
134
    localparam          FSM_DRP_X16_DONE   = 4;
135
    localparam          FSM_RATE_SEL       = 5;
136
    localparam          FSM_RXPMARESETDONE = 6;
137
    localparam          FSM_DRP_X20_START  = 7;
138
    localparam          FSM_DRP_X20_DONE   = 8;
139
    localparam          FSM_RATE_DONE      = 9;
140
    localparam          FSM_TXSYNC_START   = 10;
141
    localparam          FSM_TXSYNC_DONE    = 11;
142
    localparam          FSM_DONE           = 12; // Must sync value to pipe_user.v
143
 
144
//---------- Input FF ----------------------------------------------------------
145
always @ (posedge RATE_CLK)
146
begin
147
 
148
    if (!RATE_RST_N)
149
        begin
150
        //---------- 1st Stage FF -------------------------- 
151
        rate_in_reg1        <= 2'd0;
152
        drp_done_reg1       <= 1'd0;
153
        rxpmaresetdone_reg1 <= 1'd0;
154
        txratedone_reg1     <= 1'd0;
155
        rxratedone_reg1     <= 1'd0;
156
        phystatus_reg1      <= 1'd0;
157
        txsync_done_reg1    <= 1'd0;
158
        //---------- 2nd Stage FF --------------------------
159
        rate_in_reg2        <= 2'd0;
160
        drp_done_reg2       <= 1'd0;
161
        rxpmaresetdone_reg2 <= 1'd0;
162
        txratedone_reg2     <= 1'd0;
163
        rxratedone_reg2     <= 1'd0;
164
        phystatus_reg2      <= 1'd0;
165
        txsync_done_reg2    <= 1'd0;
166
        end
167
    else
168
        begin
169
        //---------- 1st Stage FF --------------------------
170
        rate_in_reg1        <= RATE_RATE_IN;
171
        drp_done_reg1       <= RATE_DRP_DONE;
172
        rxpmaresetdone_reg1 <= RATE_RXPMARESETDONE;
173
        txratedone_reg1     <= RATE_TXRATEDONE;
174
        rxratedone_reg1     <= RATE_RXRATEDONE;
175
        phystatus_reg1      <= RATE_PHYSTATUS;
176
        txsync_done_reg1    <= RATE_TXSYNC_DONE;
177
        //---------- 2nd Stage FF --------------------------
178
        rate_in_reg2        <= rate_in_reg1;
179
        drp_done_reg2       <= drp_done_reg1;
180
        rxpmaresetdone_reg2 <= rxpmaresetdone_reg1;
181
        txratedone_reg2     <= txratedone_reg1;
182
        rxratedone_reg2     <= rxratedone_reg1;
183
        phystatus_reg2      <= phystatus_reg1;
184
        txsync_done_reg2    <= txsync_done_reg1;
185
        end
186
 
187
end
188
 
189
 
190
 
191
//---------- Select Rate -------------------------------------------------------
192
//  Gen1 :  div 2 using [TX/RX]OUT_DIV = 2
193
//  Gen2 :  div 1 using [TX/RX]RATE = 3'd1
194
//------------------------------------------------------------------------------
195
assign rate = (rate_in_reg2 == 2'd1) ? 3'd1 : 3'd0;
196
 
197
 
198
 
199
//---------- TXDATA Wait Counter -----------------------------------------------
200
always @ (posedge RATE_CLK)
201
begin
202
 
203
    if (!RATE_RST_N)
204
        txdata_wait_cnt <= 4'd0;
205
    else
206
 
207
        //---------- Increment Wait Counter ----------------
208
        if ((fsm == FSM_TXDATA_WAIT) && (txdata_wait_cnt < TXDATA_WAIT_MAX))
209
            txdata_wait_cnt <= txdata_wait_cnt + 4'd1;
210
 
211
        //---------- Hold Wait Counter ---------------------
212
        else if ((fsm == FSM_TXDATA_WAIT) && (txdata_wait_cnt == TXDATA_WAIT_MAX))
213
            txdata_wait_cnt <= txdata_wait_cnt;
214
 
215
        //---------- Reset Wait Counter --------------------
216
        else
217
            txdata_wait_cnt <= 4'd0;
218
 
219
end
220
 
221
 
222
 
223
//---------- Latch TXRATEDONE, RXRATEDONE, and PHYSTATUS -----------------------
224
always @ (posedge RATE_CLK)
225
begin
226
 
227
    if (!RATE_RST_N)
228
        begin
229
        txratedone <= 1'd0;
230
        rxratedone <= 1'd0;
231
        phystatus  <= 1'd0;
232
        ratedone   <= 1'd0;
233
        end
234
    else
235
        begin
236
 
237
        if ((fsm == FSM_RATE_DONE) || (fsm == FSM_RXPMARESETDONE) || (fsm == FSM_DRP_X20_START) || (fsm == FSM_DRP_X20_DONE))
238
 
239
            begin
240
 
241
            //---------- Latch TXRATEDONE ------------------
242
            if (txratedone_reg2)
243
                txratedone <= 1'd1;
244
            else
245
                txratedone <= txratedone;
246
 
247
            //---------- Latch RXRATEDONE ------------------
248
            if (rxratedone_reg2)
249
                rxratedone <= 1'd1;
250
            else
251
                rxratedone <= rxratedone;
252
 
253
            //---------- Latch PHYSTATUS -------------------
254
            if (phystatus_reg2)
255
                phystatus <= 1'd1;
256
            else
257
                phystatus <= phystatus;
258
 
259
            //---------- Latch Rate Done -------------------
260
            if (rxratedone && txratedone && phystatus)
261
                ratedone <= 1'd1;
262
            else
263
                ratedone <= ratedone;
264
 
265
            end
266
 
267
        else
268
 
269
            begin
270
            txratedone <= 1'd0;
271
            rxratedone <= 1'd0;
272
            phystatus  <= 1'd0;
273
            ratedone   <= 1'd0;
274
            end
275
 
276
        end
277
 
278
end
279
 
280
 
281
 
282
//---------- PIPE Rate FSM -----------------------------------------------------
283
always @ (posedge RATE_CLK)
284
begin
285
 
286
    if (!RATE_RST_N)
287
        begin
288
        fsm      <= FSM_IDLE;
289
        pclk_sel <= 1'd0;
290
        rate_out <= 3'd0;
291
        end
292
    else
293
        begin
294
 
295
        case (fsm)
296
 
297
        //---------- Idle State ----------------------------
298
        FSM_IDLE :
299
 
300
            begin
301
            //---------- Detect Rate Change ----------------
302
            if (rate_in_reg2 != rate_in_reg1)
303
                begin
304
                fsm      <= FSM_TXDATA_WAIT;
305
                pclk_sel <= pclk_sel;
306
                rate_out <= rate_out;
307
                end
308
            else
309
                begin
310
                fsm      <= FSM_IDLE;
311
                pclk_sel <= pclk_sel;
312
                rate_out <= rate_out;
313
                end
314
            end
315
 
316
        //---------- Wait for TXDATA to TX[P/N] Latency ----    
317
        FSM_TXDATA_WAIT :
318
 
319
            begin
320
            fsm      <= (txdata_wait_cnt == TXDATA_WAIT_MAX) ? FSM_PCLK_SEL : FSM_TXDATA_WAIT;
321
            pclk_sel <= pclk_sel;
322
            rate_out <= rate_out;
323
            end
324
 
325
        //---------- Select PCLK Frequency -----------------
326
        //  Gen1 : PCLK = 125 MHz
327
        //  Gen2 : PCLK = 250 MHz
328
        //--------------------------------------------------
329
        FSM_PCLK_SEL :
330
 
331
            begin
332
            fsm      <= (PCIE_SIM_SPEEDUP == "TRUE") ? FSM_RATE_SEL : FSM_DRP_X16_START;
333
            pclk_sel <= (rate_in_reg2 == 2'd1);
334
            rate_out <= rate_out;
335
            end
336
 
337
        //---------- Start DRP x16 -------------------------
338
        FSM_DRP_X16_START :
339
 
340
            begin
341
            fsm      <= (!drp_done_reg2) ? FSM_DRP_X16_DONE : FSM_DRP_X16_START;
342
            pclk_sel <= pclk_sel;
343
            rate_out <= rate_out;
344
            end
345
 
346
        //---------- Wait for DRP x16 Done -----------------    
347
        FSM_DRP_X16_DONE :
348
 
349
            begin
350
            fsm      <= drp_done_reg2 ? FSM_RATE_SEL : FSM_DRP_X16_DONE;
351
            pclk_sel <= pclk_sel;
352
            rate_out <= rate_out;
353
            end
354
 
355
        //---------- Select Rate ---------------------------
356
        FSM_RATE_SEL :
357
 
358
            begin
359
            fsm      <= (PCIE_SIM_SPEEDUP == "TRUE") ? FSM_RATE_DONE : FSM_RXPMARESETDONE;
360
            pclk_sel <= pclk_sel;
361
            rate_out <= rate;                               // Update [TX/RX]RATE
362
            end
363
 
364
        //---------- Wait for RXPMARESETDONE De-assertion --
365
        FSM_RXPMARESETDONE :
366
 
367
            begin
368
            fsm      <= (!rxpmaresetdone_reg2) ? FSM_DRP_X20_START : FSM_RXPMARESETDONE;
369
            pclk_sel <= pclk_sel;
370
            rate_out <= rate_out;
371
            end
372
 
373
        //---------- Start DRP x20 -------------------------
374
        FSM_DRP_X20_START :
375
 
376
            begin
377
            fsm      <= (!drp_done_reg2) ? FSM_DRP_X20_DONE : FSM_DRP_X20_START;
378
            pclk_sel <= pclk_sel;
379
            rate_out <= rate_out;
380
            end
381
 
382
        //---------- Wait for DRP x20 Done -----------------    
383
        FSM_DRP_X20_DONE :
384
 
385
            begin
386
            fsm      <= drp_done_reg2 ? FSM_RATE_DONE : FSM_DRP_X20_DONE;
387
            pclk_sel <= pclk_sel;
388
            rate_out <= rate_out;
389
            end
390
 
391
        //---------- Wait for Rate Change Done ------------- 
392
        FSM_RATE_DONE :
393
 
394
            begin
395
            if (ratedone)
396
                fsm <= FSM_TXSYNC_START;
397
            else
398
                fsm <= FSM_RATE_DONE;
399
 
400
            pclk_sel <= pclk_sel;
401
            rate_out <= rate_out;
402
            end
403
 
404
        //---------- Start TX Sync -------------------------
405
        FSM_TXSYNC_START:
406
 
407
            begin
408
            fsm      <= (!txsync_done_reg2 ? FSM_TXSYNC_DONE : FSM_TXSYNC_START);
409
            pclk_sel <= pclk_sel;
410
            rate_out <= rate_out;
411
            end
412
 
413
        //---------- Wait for TX Sync Done -----------------
414
        FSM_TXSYNC_DONE:
415
 
416
            begin
417
            fsm      <= (txsync_done_reg2 ? FSM_DONE : FSM_TXSYNC_DONE);
418
            pclk_sel <= pclk_sel;
419
            rate_out <= rate_out;
420
            end
421
 
422
        //---------- Rate Change Done ----------------------
423
        FSM_DONE :
424
 
425
            begin
426
            fsm      <= FSM_IDLE;
427
            pclk_sel <= pclk_sel;
428
            rate_out <= rate_out;
429
            end
430
 
431
        //---------- Default State -------------------------
432
        default :
433
 
434
            begin
435
            fsm      <= FSM_IDLE;
436
            pclk_sel <= 1'd0;
437
            rate_out <= 3'd0;
438
            end
439
 
440
        endcase
441
 
442
        end
443
 
444
end
445
 
446
 
447
 
448
//---------- PIPE Rate Output --------------------------------------------------
449
assign RATE_PCLK_SEL     = pclk_sel;
450
assign RATE_DRP_START    = (fsm == FSM_DRP_X16_START) || (fsm == FSM_DRP_X20_START);
451
assign RATE_DRP_X16      = (fsm == FSM_DRP_X16_START) || (fsm == FSM_DRP_X16_DONE);
452
assign RATE_RATE_OUT     = rate_out;
453
assign RATE_TXSYNC_START = (fsm == FSM_TXSYNC_START);
454
assign RATE_DONE         = (fsm == FSM_DONE);
455
assign RATE_IDLE         = (fsm == FSM_IDLE);
456
assign RATE_FSM          = {1'd0, fsm};
457
 
458
 
459
 
460
endmodule

powered by: WebSVN 2.1.0

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