AR# 14607

|

Virtex-II Pro RocketIO - ギガビット イーサネットおよびファイバー チャネルの CRC

説明

キーワード : CRC, Gigabit, Ethernet, Fiber, Fibre, Channel, ギガビット, イーサネット, ファイバ, チャネル

RocketIO 専用ハードウェアで CRC を使用する方法とタイミングを教えてください。

ソリューション

ギガビット イーサネット
デザインでは、/K28.5/D5.6/ ではなく、/K28.5/D16.2/ アイドル シーケンスが生成されるはずです。RocketIO の CRC によって、ギガビット イーサネット要件を満たすためにランニング ディスパリティを反転させる必要があると判断された場合、パケットに続く初めの /K28.5/D16.2/ アイドルを /K28.5/D5.6/ に変換し、必要な反転を実行します。

ファイバー チャネル
最初の負のランニング ディスパリティ (RD) に対しては、EOF フレーム区切りのみが生成されるはずです。これは、/K28.5/D21.4/ または /K28.5/D10.4/ で始まるフレーム区切りです。最初の正の RD に対しては、EOF フレーム区切りは生成しないでください。これは、/K28.5/D21.5/ または /K28.5/D10.5/ で始まるフレーム区切りです。

RocketIO の CRC によって、ファイバー チャネル要件を満たすためにランニング ディスパリティを反転させる必要があると判断された場合、EOF フレーム区切りの 2 番目のバイト (D21.4 または D10.4) が、ランニング ディスパリティを反転するのに必要な値 (D21.5 または D10.5) に変換されます。

このファイバー チャネル シンボル変換は、TX_CRC_USE が FALSE に設定されている場合は無効です。

RocketIO トランシーバ ブロックの CRC が使用されていない場合、EOP (End-OfーPacket) セット (ファイバー チャネル) またはアイドル (イーサネット) は、規格で要求されるディスパリティを保持するために自動的に変換されることはありません。詳細は、『RocketIO トランシーバ ユーザー ガイド』の第 2 章の CRC のセクションを参照してください。

この場合、ファイバー チャネルに要求されるディスパリティを保持するため、正しい EOP 文字を手動で送信する必要があります。これには、ファブリックでライニング ディスパリティを保持し、正しい EOP 文字を RocketIO トランシーバに送信する必要があります.

次に、イーサネットで 2 つの IDLE コード グループを切り替えるための VHDL コード例を示します。ファイバー チャネルで 2 つの EOP 文字を切り替える場合にも、同じロジックを使用できます。

-------------------------------------------------------------------------------
-- Tx Disparity Generation Support.
-------------------------------------------------------------------------------

MANUAL_DISPARITY: if (C_USE_MGT_CRC = false) generate

-- Since we are not allowing the MGT to insert the CRC value at the end of a
-- frame, the MGT will not be correcting for the disparity at the end of each
-- frame transmitted: we must track the disparity ourselves and insert either
-- /I1/ or /I2/ appropriately as the first Idle following a frame.
-- /I1/ and /I2/ are IDLE codes for PCS, with opposite disparities. The EOFs in FC should work in the same way.

-- The disparity function is defined in the IEEE Ethernet spec, clause 36.2.4.4.
-- This describes the function as operating on the 10-bit code groups. Since we
-- are using the MGT's, there is no access to these 10-bit code groups. Instead
-- the 8-bit code groups which cause a disparity change are here decoded. The CODE_GRP mentioned is a single byte of raw data.

-- purpose: Creates a Partial product to calculate the Running Disparity,
-- based on upper 3 bits.
-- type : combinatorial -- BIT(7) BIT(6) BIT(5)
DISP3 <= (not CODE_GRP(6) and not CODE_GRP(5)) or -- x 0 0
(CODE_GRP(7) and CODE_GRP(6) and CODE_GRP(5)); -- 1 1 1

-- purpose: Creates a Partial product to calculate the Running Disparity,
-- based on lower 5 bits.
-- type : combinatorial -- BIT(4) BIT(3) BIT(2) BIT(1) BIT(0)
DISP5 <= (not CODE_GRP(2) and not CODE_GRP(1) and not CODE_GRP(0)) or -- x x 0 0 0

(CODE_GRP(1) and CODE_GRP(0) and ( -- 1 1 x 1 1
(CODE_GRP(4) and CODE_GRP(3)) or -- 0 1 1 1 1
(CODE_GRP(2) and (CODE_GRP(4) xor CODE_GRP(3))))) or -- 1 0 1 1 1

(CODE_GRP(4) and CODE_GRP(3) and CODE_GRP(2) -- 1 1 1 0 1
and (CODE_GRP(1) xor CODE_GRP(0))) or -- 1 1 1 1 0

(not CODE_GRP(4) and not CODE_GRP(3) and ( -- 0 0 0 0 1
(not CODE_GRP(2) and (CODE_GRP(1) xor CODE_GRP(0))) or -- 0 0 0 1 0
(CODE_GRP(2) and not CODE_GRP(1) and not CODE_GRP(0)))); -- 0 0 1 0 0

-- purpose: Creates the Disparity value.
-- type : sequential
GEN_DISPARITY: process (TX_CLK)
begin
if TX_CLK'event and TX_CLK = '1' then
if RESET = '1' then
DISPARITY <= '1';
else
if (INSERT_IDLE and EVEN) = '1' then
DISPARITY <= '0';
elsif (DISP3 xor DISP5) = '1' or K28p5 = '1' then
DISPARITY <= not DISPARITY;
end if;
end if;
end if;
end process GEN_DISPARITY;

-------------
AR# 14607
日付 03/04/2013
ステータス アーカイブ
種類 一般
People Also Viewed