SURF  1.0
Pgp2bRxPhy.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : Pgp2bRxPhy.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2009-05-27
5 -- Last update: 2017-03-28
6 -------------------------------------------------------------------------------
7 -- Description:
8 -- Physical interface receive module for the Pretty Good Protocol version 2 core.
9 -------------------------------------------------------------------------------
10 -- This file is part of 'SLAC Firmware Standard Library'.
11 -- It is subject to the license terms in the LICENSE.txt file found in the
12 -- top-level directory of this distribution and at:
13 -- https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html.
14 -- No part of 'SLAC Firmware Standard Library', including this file,
15 -- may be copied, modified, propagated, or distributed except according to
16 -- the terms contained in the LICENSE.txt file.
17 -------------------------------------------------------------------------------
18 
19 library ieee;
20 use ieee.std_logic_1164.all;
21 use ieee.std_logic_arith.all;
22 use ieee.std_logic_unsigned.all;
23 use work.StdRtlPkg.all;
24 use work.Pgp2bPkg.all;
25 
26 --! @see entity
27  --! @ingroup protocols_pgp_pgp2b_core
28 entity Pgp2bRxPhy is
29  generic (
30  TPD_G : time := 1 ns;
31  RX_LANE_CNT_G : integer range 1 to 2 := 1 -- Number of receive lanes, 1-2
32  );
33  port (
34 
35  -- System clock, reset & control
36  pgpRxClkEn : in sl := '1'; -- Master clock Enable
37  pgpRxClk : in sl; -- Master clock
38  pgpRxClkRst : in sl; -- Synchronous reset input
39 
40  -- Link is ready
41  pgpRxLinkReady : out sl; -- Local side has link
42 
43  -- Error Flags, one pulse per event
44  pgpRxLinkDown : out sl := '0'; -- A link down event has occured
45  pgpRxLinkError : out sl := '0'; -- A link error has occured
46 
47  -- Opcode Receive Interface
48  pgpRxOpCodeEn : out sl; -- Opcode receive enable
49  pgpRxOpCode : out slv(7 downto 0); -- Opcode receive value
50 
51  -- Sideband data
52  pgpRemLinkReady : out sl := '0'; -- Far end side has link
53  pgpRemData : out slv(7 downto 0) := (others => '0'); -- Far end side User Data
54 
55  -- Cell Receive Interfac e
56  cellRxPause : out sl; -- Cell data pause
57  cellRxSOC : out sl; -- Cell data start of cell
58  cellRxSOF : out sl; -- Cell data start of frame
59  cellRxEOC : out sl; -- Cell data end of cell
60  cellRxEOF : out sl; -- Cell data end of frame
61  cellRxEOFE : out sl; -- Cell data end of frame error
62  cellRxData : out slv(RX_LANE_CNT_G*16-1 downto 0); -- Cell data data
63 
64  -- Physical Interface Signals
65  phyRxPolarity : out slv(RX_LANE_CNT_G-1 downto 0); -- PHY receive signal polarity
66  phyRxData : in slv(RX_LANE_CNT_G*16-1 downto 0); -- PHY receive data
67  phyRxDataK : in slv(RX_LANE_CNT_G*2-1 downto 0); -- PHY receive data is K character
68  phyRxDispErr : in slv(RX_LANE_CNT_G*2-1 downto 0); -- PHY receive data has disparity error
69  phyRxDecErr : in slv(RX_LANE_CNT_G*2-1 downto 0); -- PHY receive data not in table
70  phyRxReady : in sl; -- PHY receive interface is ready
71  phyRxInit : out sl -- PHY receive interface init;
72  );
73 
74 end Pgp2bRxPhy;
75 
76 
77 -- Define architecture
78 architecture Pgp2bRxPhy of Pgp2bRxPhy is
79 
80  -- Local Signals
81  signal dly0RxData : slv(RX_LANE_CNT_G*16-1 downto 0) := (others => '0');
82  signal dly0RxDataK : slv(RX_LANE_CNT_G*2-1 downto 0) := (others => '0');
83  signal dly0RxDispErr : slv(RX_LANE_CNT_G*2-1 downto 0) := (others => '0');
84  signal dly0RxDecErr : slv(RX_LANE_CNT_G*2-1 downto 0) := (others => '0');
85  signal dly1RxData : slv(RX_LANE_CNT_G*16-1 downto 0) := (others => '0');
86  signal dly1RxDataK : slv(RX_LANE_CNT_G*2-1 downto 0) := (others => '0');
87  signal dly1RxDispErr : slv(RX_LANE_CNT_G*2-1 downto 0) := (others => '0');
88  signal dly1RxDecErr : slv(RX_LANE_CNT_G*2-1 downto 0) := (others => '0');
89  signal rxDetectLts : sl := '0';
90  signal rxDetectLtsOk : sl := '0';
91  signal rxDetectLtsRaw : slv(1 downto 0);
92  signal rxDetectInvert : slv(RX_LANE_CNT_G-1 downto 0) := (others => '0');
93  signal rxDetectInvertRaw : slv(RX_LANE_CNT_G-1 downto 0);
94  signal rxDetectRemLink : sl := '0';
95  signal rxDetectRemData : slv(7 downto 0) := (others => '0');
96  signal rxDetectOpCodeEn : sl := '0';
97  signal rxDetectOpCodeEnRaw : slv(1 downto 0);
98  signal rxDetectSOC : sl := '0';
99  signal rxDetectSOCRaw : slv(1 downto 0);
100  signal rxDetectSOF : sl := '0';
101  signal rxDetectSOFRaw : slv(1 downto 0);
102  signal rxDetectEOC : sl := '0';
103  signal rxDetectEOCRaw : slv(1 downto 0);
104  signal rxDetectEOF : sl := '0';
105  signal rxDetectEOFRaw : slv(1 downto 0);
106  signal rxDetectEOFE : sl := '0';
107  signal rxDetectEOFERaw : slv(1 downto 0);
108  signal nxtRxLinkReady : sl;
109  signal stateCntRst : sl;
110  signal stateCnt : slv(19 downto 0) := (others => '0');
111  signal ltsCntRst : sl;
112  signal ltsCntEn : sl;
113  signal ltsCnt : slv(7 downto 0) := (others => '0');
114  signal intRxLinkReady : sl := '0';
115  signal intRxPolarity : slv(RX_LANE_CNT_G-1 downto 0) := (others => '0');
116  signal nxtRxPolarity : slv(RX_LANE_CNT_G-1 downto 0);
117  signal dlyRxLinkDown : sl := '0';
118  signal intRxLinkError : sl := '0';
119  signal dlyRxLinkError : sl := '0';
120  signal intRxInit : sl := '0';
121  signal nxtRxInit : sl;
122 
123  -- Physical Link State
124  constant ST_RESET_C : slv(2 downto 0) := "001";
125  constant ST_LOCK_C : slv(2 downto 0) := "010";
126  constant ST_WAIT_C : slv(2 downto 0) := "011";
127  constant ST_INVRT_C : slv(2 downto 0) := "100";
128  constant ST_READY_C : slv(2 downto 0) := "101";
129  signal curState : slv(2 downto 0) := ST_LOCK_C;
130  signal nxtState : slv(2 downto 0);
131 
132 begin
133 
134  -- Link status
136 
137  -- RX Interface Init
138  phyRxInit <= intRxInit;
139 
140  -- Opcode Receive Interface
142  pgpRxOpCode <= dly1RxData(15 downto 8);
143 
144  -- Cell Receive Interface
152 
153  -- Drive active polarity control signals
154  GEN_POL : for i in 0 to (RX_LANE_CNT_G-1) generate
155  phyRxPolarity(i) <= intRxPolarity(i);
156  end generate;
157 
158  -- State transition sync logic.
160  begin
161 
162  if pgpRxClkRst = '1' then
163  curState <= ST_LOCK_C after TPD_G;
164  stateCnt <= (others => '0') after TPD_G;
165  ltsCnt <= (others => '0') after TPD_G;
166  intRxLinkReady <= '0' after TPD_G;
167  intRxPolarity <= (others => '0') after TPD_G;
168  dlyRxLinkDown <= '0' after TPD_G;
169  pgpRxLinkDown <= '0' after TPD_G;
170  intRxLinkError <= '0' after TPD_G;
171  dlyRxLinkError <= '0' after TPD_G;
172  pgpRxLinkError <= '0' after TPD_G;
173  intRxInit <= '0' after TPD_G;
174  pgpRemLinkReady <= '0' after TPD_G;
175  pgpRemData <= (others => '0') after TPD_G;
176  elsif rising_edge(pgpRxClk) then
177 
178  if pgpRxClkEn = '1' then
179  -- Sideband data
180  if intRxLinkReady = '1' then
183  else
184  pgpRemLinkReady <= '0' after TPD_G;
185  pgpRemData <= (others => '0') after TPD_G;
186  end if;
187 
188  -- Link down edge detection
189  dlyRxLinkDown <= (not intRxLinkReady) after TPD_G;
190  pgpRxLinkDown <= (not intRxLinkReady) and (not dlyRxLinkDown) after TPD_G;
191 
192  -- Link error generation
193  if (dly1RxDispErr /= 0 or dly1RxDecErr /= 0) and intRxLinkReady = '1' then
194  intRxLinkError <= '1' after TPD_G;
195  else
196  intRxLinkError <= '0' after TPD_G;
197  end if;
198 
199  -- Link error edge detection
202 
203  -- Status signals
206  intRxInit <= nxtRxInit after TPD_G;
207 
208  -- State transition
209  curState <= nxtState after TPD_G;
210 
211  -- In state counter
212  if stateCntRst = '1' then
213  stateCnt <= (others => '0') after TPD_G;
214  else
215  stateCnt <= stateCnt + 1 after TPD_G;
216  end if;
217 
218  -- LTS Counter
219  if ltsCntRst = '1' then
220  ltsCnt <= (others => '0') after TPD_G;
221  elsif (ltsCntEn = '1') and (ltsCnt /= 255) then
222  ltsCnt <= ltsCnt + 1 after TPD_G;
223  end if;
224 
225  end if;
226  end if;
227  end process;
228 
229 
230 -- Link control state machine
233  begin
234  case curState is
235 
236  -- Hold in rx reset for 8 clocks
237  when ST_RESET_C =>
238  nxtRxLinkReady <= '0';
239  nxtRxPolarity <= (others => '0');
240  ltsCntRst <= '1';
241  ltsCntEn <= '0';
242  nxtRxInit <= '1';
243 
244  -- Hold reset for 255 clocks
245  if stateCnt(7 downto 0) = 255 then
246  stateCntRst <= '1';
247  nxtState <= ST_LOCK_C;
248  else
249  stateCntRst <= '0';
250  nxtState <= curState;
251  end if;
252 
253  -- Wait for lock state
254  when ST_LOCK_C =>
255  nxtRxLinkReady <= '0';
256  nxtRxPolarity <= (others => '0');
257  ltsCntRst <= '1';
258  ltsCntEn <= '0';
259  nxtRxInit <= '0';
260 
261  -- Wait for lock
262  if phyRxReady = '1' then
263  nxtState <= ST_WAIT_C;
264  stateCntRst <= '1';
265 
266  -- Terminal count without lock
267  elsif stateCnt = x"FFFFF" then
268  nxtState <= ST_RESET_C;
269  stateCntRst <= '1';
270  else
271  nxtState <= curState;
272  stateCntRst <= '0';
273  end if;
274 
275  -- Wait for training pattern
276  when ST_WAIT_C =>
277  nxtRxLinkReady <= '0';
278  nxtRxInit <= '0';
279 
280  -- Lock is lost
281  if phyRxReady = '0' then
282  stateCntRst <= '1';
283  ltsCntEn <= '0';
284  ltsCntRst <= '0';
286  nxtState <= ST_RESET_C;
287 
288  -- Decode or disparity error, clear lts count
289  elsif phyRxReady = '0' or dly1RxDispErr /= 0 or dly1RxDecErr /= 0 then
290  stateCntRst <= '0';
291  ltsCntEn <= '0';
292  ltsCntRst <= '1';
294  nxtState <= curState;
295 
296  -- Training pattern seen
297  elsif rxDetectLts = '1' then
298  stateCntRst <= '1';
299 
300  -- No Inversion
301  if rxDetectInvert = 0 then
303  nxtState <= curState;
304 
305  -- ID & Lane Count Ok
306  if rxDetectLtsOk = '1' then
307  ltsCntEn <= '1';
308  ltsCntRst <= '0';
309  else
310  ltsCntEn <= '0';
311  ltsCntRst <= '1';
312  end if;
313 
314  -- Inverted
315  else
316  ltsCntEn <= '0';
317  ltsCntRst <= '1';
319  nxtState <= ST_INVRT_C;
320  end if;
321 
322  -- Run after we have seen 256 non-inverted training sequences
323  -- without any disparity or decode errors.
324  elsif ltsCnt = 255 then
325  stateCntRst <= '1';
326  ltsCntEn <= '0';
327  ltsCntRst <= '1';
329  nxtState <= ST_READY_C;
330 
331  -- Terminal count without seeing a valid LTS
332  elsif stateCnt = x"FFFFF" then
333  stateCntRst <= '1';
334  ltsCntEn <= '0';
335  ltsCntRst <= '1';
337  nxtState <= ST_RESET_C;
338 
339  -- Count cycles without LTS
340  else
341  stateCntRst <= '0';
342  ltsCntEn <= '0';
343  ltsCntRst <= '0';
345  nxtState <= curState;
346  end if;
347 
348  -- Wait a few clocks after inverting receive interface
349  when ST_INVRT_C =>
350  nxtRxLinkReady <= '0';
352  ltsCntRst <= '1';
353  ltsCntEn <= '0';
354  nxtRxInit <= '0';
355 
356  -- Wait 128 clocks
357  if stateCnt(6 downto 0) = 127 then
358  nxtState <= ST_WAIT_C;
359  stateCntRst <= '1';
360  else
361  nxtState <= curState;
362  stateCntRst <= '0';
363  end if;
364 
365  -- Ready
366  when ST_READY_C =>
367  nxtRxLinkReady <= '1';
369  ltsCntRst <= '1';
370  ltsCntEn <= '0';
371  nxtRxInit <= '0';
372 
373  -- Lock is lost
374  if phyRxReady = '0' then
375  nxtState <= ST_RESET_C;
376  stateCntRst <= '1';
377 
378  -- Training sequence seen
379  elsif rxDetectLts = '1' then
380 
381  -- Link is inverted or bad lts, reset and relink
382  if rxDetectInvert /= 0 or rxDetectLtsOk = '0' then
383  nxtState <= ST_RESET_C;
384  stateCntRst <= '1';
385 
386  -- Good LTS
387  else
388  nxtState <= curState;
389  stateCntRst <= '1';
390  end if;
391 
392  -- Link is down after long period without seeing a LTS
393  -- Min spacing of LTS is 2 Cells = 2 * 256 = 512
394  -- Timeout set at 4096 = 8 cells
395  elsif stateCnt(11 downto 0) = x"FFF" then
396  nxtState <= ST_RESET_C;
397  stateCntRst <= '1';
398 
399  -- Count cycles without LTS
400  else
401  nxtState <= curState;
402  stateCntRst <= '0';
403  end if;
404 
405  -- Default
406  when others =>
407  nxtRxLinkReady <= '0';
408  nxtRxPolarity <= (others => '0');
409  stateCntRst <= '0';
410  ltsCntRst <= '0';
411  ltsCntEn <= '0';
412  nxtRxInit <= '0';
413  nxtState <= ST_LOCK_C;
414  end case;
415  end process;
416 
417 
418 -- Receive data pipeline
420  begin
421  if pgpRxClkRst = '1' then
422  dly0RxData <= (others => '0') after TPD_G;
423  dly0RxDataK <= (others => '0') after TPD_G;
424  dly0RxDispErr <= (others => '0') after TPD_G;
425  dly0RxDecErr <= (others => '0') after TPD_G;
426  dly1RxData <= (others => '0') after TPD_G;
427  dly1RxDataK <= (others => '0') after TPD_G;
428  dly1RxDispErr <= (others => '0') after TPD_G;
429  dly1RxDecErr <= (others => '0') after TPD_G;
430 
431  elsif rising_edge(pgpRxClk) then
432  if pgpRxClkEn = '1' then
433  dly0RxData <= phyRxData after TPD_G;
434  dly0RxDataK <= phyRxDataK after TPD_G;
436  dly0RxDecErr <= phyRxDecErr after TPD_G;
437  dly1RxData <= dly0RxData after TPD_G;
438  dly1RxDataK <= dly0RxDataK after TPD_G;
441  end if;
442  end if;
443  end process;
444 
445 
446 -- Link init ordered set detect
448  begin
449  if pgpRxClkRst = '1' then
450  rxDetectLts <= '0' after TPD_G;
451  rxDetectLtsOk <= '0' after TPD_G;
452  rxDetectInvert <= (others => '0') after TPD_G;
453  rxDetectRemLink <= '0' after TPD_G;
454  rxDetectRemData <= (others => '0') after TPD_G;
455  rxDetectOpCodeEn <= '0' after TPD_G;
456  rxDetectSOC <= '0' after TPD_G;
457  rxDetectSOF <= '0' after TPD_G;
458  rxDetectEOC <= '0' after TPD_G;
459  rxDetectEOF <= '0' after TPD_G;
460  rxDetectEOFE <= '0' after TPD_G;
461  elsif rising_edge(pgpRxClk) then
462  if pgpRxClkEn = '1' then
463  -- LTS is detected when phy is ready
464  if phyRxReady = '1' then
465 
466  -- Detect link init ordered sets
467  if rxDetectLtsRaw(0) = '1' and
468  (rxDetectLtsRaw(1) = '1' or RX_LANE_CNT_G < 2) then
470  rxDetectLts <= '1' after TPD_G;
471 
472  -- Lane count and ID must match
473  if dly0RxData(13 downto 12) = conv_std_logic_vector(RX_LANE_CNT_G-1, 2) and
474  dly0RxData(11 downto 8) = PGP2B_ID_C then
475  rxDetectLtsOk <= '1' after TPD_G;
476  rxDetectRemLink <= dly0RxData(15) after TPD_G;
477  rxDetectRemData <= dly0RxData(7 downto 0) after TPD_G;
478  else
479  rxDetectLtsOk <= '0' after TPD_G;
480  end if;
481  else
482  rxDetectLts <= '0' after TPD_G;
483  rxDetectLtsOk <= '0' after TPD_G;
484  end if;
485  else
486  rxDetectLts <= '0' after TPD_G;
487  rxDetectLtsOk <= '0' after TPD_G;
488  rxDetectInvert <= (others => '0') after TPD_G;
489  rxDetectRemLink <= '0' after TPD_G;
490  rxDetectRemData <= (others => '0') after TPD_G;
491  end if;
492 
493  -- The remaining opcodes are only detected when the link is up
494  if intRxLinkReady = '1' then
495 
496  -- Detect opCode ordered set
497  if rxDetectOpCodeEnRaw(0) = '1' and
498  (rxDetectOpCodeEnRaw(1) = '1' or RX_LANE_CNT_G < 2) then
499  rxDetectOpCodeEn <= '1' after TPD_G;
500  else
501  rxDetectOpCodeEn <= '0' after TPD_G;
502  end if;
503 
504  -- Detect SOC ordered set
505  if rxDetectSOCRaw(0) = '1' and (rxDetectSOCRaw(1) = '1' or RX_LANE_CNT_G < 2) then
506  rxDetectSOC <= '1' after TPD_G;
507  rxDetectSOF <= '0' after TPD_G;
508 
509  -- Detect SOF ordered set
510  elsif rxDetectSOFRaw(0) = '1' and (rxDetectSOFRaw(1) = '1' or RX_LANE_CNT_G < 2) then
511  rxDetectSOC <= '1' after TPD_G;
512  rxDetectSOF <= '1' after TPD_G;
513  else
514  rxDetectSOC <= '0' after TPD_G;
515  rxDetectSOF <= '0' after TPD_G;
516  end if;
517 
518  -- Detect EOC ordered set
519  if rxDetectEOCRaw(0) = '1' and (rxDetectEOCRaw(1) = '1' or RX_LANE_CNT_G < 2) then
520  rxDetectEOC <= '1' after TPD_G;
521  rxDetectEOF <= '0' after TPD_G;
522  rxDetectEOFE <= '0' after TPD_G;
523 
524  -- Detect EOF ordered set
525  elsif rxDetectEOFRaw(0) = '1' and (rxDetectEOFRaw(1) = '1' or RX_LANE_CNT_G < 2) then
526  rxDetectEOC <= '1' after TPD_G;
527  rxDetectEOF <= '1' after TPD_G;
528  rxDetectEOFE <= '0' after TPD_G;
529 
530  -- Detect EOFE ordered set
531  elsif rxDetectEOFERaw(0) = '1' and (rxDetectEOFERaw(1) = '1' or RX_LANE_CNT_G < 2) then
532  rxDetectEOC <= '1' after TPD_G;
533  rxDetectEOF <= '1' after TPD_G;
534  rxDetectEOFE <= '1' after TPD_G;
535  else
536  rxDetectEOC <= '0' after TPD_G;
537  rxDetectEOF <= '0' after TPD_G;
538  rxDetectEOFE <= '0' after TPD_G;
539  end if;
540  else
541  rxDetectOpCodeEn <= '0' after TPD_G;
542  rxDetectSOC <= '0' after TPD_G;
543  rxDetectSOF <= '0' after TPD_G;
544  rxDetectEOC <= '0' after TPD_G;
545  rxDetectEOF <= '0' after TPD_G;
546  rxDetectEOFE <= '0' after TPD_G;
547  end if;
548  end if;
549  end if;
550  end process;
551 
552 -- Generate Loop
553  GEN_LANES : for i in 0 to (RX_LANE_CNT_G-1) generate
554 
555  -- Ordered Set Detection
557  begin
558 
559  -- Skip errored decodes
560  if dly0RxDispErr(i*2) = '0' and dly0RxDispErr(i*2+1) = '0' and
561  dly0RxDecErr(i*2) = '0' and dly0RxDecErr(i*2+1) = '0' and
562  dly1RxDispErr(i*2) = '0' and dly1RxDispErr(i*2+1) = '0' and
563  dly1RxDecErr(i*2) = '0' and dly1RxDecErr(i*2+1) = '0' then
564 
565  -- Link init ordered set
566  if (dly1RxDataK(i*2) = '1' and dly1RxDataK(i*2+1) = '0' and
567  dly0RxDataK(i*2) = '0' and dly0RxDataK(i*2+1) = '0' and
568  dly1RxData(i*16+7 downto i*16) = K_LTS_C and
569  (dly1RxData(i*16+15 downto i*16+8) = D_102_C or dly1RxData(i*16+15 downto i*16+8) = D_215_C)) then
570  rxDetectLtsRaw(i) <= '1';
571 
572  -- Detect Link Inversion
573  if dly1RxData(i*16+15 downto i*16+8) = D_102_C then
574  rxDetectInvertRaw(i) <= '0';
575  else
576  rxDetectInvertRaw(i) <= '1';
577  end if;
578  else
579  rxDetectLtsRaw(i) <= '0';
580  rxDetectInvertRaw(i) <= '0';
581  end if;
582 
583  -- OpCode Enable
584  if (dly0RxDataK(i*2) = '1' and dly0RxDataK(i*2+1) = '0' and dly0RxData(i*16+7 downto i*16) = K_OTS_C) then
585  rxDetectOpCodeEnRaw(i) <= '1';
586  else
587  rxDetectOpCodeEnRaw(i) <= '0';
588  end if;
589 
590  -- SOC Detect
591  if (dly0RxDataK(i*2) = '1' and dly0RxDataK(i*2+1) = '0' and dly0RxData(i*16+7 downto i*16) = K_SOC_C) then
592  rxDetectSOCRaw(i) <= '1';
593  else
594  rxDetectSOCRaw(i) <= '0';
595  end if;
596 
597  -- SOF Detect
598  if (dly0RxDataK(i*2) = '1' and dly0RxDataK(i*2+1) = '0' and dly0RxData(i*16+7 downto i*16) = K_SOF_C) then
599  rxDetectSOFRaw(i) <= '1';
600  else
601  rxDetectSOFRaw(i) <= '0';
602  end if;
603 
604  -- EOC Detect
605  if (dly0RxDataK(i*2) = '1' and dly0RxDataK(i*2+1) = '0' and dly0RxData(i*16+7 downto i*16) = K_EOC_C) then
606  rxDetectEOCRaw(i) <= '1';
607  else
608  rxDetectEOCRaw(i) <= '0';
609  end if;
610 
611  -- EOF Detect
612  if (dly0RxDataK(i*2) = '1' and dly0RxDataK(i*2+1) = '0' and dly0RxData(i*16+7 downto i*16) = K_EOF_C) then
613  rxDetectEOFRaw(i) <= '1';
614  else
615  rxDetectEOFRaw(i) <= '0';
616  end if;
617 
618  -- EOFE Detect
619  if (dly0RxDataK(i*2) = '1' and dly0RxDataK(i*2+1) = '0' and dly0RxData(i*16+7 downto i*16) = K_EOFE_C) then
620  rxDetectEOFERaw(i) <= '1';
621  else
622  rxDetectEOFERaw(i) <= '0';
623  end if;
624  else
625  rxDetectLtsRaw(i) <= '0';
626  rxDetectInvertRaw(i) <= '0';
627  rxDetectOpCodeEnRaw(i) <= '0';
628  rxDetectSOCRaw(i) <= '0';
629  rxDetectSOFRaw(i) <= '0';
630  rxDetectEOCRaw(i) <= '0';
631  rxDetectEOFRaw(i) <= '0';
632  rxDetectEOFERaw(i) <= '0';
633  end if;
634  end process;
635  end generate;
636 
637  -- Generate Loop for unused lanes
638  GEN_SPARE : for i in RX_LANE_CNT_G to 1 generate
639  rxDetectLtsRaw(i) <= '0';
640  rxDetectOpCodeEnRaw(i) <= '0';
641  rxDetectSOCRaw(i) <= '0';
642  rxDetectSOFRaw(i) <= '0';
643  rxDetectEOCRaw(i) <= '0';
644  rxDetectEOFRaw(i) <= '0';
645  rxDetectEOFERaw(i) <= '0';
646  end generate;
647 
648 end Pgp2bRxPhy;
649 
slv( 1 downto 0) rxDetectOpCodeEnRaw
Definition: Pgp2bRxPhy.vhd:97
out pgpRxLinkErrorsl := '0'
Definition: Pgp2bRxPhy.vhd:45
slv( 2 downto 0) := "011" ST_WAIT_C
Definition: Pgp2bRxPhy.vhd:126
slv( 2 downto 0) := "001" ST_RESET_C
Definition: Pgp2bRxPhy.vhd:124
slv( RX_LANE_CNT_G* 2- 1 downto 0) :=( others => '0') dly0RxDataK
Definition: Pgp2bRxPhy.vhd:82
slv( RX_LANE_CNT_G- 1 downto 0) :=( others => '0') intRxPolarity
Definition: Pgp2bRxPhy.vhd:115
sl := '0' rxDetectLtsOk
Definition: Pgp2bRxPhy.vhd:90
out pgpRemLinkReadysl := '0'
Definition: Pgp2bRxPhy.vhd:52
TPD_Gtime := 1 ns
Definition: Pgp2bRxPhy.vhd:30
std_logic sl
Definition: StdRtlPkg.vhd:28
out pgpRxOpCodeEnsl
Definition: Pgp2bRxPhy.vhd:48
slv( RX_LANE_CNT_G* 16- 1 downto 0) :=( others => '0') dly1RxData
Definition: Pgp2bRxPhy.vhd:85
slv( 1 downto 0) rxDetectEOFRaw
Definition: Pgp2bRxPhy.vhd:105
slv( 7 downto 0) := "11111011" K_SOC_C
Definition: Pgp2bPkg.vhd:42
out cellRxSOFsl
Definition: Pgp2bRxPhy.vhd:58
out pgpRxLinkDownsl := '0'
Definition: Pgp2bRxPhy.vhd:44
in phyRxReadysl
Definition: Pgp2bRxPhy.vhd:70
slv( 7 downto 0) := "11111101" K_EOF_C
Definition: Pgp2bPkg.vhd:44
slv( 1 downto 0) rxDetectSOFRaw
Definition: Pgp2bRxPhy.vhd:101
slv( RX_LANE_CNT_G* 2- 1 downto 0) :=( others => '0') dly0RxDecErr
Definition: Pgp2bRxPhy.vhd:84
slv( RX_LANE_CNT_G* 2- 1 downto 0) :=( others => '0') dly0RxDispErr
Definition: Pgp2bRxPhy.vhd:83
slv( 7 downto 0) := "01011100" K_EOC_C
Definition: Pgp2bPkg.vhd:46
slv( 7 downto 0) :=( others => '0') ltsCnt
Definition: Pgp2bRxPhy.vhd:113
out pgpRxLinkReadysl
Definition: Pgp2bRxPhy.vhd:41
slv( 2 downto 0) := "010" ST_LOCK_C
Definition: Pgp2bRxPhy.vhd:125
RX_LANE_CNT_Ginteger range 1 to 2:= 1
Definition: Pgp2bRxPhy.vhd:32
slv( RX_LANE_CNT_G* 2- 1 downto 0) :=( others => '0') dly1RxDecErr
Definition: Pgp2bRxPhy.vhd:88
slv( RX_LANE_CNT_G* 16- 1 downto 0) :=( others => '0') dly0RxData
Definition: Pgp2bRxPhy.vhd:81
out cellRxPausesl
Definition: Pgp2bRxPhy.vhd:56
out cellRxEOFsl
Definition: Pgp2bRxPhy.vhd:60
slv( RX_LANE_CNT_G* 2- 1 downto 0) :=( others => '0') dly1RxDataK
Definition: Pgp2bRxPhy.vhd:86
slv( 7 downto 0) := "00111100" K_LTS_C
Definition: Pgp2bPkg.vhd:36
slv( 1 downto 0) rxDetectSOCRaw
Definition: Pgp2bRxPhy.vhd:99
slv( 7 downto 0) := "01111100" K_OTS_C
Definition: Pgp2bPkg.vhd:40
out phyRxInitsl
Definition: Pgp2bRxPhy.vhd:72
slv( 1 downto 0) rxDetectEOCRaw
Definition: Pgp2bRxPhy.vhd:103
out cellRxSOCsl
Definition: Pgp2bRxPhy.vhd:57
slv( 7 downto 0) := "11110111" K_SOF_C
Definition: Pgp2bPkg.vhd:43
in phyRxDecErrslv( RX_LANE_CNT_G* 2- 1 downto 0)
Definition: Pgp2bRxPhy.vhd:69
in pgpRxClkEnsl := '1'
Definition: Pgp2bRxPhy.vhd:36
slv( 7 downto 0) := "11111110" K_EOFE_C
Definition: Pgp2bPkg.vhd:45
out phyRxPolarityslv( RX_LANE_CNT_G- 1 downto 0)
Definition: Pgp2bRxPhy.vhd:65
sl := '0' rxDetectOpCodeEn
Definition: Pgp2bRxPhy.vhd:96
slv( RX_LANE_CNT_G- 1 downto 0) :=( others => '0') rxDetectInvert
Definition: Pgp2bRxPhy.vhd:92
slv( 2 downto 0) := "101" ST_READY_C
Definition: Pgp2bRxPhy.vhd:128
out cellRxEOCsl
Definition: Pgp2bRxPhy.vhd:59
slv( 2 downto 0) nxtState
Definition: Pgp2bRxPhy.vhd:130
slv( 2 downto 0) := ST_LOCK_C curState
Definition: Pgp2bRxPhy.vhd:129
slv( RX_LANE_CNT_G* 2- 1 downto 0) :=( others => '0') dly1RxDispErr
Definition: Pgp2bRxPhy.vhd:87
slv( 7 downto 0) := "10110101" D_215_C
Definition: Pgp2bPkg.vhd:38
_library_ ieeeieee
Definition: Pgp2bRxCell.vhd:19
slv( 7 downto 0) := "01001010" D_102_C
Definition: Pgp2bPkg.vhd:37
slv( 1 downto 0) rxDetectEOFERaw
Definition: Pgp2bRxPhy.vhd:107
in pgpRxClkRstsl
Definition: Pgp2bRxPhy.vhd:38
slv( RX_LANE_CNT_G- 1 downto 0) rxDetectInvertRaw
Definition: Pgp2bRxPhy.vhd:93
slv( RX_LANE_CNT_G- 1 downto 0) nxtRxPolarity
Definition: Pgp2bRxPhy.vhd:116
out pgpRxOpCodeslv( 7 downto 0)
Definition: Pgp2bRxPhy.vhd:49
slv( 2 downto 0) := "100" ST_INVRT_C
Definition: Pgp2bRxPhy.vhd:127
in phyRxDataslv( RX_LANE_CNT_G* 16- 1 downto 0)
Definition: Pgp2bRxPhy.vhd:66
sl := '0' rxDetectRemLink
Definition: Pgp2bRxPhy.vhd:94
in phyRxDataKslv( RX_LANE_CNT_G* 2- 1 downto 0)
Definition: Pgp2bRxPhy.vhd:67
slv( 1 downto 0) rxDetectLtsRaw
Definition: Pgp2bRxPhy.vhd:91
sl := '0' intRxLinkError
Definition: Pgp2bRxPhy.vhd:118
in phyRxDispErrslv( RX_LANE_CNT_G* 2- 1 downto 0)
Definition: Pgp2bRxPhy.vhd:68
slv( 19 downto 0) :=( others => '0') stateCnt
Definition: Pgp2bRxPhy.vhd:110
sl := '0' dlyRxLinkError
Definition: Pgp2bRxPhy.vhd:119
out cellRxEOFEsl
Definition: Pgp2bRxPhy.vhd:61
sl := '0' intRxLinkReady
Definition: Pgp2bRxPhy.vhd:114
out cellRxDataslv( RX_LANE_CNT_G* 16- 1 downto 0)
Definition: Pgp2bRxPhy.vhd:62
slv( 3 downto 0) := "0101" PGP2B_ID_C
Definition: Pgp2bPkg.vhd:49
slv( 7 downto 0) :=( others => '0') rxDetectRemData
Definition: Pgp2bRxPhy.vhd:95
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
out pgpRemDataslv( 7 downto 0) :=( others => '0')
Definition: Pgp2bRxPhy.vhd:53
in pgpRxClksl
Definition: Pgp2bRxPhy.vhd:37