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_7_x1/] [source/] [gtx_rx_valid_filter_v6.v] - Blame information for rev 13

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 13 barabba
 
2
//-----------------------------------------------------------------------------
3
//
4
// (c) Copyright 2009-2011 Xilinx, Inc. All rights reserved.
5
//
6
// This file contains confidential and proprietary information
7
// of Xilinx, Inc. and is protected under U.S. and
8
// international copyright and other intellectual property
9
// laws.
10
//
11
// DISCLAIMER
12
// This disclaimer is not a license and does not grant any
13
// rights to the materials distributed herewith. Except as
14
// otherwise provided in a valid license issued to you by
15
// Xilinx, and to the maximum extent permitted by applicable
16
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
17
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
18
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
19
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
20
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
21
// (2) Xilinx shall not be liable (whether in contract or tort,
22
// including negligence, or under any other theory of
23
// liability) for any loss or damage of any kind or nature
24
// related to, arising under or in connection with these
25
// materials, including for any direct, or any indirect,
26
// special, incidental, or consequential loss or damage
27
// (including loss of data, profits, goodwill, or any type of
28
// loss or damage suffered as a result of any action brought
29
// by a third party) even if such damage or loss was
30
// reasonably foreseeable or Xilinx had been advised of the
31
// possibility of the same.
32
//
33
// CRITICAL APPLICATIONS
34
// Xilinx products are not designed or intended to be fail-
35
// safe, or for use in any application requiring fail-safe
36
// performance, such as life-support or safety devices or
37
// systems, Class III medical devices, nuclear facilities,
38
// applications related to the deployment of airbags, or any
39
// other applications that could lead to death, personal
40
// injury, or severe property or environmental damage
41
// (individually and collectively, "Critical
42
// Applications"). Customer assumes the sole risk and
43
// liability of any use of Xilinx products in Critical
44
// Applications, subject only to applicable laws and
45
// regulations governing limitations on product liability.
46
//
47
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
48
// PART OF THIS FILE AT ALL TIMES.
49
//
50
//-----------------------------------------------------------------------------
51
// Project    : Virtex-6 Integrated Block for PCI Express
52
// File       : gtx_rx_valid_filter_v6.v
53
// Version    : 1.7
54
 
