メインコンテンツ

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

comm.HDLCRCDetector

R2026a

CRC を使用した入力データの誤り検出

説明

この HDL 最適化巡回冗長コード (CRC) 検出器 System object™ は入力データでチェックサムを計算し、結果と入力チェックサムを比較します。フレーム処理ではなく、HDLCRCDetector System object はストリーミング データを処理します。オブジェクトには、入力と出力の両方のデータ ストリーム用にフレーム同期制御信号があります。

チェックサムを計算および比較するには、次を行います。

  1. comm.HDLCRCDetector オブジェクトを作成し、そのプロパティを設定します。

  2. 関数と同様に、引数を指定してオブジェクトを呼び出します。

System object の機能の詳細については、System object とはを参照してください。

作成

説明

CRCDet = comm.HDLCRCDetector は HDL 最適化 CRC 検出器の System object の CRCDet を作成します。これにより、指定された生成多項式に従って入力データの誤りを検出します。

例

CRCDet = comm.HDLCRCDetector(Name,Value) は、1 つ以上の名前と値のペアを使用してプロパティを設定します。各プロパティ名を一重引用符で囲みます。以下に例を示します。

CRCDet = comm.HDLCRCDetector('Polynomial',[1 0 0 0 1 0 0 0 0], ...
'FinalXORValue',[1 1 0 0 0 0 0 0]);
最終的なチェックサムを使用して CRC8 多項式と 8 ビットの値を XOR に指定します。

CRCDet = comm.HDLCRCDetector(poly,Name,Value) は、Polynomial プロパティを poly に、その他の指定されたプロパティ名をその指定値に設定して、HDL 最適化 CRC 検出器の System object の CRCDet を作成します。

プロパティ

すべて展開する

特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release を使用します。

プロパティが "調整可能" の場合、その値をいつでも変更できます。

プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。

係数を降べきの順にしたバイナリ ベクトルとして指定された生成多項式。ベクトルの長さは多項式の次数に 1 を加算したものに等しくなければなりません。

シフト レジスタの初期条件。倍精度または単精度のバイナリ スカラーまたはベクトルで指定します。このプロパティをベクトルとして指定する場合、ベクトル長は、Polynomial プロパティで指定する生成多項式の次数です。このプロパティをスカラーとして指定する場合、オブジェクトは、その値を生成多項式の次数に等しい長さのベクトルに拡張します。

チェックサムの計算方法。logical スカラーで指定します。このプロパティが true のときは、CRC チェックサムの計算に直接アルゴリズムが使用されます。

直接アルゴリズムと非直接アルゴリズムの詳細については、Cyclic Redundancy Check Codesを参照してください。

入力のバイト順。logical スカラーで指定します。このプロパティが true のとき、オブジェクトはシフト レジスタを入力する前に入力データをバイト単位で反転します。

チェックサムのバイト順。logical スカラーで指定します。プロパティが true のとき、オブジェクトは出力 CRC チェックサムを 180 度反転します。

チェックサム マスク。倍精度または単精度データ型のバイナリ スカラーまたはベクトルで指定します。オブジェクトは入力データにチェックサムを追加する前に、この値を使用してチェックサムの XOR を行います。このプロパティをベクトルとして指定する場合、ベクトル長は、Polynomial プロパティで指定する生成多項式の次数です。このプロパティをスカラーとして指定する場合、オブジェクトは、その値を生成多項式の次数に等しい長さのベクトルに拡張します。

使用法

説明

[Y,startOut,endOut,validOut,err] = CRCn(X,startIn,endIn,validIn) は、制御信号に基づいて入力メッセージ X の CRC チェックサムを計算し、計算したチェックサムを入力のチェックサムと比較します。2 つのチェックサムが等しくない場合、出力 err が 1 (true) に設定されます。

入力引数

すべて展開する

入力メッセージと付加されたチェックサム。バイナリ ベクトルか、複数のビットを表すスカラー整数で指定します。たとえば、ベクトル入力 [0,0,0,1,0,0,1,1] は、uint8 入力 19 と等価です。

入力がベクトルの場合、データ型は double または logical になります。入力がスカラーの場合、データ型は符号なし整数あるいは小数ビットが 0 の符号なし固定小数点型 (fi([],0,N,0)) になります。

X はチェックされるメッセージの一部または全体となります。

X の長さは CRC の長さ以下で、CRC の長さは X の長さの倍数でなければなりません。

CRC の長さは、Polynomial プロパティで指定する多項式の次数です。

データ型: double | uint8 | uint16 | uint32 | logical | unsigned fi

入力メッセージの先頭。logical スカラーで指定します。

入力メッセージの末尾。logical スカラーで指定します。

入力データの有効性。logical スカラーで指定します。validIn が 1 (true) の場合、オブジェクトは入力 X の CRC チェックサムを計算します。

出力引数

すべて展開する

チェックサムが削除されたメッセージ。入力 X と同じ幅とデータ型をもつスカラー整数またはバイナリ列ベクトルとして返されます。

入力メッセージの先頭。logical スカラーとして返されます。

入力メッセージの末尾。logical スカラーとして返されます。

入力データの有効性。logical スカラーとして返されます。validOut が 1 (true) のとき、出力データ Y は有効です。

チェックサムの不一致。logical スカラーとして返されます。入力チェックサムが計算されたチェックサムと一致しない場合、err は 1 (true) です。

オブジェクト関数

オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj という名前の System object のシステム リソースを解放するには、次の構文を使用します。

release(obj)

すべて展開する

stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

例

すべて折りたたむ

HDL 最適化 CRC 発生器および検出器 System object を使用して信号を符号化および復号化します。この例では、HDL コード生成の関数に各オブジェクトを含める方法を説明します。

符号化される 32 ビット メッセージを 2 つの 16 ビット列で作成します。

msg = randi([0 1],16,2);

両方のオブジェクトのレイテンシを調整するための 12 のステップを実行します。すべてのステップに制御信号を割り当てます。最初の 2 つのサンプルは有効なデータで、残りはレイテンシの処理です。

numSteps = 12;
startIn = logical([1 0 0 0 0 0 0 0 0 0 0 0]);
endIn   = logical([0 1 0 0 0 0 0 0 0 0 0 0]);
validIn = logical([1 1 0 0 0 0 0 0 0 0 0 0]);

入力メッセージの処理中に、HDLCRCGenerator System object™ にランダム入力を渡します。ステップ 3 ~ 10 で、有効な入力信号は 0 であるため、ランダム データは符号化されません。

randIn = randi([0, 1],16,numSteps-2);
dataIn = [msg randIn];

各 System object™ を作成して呼び出す関数を記述します。これらの関数から HDL を生成できます。発生器オブジェクトと検出器オブジェクトは、両方とも CRC の長さが 16 で既定の多項式を使用します。

function [dataOut,startOut,endOut,validOut] = HDLCRC16Gen(dataIn,startIn,endIn,validIn)
%HDLCRC16Gen
% Generates CRC checksum using the comm.HDLCRCGenerator System object(TM)
% dataIn is a binary column vector. 
% startIn, endIn, and validIn are logical scalar values.
% You can generate HDL code from this function.

  persistent crcg16;
  if isempty(crcg16)
    crcg16 = comm.HDLCRCGenerator()
  end    
  [dataOut,startOut,endOut,validOut] = crcg16(dataIn,startIn,endIn,validIn);
end


function [dataOut,startOut,endOut,validOut,err] = HDLCRC16Det(dataIn,startIn,endIn,validIn)
%HDLCRC16Det
% Checks CRC checksum using the comm.HDLCRCDetector System object(TM)
% dataIn is a binary column vector. 
% startIn, endIn, and validIn are logical scalar values.
% You can generate HDL code from this function.

  persistent crcd16;
  if isempty(crcd16)
    crcd16 = comm.HDLCRCDetector()
  end    
  [dataOut,startOut,endOut,validOut,err] = crcd16(dataIn,startIn,endIn,validIn);
end


CRC 発生器関数を呼び出します。符号化されたメッセージは、元のメッセージと 16 ビット チェックサムです。

 for i =  1:numSteps
 [dataOutGen(:,i),startOutGen(i),endOutGen(i),validOutGen(i)] = ...
     HDLCRC16Gen(logical(dataIn(:,i)),startIn(i),endIn(i),validIn(i));
 end
crcg16 = 

  comm.HDLCRCGenerator with properties:

            Polynomial: [1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1]
          InitialState: 0
          DirectMethod: false
          ReflectInput: false
    ReflectCRCChecksum: false
         FinalXORValue: 0

メッセージ内のビットを反転してノイズを追加します。

dataOutNoise = dataOutGen;
dataOutNoise(2,4) = ~dataOutNoise(2,4);

CRC 検出器関数を呼び出します。検出器の出力は、チェックサムが削除された入力メッセージです。入力チェックサムが正しくなかった場合、err フラグは出力の最後の単語で設定されます。

for i = 1:numSteps
[dataOut(:,i),startOut(i),endOut(i),validOut(i),err(i)] = ...
    HDLCRC16Det(logical(dataOutNoise(:,i)),startOutGen(i),endOutGen(i),validOutGen(i));
end
crcd16 = 

  comm.HDLCRCDetector with properties:

            Polynomial: [1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1]
          InitialState: 0
          DirectMethod: false
          ReflectInput: false
    ReflectCRCChecksum: false
         FinalXORValue: 0

ロジック アナライザーを使用して、入力信号と出力信号を表示します。

channels = {'validIn','startIn','endIn',...
    {'dataIn','Radix','Hexadecimal'},...
    'validOutGen','startOutGen','endOutGen',...
    {'dataOutGen','Radix','Hexadecimal'},...
    {'dataOutNoise','Radix','Hexadecimal'},...
    'validOut','startOut','endOut','err',...
    {'dataOut','Radix','Hexadecimal'}};
la = dsp.LogicAnalyzer('Name','CRC Encode and Decode','NumInputPorts',length(channels),...
                      'BackgroundColor','Black','DisplayChannelHeight',8);

 for ii = 1:length(channels)
    if iscell(channels{ii})
        % Display data signals as hexadecimal integers
        c = channels{ii};
        modifyDisplayChannel(la,ii,'Name',c{1},c{2},c{3})
        % Convert binary column vector to integer
        cVal = eval(c{1});
        dat2 = uint16(bit2int(cVal,size(cVal,1))');
        chanData{ii} = squeeze(dat2);
    else
        modifyDisplayChannel(la,ii,'Name',channels{ii})
        chanData{ii} = squeeze(eval(channels{ii})');
    end
 end
la(chanData{:})

アルゴリズム

すべて展開する

拡張機能

すべて展開する

バージョン履歴

R2012b で導入