Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

HDL に最適化された CRC ライブラリ ブロックの使用

この例では、Simulink® のGeneral CRC Generator HDL OptimizedブロックとGeneral CRC Syndrome Detector HDL Optimizedブロックを使用する方法、および IEEE® 802.11 規格 [1] で規定されている CRC-CCITT の要件を満たすようにそれらのブロックを構成する方法を説明します。

モデル アーキテクチャ

この例のモデルには、Simulink の HDL Optimized CRC Generator ブロックおよび HDL Optimized CRC Detector ブロックが含まれています。これらのブロックでは、シミュレーションおよび HDL コード生成がサポートされています。このモデルの最上位サブシステム CRC Generation Detection には、相互に直列接続された HDL Optimized CRC Generator ブロックと HDL Optimized CRC Detector ブロックが含まれています。このモデルは 802.11 規格に基づく入力を使用します。CRC の生成と検出に関する詳細については、[2] を参照してください。

この例のモデルを開くには、次のコマンドを実行します。

modelname = 'commcrchdl';
open_system(modelname);

また、このサブシステムには、生成された CRC チェックサムにノイズを追加するための信号 _sel_ を選択できる AddNoise サブシステムが含まれています。このサブシステムを開くには、次のコマンドを実行します。

systemname = [modelname '/CRC Generation Detection'];
open_system(systemname);

入力パラメーターの設定

以下の入力パラメーターを指定します。

  • 多項式 行ベクトル [1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1] は次の多項式を表します。

crc_poly= [0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1];
crc_len = 16;

  • Initial state

この例の HDL Optimized CRC Generator ブロックは、"直接法" を使用し、メッセージをチェックサム シフト レジスタの最上位ビット (MSB) に入れ、ゼロをパディングせずにそのメッセージを処理します。802.11 規格の図 15-2 には、IEEE 802.11 CRC の実装が示されています。[初期状態] パラメーターを 1 に設定します。

  • Final XOR value

[Final XOR value] パラメーターを 0xFFFF に設定し、CRC チェックサムの 1 の補数を実装します。

finalXOR = [ones(1,16)];

入力データの生成

ランダムな入力テスト データを生成します。crc_len のゼロでパディングされたテスト データはストリーミング モードの 16 ビット/サンプルで処理されます。変数 dataIn_width はデータ処理速度を定義します。mlen は制御信号 "startIn""endIn"、および "validIn" の周期を定義します。dlen"validIn" 信号のパルス幅を定義します。

rng('default')
data = rand(1,48)>0.5;
% pad crc_len zero
msg = [data zeros(1,crc_len)];
dataIn_width = 16;
mlen = length(msg)/dataIn_width;
dlen = length(data)/dataIn_width;
startIn = [1 zeros(1,dlen)];
endIn = [zeros(1,dlen-1) 1 0];
validIn = [ones(1,dlen) 0];
sel = false;

目的の設計要件を満たすため、この例の dataIn_width を、8、4、2、または 1 ビットに変更します。たとえば、56 ビットの長さのデータを処理している場合、8 ビットのゼロをパディングして dataIn_width に 16 を使用する以外にも、dataIn_width を 8 にして mlendlen がどちらも必ず整数になるように選択することもできます。

CRC 発生器および CRC 検出器の初期遅延を計算するには、以下のコマンドを使用します。

initial_delay_gen =  crc_len/dataIn_width + 2;
initial_delay_det =  3*(crc_len/dataIn_width) + 2;

simTime = 2*dlen + initial_delay_gen + initial_delay_det;

モデルの実行

次のコマンドを使用してモデルを実行します。

sim(modelname);

Simulink の出力と MATLAB のリファレンスの比較

CRC 発生器 System object™ を作成します。IEEE® 802.11 規格で規定されている CRC-CCITT に合わせるため、生成多項式を ${z}^{16} + {z}^{12} + {z}^5+ 1$、初期状態を 1、直接法と最終 XOR を 1 に設定します。

crcgenerator = comm.CRCGenerator('Polynomial','z^16 + z^12 + z^5 + 1', ...
    'InitialConditions',1,'DirectMethod',true,'FinalXOR',finalXOR) %#ok<*NOPTS>