55
`timescale 1ns / 1ns
56
 
57
module GTX_RX_VALID_FILTER_V6 #(
58
 
59
  parameter           CLK_COR_MIN_LAT    = 28
60
 
61
)
62
(
63
  output  [1:0]       USER_RXCHARISK,
64
  output  [15:0]      USER_RXDATA,
65
  output              USER_RXVALID,
66
  output              USER_RXELECIDLE,
67
  output  [ 2:0]      USER_RX_STATUS,
68
  output              USER_RX_PHY_STATUS,
69
 
70
  input  [1:0]        GT_RXCHARISK,
71
  input  [15:0]       GT_RXDATA,
72
  input               GT_RXVALID,
73
  input               GT_RXELECIDLE,
74
  input  [ 2:0]       GT_RX_STATUS,
75
  input               GT_RX_PHY_STATUS,
76
 
77
  input               PLM_IN_L0,
78
  input               PLM_IN_RS,
79
 
80
  input               USER_CLK,
81
  input               RESET
82
 
83
);
84
 
85
  parameter TCQ = 1;
86
 
87
  parameter EIOS_DET_IDL      = 5'b00001;
88
  parameter EIOS_DET_NO_STR0  = 5'b00010;
89
  parameter EIOS_DET_STR0     = 5'b00100;
90
  parameter EIOS_DET_STR1     = 5'b01000;
91
  parameter EIOS_DET_DONE     = 5'b10000;
92
 
93
  parameter EIOS_COM          = 8'hBC;
94
  parameter EIOS_IDL          = 8'h7C;
95
  parameter FTSOS_COM         = 8'hBC;
96
  parameter FTSOS_FTS         = 8'h3C;
97
 
98
  reg    [4:0]        reg_state_eios_det;
99
  wire   [4:0]        state_eios_det;
100
 
101
  reg                 reg_eios_detected;
102
  wire                eios_detected;
103
 
104
  reg                 reg_symbol_after_eios;
105
  wire                symbol_after_eios;
106
 
107
  parameter USER_RXVLD_IDL     = 4'b0001;
108
  parameter USER_RXVLD_EI      = 4'b0010;
109
  parameter USER_RXVLD_EI_DB0  = 4'b0100;
110
  parameter USER_RXVLD_EI_DB1  = 4'b1000;
111
 
112
  reg    [3:0]        reg_state_rxvld_ei;
113
  wire   [3:0]        state_rxvld_ei;
114
 
115
  reg    [4:0]        reg_rxvld_count;
116
  wire   [4:0]        rxvld_count;
117
 
118
  reg    [3:0]        reg_rxvld_fallback;
119
  wire   [3:0]        rxvld_fallback;
120
 
121
  reg    [1:0]        gt_rxcharisk_q;
122
  reg    [15:0]       gt_rxdata_q;
123
  reg                 gt_rxvalid_q;
124
  reg                 gt_rxelecidle_q;
125
  reg                 gt_rxelecidle_qq;
126
 
127
  reg    [ 2:0]       gt_rx_status_q;
128
  reg                 gt_rx_phy_status_q;
129
  reg                 gt_rx_is_skp0_q;
130
  reg                 gt_rx_is_skp1_q;
131
 
132
  // EIOS detector
133
 
134
  always @(posedge USER_CLK) begin
135
 
136
    if (RESET) begin
137
 
138
      reg_eios_detected <= #TCQ 1'b0;
139
      reg_state_eios_det <= #TCQ EIOS_DET_IDL;
140
      reg_symbol_after_eios <= #TCQ 1'b0;
141
      gt_rxcharisk_q <= #TCQ 2'b00;
142
      gt_rxdata_q <= #TCQ 16'h0;
143
      gt_rxvalid_q <= #TCQ 1'b0;
144
      gt_rxelecidle_q <= #TCQ 1'b0;
145
      gt_rxelecidle_qq <= #TCQ 1'b0;
146
      gt_rx_status_q <= #TCQ 3'b000;
147
      gt_rx_phy_status_q <= #TCQ 1'b0;
148
      gt_rx_is_skp0_q <= #TCQ 1'b0;
149
      gt_rx_is_skp1_q <= #TCQ 1'b0;
150
 
151
    end else begin
152
 
153
      reg_eios_detected <= #TCQ 1'b0;
154
      reg_symbol_after_eios <= #TCQ 1'b0;
155
      gt_rxcharisk_q <= #TCQ GT_RXCHARISK;
156
      gt_rxdata_q <= #TCQ GT_RXDATA;
157
      gt_rxvalid_q <= #TCQ GT_RXVALID;
158
      gt_rxelecidle_q <= #TCQ GT_RXELECIDLE;
159
      gt_rxelecidle_qq <= #TCQ gt_rxelecidle_q;
160
      gt_rx_status_q <= #TCQ GT_RX_STATUS;
161
      gt_rx_phy_status_q <= #TCQ GT_RX_PHY_STATUS;
162
 
163
      if (GT_RXCHARISK[0] && GT_RXDATA[7:0] == FTSOS_FTS)
164
        gt_rx_is_skp0_q <= #TCQ 1'b1;
165
      else
166
        gt_rx_is_skp0_q <= #TCQ 1'b0;
167
 
168
      if (GT_RXCHARISK[1] && GT_RXDATA[15:8] == FTSOS_FTS)
169
        gt_rx_is_skp1_q <= #TCQ 1'b1;
170
      else
171
        gt_rx_is_skp1_q <= #TCQ 1'b0;
172
 
173
      case ( state_eios_det )
174
 
175
        EIOS_DET_IDL : begin
176
 
177
          if ((gt_rxcharisk_q[0]) && (gt_rxdata_q[7:0] == EIOS_COM) &&
178
              (gt_rxcharisk_q[1]) && (gt_rxdata_q[15:8] == EIOS_IDL)) begin
179
 
180
            reg_state_eios_det <= #TCQ EIOS_DET_NO_STR0;
181
            reg_eios_detected <= #TCQ 1'b1;
182
 
183
          end else if ((gt_rxcharisk_q[1]) && (gt_rxdata_q[15:8] == EIOS_COM))
184
            reg_state_eios_det <= #TCQ EIOS_DET_STR0;
185
          else
186
            reg_state_eios_det <= #TCQ EIOS_DET_IDL;
187
 
188
        end
189
 
190
        EIOS_DET_NO_STR0 : begin
191
 
192
          if ((gt_rxcharisk_q[0] && (gt_rxdata_q[7:0] == EIOS_IDL)) &&
193
              (gt_rxcharisk_q[1] && (gt_rxdata_q[15:8] == EIOS_IDL)))
194
            reg_state_eios_det <= #TCQ EIOS_DET_DONE;
195
          else
196
            reg_state_eios_det <= #TCQ EIOS_DET_IDL;
197
 
198
        end
199
 
200
        EIOS_DET_STR0 : begin
201
 
202
          if ((gt_rxcharisk_q[0] && (gt_rxdata_q[7:0] == EIOS_IDL)) &&
203
              (gt_rxcharisk_q[1] && (gt_rxdata_q[15:8] == EIOS_IDL))) begin
204
 
205
            reg_state_eios_det <= #TCQ EIOS_DET_STR1;
206
            reg_eios_detected <= #TCQ 1'b1;
207
            reg_symbol_after_eios <= #TCQ 1'b1;
208
 
209
          end else
210
            reg_state_eios_det <= #TCQ EIOS_DET_IDL;
211
 
212
        end
213
 
214
        EIOS_DET_STR1 : begin
215
 
216
          if ((gt_rxcharisk_q[0]) && (gt_rxdata_q[7:0] == EIOS_IDL))
217
            reg_state_eios_det <= #TCQ EIOS_DET_DONE;
218
          else
219
            reg_state_eios_det <= #TCQ EIOS_DET_IDL;
220
 
221
        end
222
 
223
        EIOS_DET_DONE : begin
224
 
225
          reg_state_eios_det <= #TCQ EIOS_DET_IDL;
226
 
227
        end
228
 
229
      endcase
230
 
231
    end
232
 
233
  end
234
  assign state_eios_det = reg_state_eios_det;
235
  assign eios_detected = reg_eios_detected;
236
  assign symbol_after_eios = reg_symbol_after_eios;
237
 
238
  // user_rxvalid generation
239
 
240
  always @(posedge USER_CLK) begin
241
 
242
    if (RESET) begin
243
 
244
      reg_state_rxvld_ei <= #TCQ USER_RXVLD_IDL;
245
 
246
    end else begin
247
 
248
      case ( state_rxvld_ei )
249
 
250
        USER_RXVLD_IDL : begin
251
 
252
          if (eios_detected)
253
            reg_state_rxvld_ei <= #TCQ USER_RXVLD_EI;
254
          else
255
            reg_state_rxvld_ei <= #TCQ USER_RXVLD_IDL;
256
 
257
        end
258
 
259
        USER_RXVLD_EI : begin
260
 
261
          if (!gt_rxvalid_q)
262
            reg_state_rxvld_ei <= #TCQ USER_RXVLD_EI_DB0;
263
          else if (rxvld_fallback == 4'b1111)
264
            reg_state_rxvld_ei <= #TCQ USER_RXVLD_IDL;
265
          else
266
            reg_state_rxvld_ei <= #TCQ USER_RXVLD_EI;
267
 
268
        end
269
 
270
        USER_RXVLD_EI_DB0 : begin
271
 
272
          if (gt_rxvalid_q)
273
            reg_state_rxvld_ei <= #TCQ USER_RXVLD_EI_DB1;
274
          else if (!PLM_IN_L0)
275
            reg_state_rxvld_ei <= #TCQ USER_RXVLD_IDL;
276
          else
277
            reg_state_rxvld_ei <= #TCQ USER_RXVLD_EI_DB0;
278
 
279
        end
280
 
281
        USER_RXVLD_EI_DB1 : begin
282
 
283
          if (rxvld_count > CLK_COR_MIN_LAT)
284
            reg_state_rxvld_ei <= #TCQ USER_RXVLD_IDL;
285
          else
286
            reg_state_rxvld_ei <= #TCQ USER_RXVLD_EI_DB1;
287
 
288
        end
289
 
290
      endcase
291
 
292
    end
293
 
294
  end
295
  assign state_rxvld_ei = reg_state_rxvld_ei;
296
 
297
  // RxValid counter
298
 
299
  always @(posedge USER_CLK) begin
300
 
301
    if (RESET) begin
302
 
303
      reg_rxvld_count <= #TCQ 5'b00000;
304
 
305
    end else begin
306
 
307
      if ((gt_rxvalid_q) &&  (state_rxvld_ei == USER_RXVLD_EI_DB1))
308
        reg_rxvld_count <= #TCQ reg_rxvld_count + 1'b1;
309
      else
310
        reg_rxvld_count <= #TCQ 5'b00000;
311
 
312
    end
313
 
314
  end
315
  assign rxvld_count = reg_rxvld_count;
316
 
317
  // RxValid fallback
318
 
319
  always @(posedge USER_CLK) begin
320
 
321
    if (RESET) begin
322
 
323
      reg_rxvld_fallback <= #TCQ 4'b0000;
324
 
325
    end else begin
326
 
327
      if (state_rxvld_ei == USER_RXVLD_EI)
328
        reg_rxvld_fallback <= #TCQ reg_rxvld_fallback + 1'b1;
329
      else
330
        reg_rxvld_fallback <= #TCQ 4'b0000;
331
 
332
    end
333
 
334
  end
335
  assign rxvld_fallback = reg_rxvld_fallback;
336
 
337
  // Delay pipe_rx_elec_idle
338
 
339
  SRL16E #(.INIT(0)) rx_elec_idle_delay (.Q(USER_RXELECIDLE),
340
                                         .D(gt_rxelecidle_q),
341
                                         .CLK(USER_CLK),
342
                                         .CE(1'b1), .A3(1'b1),.A2(1'b1),.A1(1'b1),.A0(1'b1));
343
 
344
 
345
reg       awake_in_progress_q = 1'b0;
346
reg       awake_see_com_q = 1'b0;
347
reg [3:0] awake_com_count_q = 4'b0000;
348
 
349
wire    awake_see_com_0 = GT_RXVALID & (gt_rxcharisk_q[0] && (gt_rxdata_q[7:0] == EIOS_COM));
350
wire    awake_see_com_1 = GT_RXVALID & (gt_rxcharisk_q[1] && (gt_rxdata_q[15:8] == EIOS_COM));
351
wire    awake_see_com = (awake_see_com_0 || awake_see_com_1) && ~awake_see_com_q;
352
 
353
// Count 8 COMs, (not back-to-back), when waking up from electrical idle
354
//  but not for L0s (which is L0).
355
 
356
wire    awake_done = awake_in_progress_q && (awake_com_count_q[3:0] >= 4'hb);
357
wire    awake_start = (~gt_rxelecidle_q && gt_rxelecidle_qq) || PLM_IN_RS;
358
 
359
wire    awake_in_progress = awake_start || (~awake_done && awake_in_progress_q);
360
wire [3:0] awake_com_count_inced = awake_com_count_q[3:0] + 4'b0001;
361
wire [3:0] awake_com_count = (~awake_in_progress_q) ? 4'b0000 :
362
                        (awake_start) ? 4'b0000 :
363
                        (awake_see_com_q) ? awake_com_count_inced[3:0] :
364
                                                awake_com_count_q[3:0];
365
 
366
wire    rst_l = ~RESET;
367
always @(posedge USER_CLK) begin
368
  awake_see_com_q <= #TCQ (rst_l) ? awake_see_com : 1'b0;
369
  awake_in_progress_q <= #TCQ (rst_l) ? awake_in_progress : 1'b0;
370
  awake_com_count_q[3:0] <= #TCQ (rst_l) ? awake_com_count[3:0] : 4'h0;
371
end
372
 
373
 
374
  assign USER_RXVALID = ((state_rxvld_ei == USER_RXVLD_IDL) && ~awake_in_progress_q) ? gt_rxvalid_q : 1'b0;
375
  assign USER_RXCHARISK[0] = USER_RXVALID ? gt_rxcharisk_q[0] : 1'b0;
376
  assign USER_RXCHARISK[1] = (USER_RXVALID && !symbol_after_eios) ? gt_rxcharisk_q[1] : 1'b0;
377
  assign USER_RXDATA[7:0] = (gt_rx_is_skp0_q) ? FTSOS_COM : gt_rxdata_q[7:0];
378
  assign USER_RXDATA[15:8] = (gt_rx_is_skp1_q) ? FTSOS_COM : gt_rxdata_q[15:8];
379
  assign USER_RX_STATUS = (state_rxvld_ei == USER_RXVLD_IDL) ? gt_rx_status_q : 3'b000;
380
  assign USER_RX_PHY_STATUS = gt_rx_phy_status_q;
381
 
382
endmodule

powered by: WebSVN 2.1.0

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