2

Spartan 3Eスターターキットを使用していて、100MBitリンクを介してイーサネットフレームを受信しようとしています。

知らない人のために、ボードはPHYチップを備えており、25MHzの受信クロックを公開しています。受信したフレームをバッファリングし、シリアルリンクを介して再送信することで、受信が正常に機能することを(ほぼ)確認しました。

さらに、outputlogic.comのCRC32ジェネレーターを使用しています。受信したニブルをバイトに集約し、CRCに転送します。フレームの最後で、生成されたCRCをラッチし、イーサネットフレームで見つけたCRCと一緒にLCDに表示します。

ただし、(ご想像のとおり)2つの数値は一致しません。

527edb0d  -- FCS extracted from the frame
43a4d833  -- calculated using the CRC32 generator

最初のものは、wiresharkによってキャプチャされたフレームとFPGAからシリアルポートを介してキャプチャおよび取得されたフレームの両方で、pythonscrc32関数を介してパッケージを実行することによっても確認できます。

多かれ少なかれ些細なことだと思います。ここに受信プロセスを貼り付けました。必要のないものはすべて取り除いた。シリアル経由で出力をキャプチャする場合、CRCジェネレーターと同時にラッチしてまったく同じバイトを取得するfifo(ザイリンクス製のユニット)を追加しました。

誰かがそれの何が悪いのか考えていますか?

4

2 に答える 2

6

私はしばらく前にイーサネットMACの作業を開始しましたが、それを完成させることはできませんでしたが、ここで使用できるCRCジェネレーターが機能しています。

CRC.vhd

これは、IEEE802.3CRCに関するザイリンクスアプリノートに基づいています。これはここにあります。

CRCはイーサネット受信コンポーネントでインスタンス化されます。ETH_RECEIVE_SMプロセスを見ると、FCSがチェッカーにどのようにロードされているかがわかります。

うまくいけば、私のコードと比較することで間違いを見つけることができます。

編集:

fpga4funからサンプルのイーサネットフレームを取得し、CRCチェッカーに渡しました。下のシミュレーションのスクリーンショットを参照してください(右クリックしてURLをコピーし、新しいブラウザタブで表示してフル解像度を確認してください)。

ここに画像の説明を入力してください

最後に残りのC704DD7Bを確認できます。独自のCRCチェッカーで同じことを試して、何が得られるかを確認してください。

于 2012-09-20T11:04:39.287 に答える
3

使用したジェネレーターは、データの前処理および後処理を行っていない可能性があります。そのジェネレーターがゼロの文字列を受け取り、ゼロcrcを生成する場合、それが問題です。ゼロの文字列はゼロを生成するべきではありません。(何が生成されるかは、ゼロの数によって異なります。)

イーサネットcrcの処理は、crcを反転し、次にcrcアルゴリズムを適用してから、crcを再度反転することです。

于 2012-09-20T01:41:55.740 に答える