m FPGA ベースの CRC 巡回冗長検査システム Verilog 実装 (テストベンチを含む)

目次

1. アルゴリズムシミュレーション効果

2. アルゴリズムには理論的知識の概要が含まれます

3. Verilogコアプログラム

4. 完全なアルゴリズム コード ファイル


1. アルゴリズムシミュレーション効果

このシステムは、次の 2 つのプラットフォームで開発されました。

Vivado2019.2

Quartusii18.0+ModelSim-Altera 6.6d スターターエディション

Vivado2019.2 のシミュレーション結果は次のとおりです。

Quartusii18.0+ModelSim-Altera 6.6d Starter Editionのテスト結果は以下の通りです。

 MATLAB の結果を比較します。

2. アルゴリズムには理論的知識の概要が含まれます

       CRC (巡回冗長検査) は、通信およびストレージ システムで広く使用されているデータ検証テクノロジです。データを多項式除算して冗長チェックコードを生成し、データに付加して受信機に送信します データ受信後、受信機は再度多項式除算を実行します 計算されたチェックコードが受信したチェックコードと同じ場合受信したチェックコードが同じであれば、データに誤りがないことを示します。

       CRC チェックの基本原理は、データを多項式除算して冗長チェック コードを生成することです。具体的には、N ビット データに対して CRC チェックを実行して M ビット チェック コードを生成すると仮定します。M は通常 N より小さく、通常 16 ビットまたは 32 ビットかかります。生成多項式は一般に G(x) で表され、M+1 ビットの 2 進数であり、最上位ビットと最下位ビットは両方とも 1 です。生成多項式の選択は、CRC チェックのパフォーマンスにとって重要です。


具体的には、CRC チェック プロセスは次のとおりです。N
        ビット データ D(x) を左に M ビットだけシフトします。つまり、最上位ビットを M 個の 0 で埋め、N+M ビット数 D'(バツ)。D'(x) を G(x) で割ると、商 Q(x) と剰余 R(x) が得られます。ここで、Q(x)はNビットの2進数、R(x)はMビットの2進数、すなわちチェックコードである。元のデータ D(x) の末尾に R(x) を追加して、N+M 桁の数値 T(x) を取得します。つまり、T(x) = D(x) * 2^M + R(x) )。T(x)を受信者に送信します。受信側は、受信データ T'(x) に対して送信側と同じ多項式除算演算を実行して、剰余 R'(x) を取得します。R'(x) が 0 に等しい場合、データにエラーがないことを示し、それ以外の場合、データにエラーが発生しました。以上が CRC チェックの基本原理です。以下では、FPGA で CRC チェックを実装する方法を紹介します。

FPGA が CRC チェックを実現するための一般的な手順は次のとおりです。
      適切な生成多項式 G(x) を選択します。生成多項式の選択は、CRC チェックのパフォーマンスにとって重要です。一般に、生成多項式の桁数が多いほど、CRC チェックのパフォーマンスは向上しますが、同時に計算が複雑になり、ハードウェア リソースの消費も増加します。実際のアプリケーションでは、特定の状況に応じて適切な生成多項式を選択する必要があります。
      多項式除算を実装します。多項式除算は CRC チェックの中核アルゴリズムであり、FPGA で実装する必要があります。具体的には、多項式除算は、ハードウェア実装またはソフトウェア実装の 2 つの方法で実装できます。ハードウェア実装は組み合わせ論理回路によって実現でき、ソフトウェア実装はFPGA内のマイクロプロセッサまたは外部プロセッサによって実現できます。
       データのシフトとデータの追加を実装します。データのシフトはFPGA内部のシフトレジスタによって実現でき、データの加算は組み合わせ論理回路によって実現できます。
     受信側のチェックサム操作。受信者は、受信データに対して送信者と同じ多項式除算演算を実行して、剰余 R'(x) を取得する必要があります。R'(x) が 0 に等しい場合、データにエラーがないことを示し、それ以外の場合、データにエラーが発生しました。
以下では、FPGA で CRC チェックを実装する方法を詳しく紹介します。
生成多項式の選択
       生成多項式の選択は、CRC チェックの最初のステップです。生成多項式を選択するときは、次の要素を考慮する必要があります。
(1) 多項式ビット数: 多項式ビットが多いほど、CRC チェックのパフォーマンスは向上しますが、計算の複雑さとハードウェア リソースの消費も増加します。
(2) 生成多項式の最上位ビットと最下位ビットは両方とも 1 です。
(3) CRC チェックのパフォーマンスを保証するために、生成多項式の係数は可能な限り分散される必要があります。
次の表は、一般的に使用される生成多項式の一部を示しています。
多項式の桁数 CRC チェック コードの長さ
x^16 + x^15 + x^2 + 1 
実際のアプリケーションでは、特定の状況に応じて適切な生成多項式を選択する必要があります。
多項式除算の実現
       多項式除算はCRCチェックの核となるアルゴリズムであり、FPGAで実現する必要があります。多項式の除算は、ハードウェアまたはソフトウェアで 2 つの方法で実装できます。
      ハードウェア実装は、組み合わせ論理回路によって実現できます。ハードウェア実装では、多項式除算には並列処理という利点があり、計算速度を大幅に向上させることができます。具体的には、多項式の除算は次の回路図で表すことができます。

3. Verilogコアプログラム

`timescale 1ns / 1ps
.......................................................................
//x^16+x^15+x^2+1
//1- 1 0 0 0 -0 0 0 0 -0 0 0 0- 0 1 0 1 
assign tmp2[0] = xtmp0[8] ^ xtmp0[9] ^ xtmp0[10] ^ xtmp0[11] ^ xtmp0[12] ^ xtmp0[13] ^ xtmp0[14] ^ xtmp0[15] ^ i_x[0] ^ i_x[1] ^ i_x[2] ^ i_x[3] ^ i_x[4] ^ i_x[5] ^ i_x[6] ^ i_x[7];
assign tmp2[1] = xtmp0[9] ^ xtmp0[10] ^ xtmp0[11] ^ xtmp0[12] ^ xtmp0[13] ^ xtmp0[14] ^ xtmp0[15] ^ i_x[1] ^ i_x[2] ^ i_x[3] ^ i_x[4] ^ i_x[5] ^ i_x[6] ^ i_x[7];
assign tmp2[2] = xtmp0[8] ^ xtmp0[9] ^ i_x[0] ^ i_x[1];
assign tmp2[3] = xtmp0[9] ^ xtmp0[10] ^ i_x[1] ^ i_x[2];
assign tmp2[4] = xtmp0[10] ^ xtmp0[11] ^ i_x[2] ^ i_x[3];
assign tmp2[5] = xtmp0[11] ^ xtmp0[12] ^ i_x[3] ^ i_x[4];
assign tmp2[6] = xtmp0[12] ^ xtmp0[13] ^ i_x[4] ^ i_x[5];
assign tmp2[7] = xtmp0[13] ^ xtmp0[14] ^ i_x[5] ^ i_x[6];
assign tmp2[8] = xtmp0[0] ^ xtmp0[14] ^ xtmp0[15] ^ i_x[6] ^ i_x[7];
assign tmp2[9] = xtmp0[1] ^ xtmp0[15] ^ i_x[7];
assign tmp2[10] = xtmp0[2];
assign tmp2[11] = xtmp0[3];
assign tmp2[12] = xtmp0[4];
assign tmp2[13] = xtmp0[5];
assign tmp2[14] = xtmp0[6];
......................................................................
endmodule
00_012m

4. 完全なアルゴリズム コード ファイル

V

おすすめ

転載: blog.csdn.net/hlayumi1234567/article/details/130651347