refGenData = crcgenerator(data');
xsim_dataOut_gen = squeeze(sim_dataOut_gen);
xsim_dataIn_det = squeeze(sim_dataIn_det);
xsim_validOut_gen = squeeze(sim_validOut_gen);
if dataIn_width == 1
    actGenData = reshape(xsim_dataOut_gen(xsim_validOut_gen),[],1);
else
    actGenData = reshape(xsim_dataOut_gen(:,xsim_validOut_gen),[],1);
end
errCRCGen = nnz(refGenData - actGenData);
fprintf('CRC encoded Frame: Behavioral and HDL simulation differ by %d bits\n',errCRCGen);
crcgenerator = 

  comm.CRCGenerator with properties:

           Polynomial: 'z^16 + z^12 + z^5 + 1'
    InitialConditions: 1
         DirectMethod: true
    ReflectInputBytes: false
     ReflectChecksums: false
             FinalXOR: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
    ChecksumsPerFrame: 1

CRC encoded Frame: Behavioral and HDL simulation differ by 0 bits

CRC Detector System object™ を作成します。IEEE® 802.11 規格で規定されている CRC-CCITT に合わせるため、生成多項式を ${z}^16 + {z}^12 + {z}^5+ 1$、初期状態を 1、直接法と最終 XOR を 1 に設定します。

crcdetector = comm.CRCDetector('Polynomial','z^16 + z^12 + z^5 + 1', ...
    'InitialConditions',1,'DirectMethod',true,'FinalXOR',finalXOR)

if dataIn_width == 1
    crcdata = reshape(xsim_dataIn_det(xsim_validOut_gen),[],1);
else
    crcdata = reshape(xsim_dataIn_det(:,xsim_validOut_gen),[],1);
end
[refDetData, refErr] = crcdetector(crcdata);
xsim_dataOut_det = squeeze(sim_dataOut_det);
xsim_validOut_det = squeeze(sim_validOut_det);
if dataIn_width == 1
    actDetData = reshape(xsim_dataOut_det(xsim_validOut_det),[],1);
else
    actDetData = reshape(xsim_dataOut_det(:,xsim_validOut_det),[],1);
end
errCRCGDet = nnz(refDetData - actDetData);
errCheckSum = nnz(refErr - sim_err(sim_endOut_det));
fprintf(['CRC Decoded Frame: Behavioral and HDL simulation differ by %d bits and %d'...
    ' checksum bits\n'],errCRCGDet,errCheckSum);
crcdetector = 

  comm.CRCDetector with properties:

           Polynomial: 'z^16 + z^12 + z^5 + 1'
    InitialConditions: 1
         DirectMethod: true
    ReflectInputBytes: false
     ReflectChecksums: false
             FinalXOR: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
    ChecksumsPerFrame: 1

CRC Decoded Frame: Behavioral and HDL simulation differ by 0 bits and 0 checksum bits

主要な信号をロジック アナライザーで確認できます。関数 commcrchdl_plot はロジック アナライザーの表示の設定方法を示しています。Logic Analyzer System object™ の詳細については、dsp.LogicAnalyzerを参照してください。

h = commcrchdl_plot(dataIn,startIn,endIn,validIn,...
    sim_dataOut_gen,sim_startOut_gen,sim_endOut_gen,sim_validOut_gen,...
    sim_dataOut_det,sim_startOut_det,sim_endOut_det,sim_validOut_det,sim_err,dataIn_width);

"dataIn""startIn""endIn"、および "validIn" は、HDL CRC 発生器への入力データと制御信号です。CRC 発生器の出力 "sim_dataOut_gen" には、各サンプルの dataIn_width ビットごとにチェックサムが追加されたメッセージが表示されます。出力波形において "sim_endOut_gen" が高のときに、チェックサムを読み取ることができます。"sim_dataIn_det" には、チェックサムが破損したメッセージが表示されます。"sim_dataOut_det" には、CRC 検出器のメッセージ出力が表示されます。"err" 信号が高であれば、エラーが検出されています。"sim_err" は、"sim_endOut_det" がアクティブのときに有効になります。

HDL コードの生成

この例の HDL コードを生成するには、HDL Coder™ ライセンスが必要です。

サブシステムの HDL コードとテストベンチを生成するには、コマンド makehdl(subsystemname)makehdltb(subsystemname) を使用します。

サブシステム名を 'commcrchdl/CRC Generation Detection/HDL CRC in Transmitter' または 'commcrchdl/CRC Generation Detection/HDL CRC in Receiver' として指定します。

参考文献

  1. IEEE 802.11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications.(2007 revision).IEEE-SA.12 June 2007.

  2. Giuseppe Campobello, Giuseppe Patane, Marco Russo."Parallel CRC Realization," IEEE Transactions on Computers, vol. 52, no. 10, pp. 1312-1319, October, 2003.