2017-01-19 20 views
3

私は、VHDLでイーサネット10GE MACデザインを生成しました。今私はCRCを実装しようとしています。私はVHDLで64ビット並列CRC-32ジェネレータを持っています。並列RC-32計算イーサネット10GE MAC

仕様:
- データバスが64ビットで
- コントロール・バスは、(データバイトを検証する)、8ビットの

問題です:私の流入、さんは言ってみましょう
パケット長は14バイトです(パディングなしと仮定)。

CRCは1クロックサイクルで最初の8バイトで計算されますが、残りの6バイトでCRCを計算しようとすると、0が追加されるため結果が正しくありません。

64ビットパラレルCRCジェネレータを使用して任意の長さのバイト長のCRCを生成する方法はありますか?
Iが異なるパラレルCRCジェネレータ(8ビットパラレルCRC、16ビットのパラレルCRC発生器など)を使用した:私が試したもの

。しかし、これは多くのFPGAリソースを消費します。私はちょうど64ビット並列CRCジェネレータを使用してリソースを節約したいと思います。

+0

Googleグループのcomp.lang.vhdl [Ethernet CRC-32](https://groups.google.com/forum/#!topic/comp.lang.vhdl/WHsU0PxD28E)を参照してください。 – user1155120

+0

明確にするために、パケット全体を受信し、格納してからCRCを計算していますか?または、受信したすべての64ビットブロックからCRCを徐々に計算しようとしていますか? – gsm

+0

@gsmパケット全体を格納していません。私は毎クロックごとに入ってくるパケットのCRC32を計算しようとしています。 – Tushar

答えて

0

私は確かに話すことができませんが、最後ではなくパケットの開始でゼロを埋め込むことができれば、正しい答えを得なければなりません。それは

が有効CRCがすべてゼロに登録します一定の64ビット・データ・ワードでこの答えここに Best way to generate CRC8/16 when input is odd number of BITS (not byte)? C or Python

+0

これはCRC8/16で動作するかもしれませんが、確かにCRC32では動作しません。私はすべて1でロジックを初期化しており、標準的なイーサネットCRC32多項式を使用しています。0x04C11DB7 – Tushar

+0

トリックはcrcを正しい値で初期化しています。私が参照した答えの終わりは、彼が使用したトリックを示しています。おそらく、それぞれ8つの異なるcrc初期化を計算しなければならないでしょう(packetLen MOD 8)。あなたはちょうどあなたが望む答えを得るためにcrcポンプをプライミングしています。 –

1

スタートを見る多項式及び初期化子に依存しません。次に、は、0バイトのメッセージを付加するのではなく、最初に処理される64ビットワードの末尾にそれらのゼロを置くことで、メッセージの先頭にを付加します。 (CRC定義を提供していないので、CRCが反映されているかどうかによって異なります)CRCが反映されている場合は、最下位ビット位置に0バイトを入れてください。最上位ビット位置で)。次に32ビット定数を排他的論理和演算します。

この例では、最初に64ビット定数を並列CRCジェネレータに送り、最初のワードに0バイトと6バイトのメッセージを、次に2番目のワードに8バイトのメッセージを送ります。次に、32ビット定数との排他的論理和をとります。

標準PKZIP CRCの場合、64ビット定数は0x00000000ffffffff、32ビット定数は0x2e448638、先頭ゼロバイトは64ビットワードの最下部に入ります。

CRCジェネレータの実装を制御している場合は、64ビット定数を供給する必要がないように、ジェネレータをリセットするときに有効CRCレジスタをすべてゼロに初期化することができます。

+0

>>この例では、最初に64ビット定数を並列CRCジェネレータに送り、最初のワードに2バイトのゼロバイトと6バイトのメッセージを、次に2バイト目に8バイトのメッセージバイトを送ります。次に、32ビット定数との排他的論理和をとります。 <<つまり、データを後方に送る必要がありますか?同様に、最初は残りの6バイト、次に8バイトですか?別のことは、標準のイーサネットCRC32(多項式0x04C11DB7)の32ビットと64ビットの定数値をどのようにして得るかです。 – Tushar

+0

いいえ、データを逆方向に送信しません。メッセージの最初のバイトは、先行ゼロバイトの後に来ます。 PKZIP CRCはイーサネットCRCです。 –