Main Content

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

comm.HDLCRCGenerator

CRC 符号ビットの生成と入力データへの付加

説明

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

巡回冗長コード ビットを作成するには、以下を行います。

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

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

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

作成

説明

CRCGen = comm.HDLCRCGenerator は、HDL 最適化 CRC 発生器 System object、CRCGen を作成します。このオブジェクトは、指定された生成多項式に従って CRC ビットを生成し、それらを入力データに付加します。

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

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

CRCGen = comm.HDLCRCGenerator(poly,Name,Value) は、Polynomial プロパティを poly に設定し、指定の他のプロパティは指定の値に設定しています。

プロパティ

すべて展開する

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

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

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

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

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

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

直接アルゴリズムと非直接アルゴリズムの詳細については、巡回冗長検査符号を参照してください。

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

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

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

使用法

説明

[Y,startOut,endOut,validOut] = CRCn(X,startIn,endIn, validIn) は制御信号に基づいて入力メッセージ X の CRC チェックサムを生成し、チェックサムを X の末尾に付加します。

入力引数

すべて展開する

入力メッセージ。バイナリ ベクトルか、複数のビットを表すスカラー整数で指定します。たとえば、ベクトル入力 [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 で構成され、入力 X と同じ幅とデータ型を持つスカラー整数またはバイナリ列ベクトルとして返されます。

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

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

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

オブジェクト関数

オブジェクト関数を使用するには、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{:})

アルゴリズム

すべて展開する

拡張機能

バージョン履歴

R2012a で導入