comm.HDLCRCGenerator
CRC 符号ビットの生成と入力データへの付加
説明
この HDL 最適化巡回冗長コード (CRC) 発生器 System object™ は、巡回冗長コード (CRC) ビットを生成します。フレーム処理ではなく、HDLCRCGenerator
System object はストリーミング データを処理します。オブジェクトには、入力と出力の両方のデータ ストリーム用にフレーム同期制御信号があります。
巡回冗長コード ビットを作成するには、以下を行います。
comm.HDLCRCGenerator
オブジェクトを作成し、そのプロパティを設定します。関数と同様に、引数を指定してオブジェクトを呼び出します。
System object の機能の詳細については、System object とはを参照してください。
作成
構文
説明
は、HDL 最適化 CRC 発生器 System object、CRCGen
= comm.HDLCRCGeneratorCRCGen
を作成します。このオブジェクトは、指定された生成多項式に従って CRC ビットを生成し、それらを入力データに付加します。
は、1 つ以上の名前と値のペアを使用してプロパティを設定します。各プロパティ名を一重引用符で囲みます。次に例を示します。 CRCGen
= comm.HDLCRCGenerator(Name,Value
)
CRCGen = comm.HDLCRCGenerator('Polynomial',[1 0 0 0 1 0 0 0 0], ... 'FinalXORValue',[1 1 0 0 0 0 0 0]);
は、CRCGen
= comm.HDLCRCGenerator(poly
,Name,Value
)Polynomial
プロパティを poly
に設定し、指定の他のプロパティは指定の値に設定しています。
プロパティ
特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release
を使用します。
プロパティが "調整可能" の場合、その値をいつでも変更できます。
プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。
Polynomial
— 生成多項式
[1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1]
(既定値) | バイナリ ベクトル
係数を降べきの順にしたバイナリ ベクトルとして指定された生成多項式。ベクトルの長さは多項式の次数に 1 を加算したものに等しくなければなりません。
InitialState
— シフト レジスタの初期条件
0
(既定値) | バイナリ スカラー | バイナリ ベクトル
シフト レジスタの初期条件。倍精度または単精度のバイナリ スカラーまたはベクトルで指定します。このプロパティをベクトルとして指定する場合、ベクトル長は、Polynomial
プロパティで指定する生成多項式の次数です。このプロパティをスカラーとして指定する場合、オブジェクトは、その値を生成多項式の次数に等しい長さのベクトルに拡張します。
DirectMethod
— チェックサムの計算方法
false
(既定値) | true
チェックサムの計算方法。logical スカラーで指定します。このプロパティが true
のときは、CRC チェックサムの計算に直接アルゴリズムが使用されます。
直接アルゴリズムと非直接アルゴリズムの詳細については、巡回冗長検査符号を参照してください。
ReflectInput
— 入力のバイト順
false
(既定値) | true
入力のバイト順。logical スカラーで指定します。このプロパティが true
のとき、オブジェクトはシフト レジスタを入力する前に入力データをバイト単位で反転します。
ReflectCRCChecksum
— チェックサムのバイト順
false
(既定値) | true
チェックサムのバイト順。logical スカラーで指定します。プロパティが true
のとき、オブジェクトは出力 CRC チェックサムを 180 度反転します。
FinalXORValue
— チェックサム マスク
0
(既定値) | バイナリ スカラー | バイナリ ベクトル
チェックサム マスク。倍精度または単精度データ型のバイナリ スカラーまたはベクトルで指定します。オブジェクトは入力データにチェックサムを追加する前に、この値を使用してチェックサムの XOR を行います。このプロパティをベクトルとして指定する場合、ベクトル長は、Polynomial
プロパティで指定する生成多項式の次数です。このプロパティをスカラーとして指定する場合、オブジェクトは、その値を生成多項式の次数に等しい長さのベクトルに拡張します。
使用法
説明
入力引数
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
startIn
— 入力メッセージの先頭
logical スカラー
入力メッセージの先頭。logical スカラーで指定します。
endIn
— 入力メッセージの末尾
logical スカラー
入力メッセージの末尾。logical スカラーで指定します。
validIn
— 入力データの有効性
logical スカラー
入力データの有効性。logical スカラーで指定します。validIn
が 1 (true
) の場合、オブジェクトは入力 X
の CRC チェックサムを計算します。
出力引数
Y
— チェックサムが付加された出力メッセージ
バイナリ列ベクトル | スカラー整数
出力メッセージ。チェックサムが付加された X
で構成され、入力 X
と同じ幅とデータ型を持つスカラー整数またはバイナリ列ベクトルとして返されます。
startOut
— 入力メッセージの先頭
logical スカラー
入力メッセージの先頭。logical スカラーとして返されます。
endOut
— 入力メッセージの末尾
logical スカラー
入力メッセージの末尾。logical スカラーとして返されます。
validOut
— 入力データの有効性
logical スカラー
入力データの有効性。logical スカラーとして返されます。validOut
が 1 (true
) のとき、出力データ Y
は有効です。
オブジェクト関数
オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj
という名前の System object のシステム リソースを解放するには、次の構文を使用します。
release(obj)
例
HDL の CRC 符号化と復号化
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{:})
アルゴリズム
タイミング ダイアグラム
この波形は、ストリーミング データと、付随する 8 ビット バイナリ ベクトル入力を使用した CRC16 の制御信号を示しています。チェックサム ワードを挿入するには、入力フレーム間に十分なスペースがなくてはなりません。
この波形図は連続入力データを示しています。ブロックは非連続データもサポートします。出力有効信号は入力有効パターンに一致します。
初期遅延
HDLCRCGenerator
System object では出力にレイテンシが発生します。入力データが連続すると仮定して、次のようにレイテンシを計算できます。
initialDelay = (CRCLength/inputDataWidth) + 2
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
この System object は、MATLAB® シミュレーションの高速化および DPI コンポーネントの生成を目的とした C/C++ コードの生成をサポートします。
HDL コード生成
HDL Coder™ を使用して FPGA 設計および ASIC 設計のための VHDL、Verilog および SystemVerilog のコードを生成します。
このソフトウェアは、double
および single
データ型をシミュレーションではサポートしますが、HDL コード生成ではサポートしません。
事前定義された System object からの HDL コードを生成するには、ビタビ復号化器 System object からの HDL コード生成 (HDL Coder)を参照してください。
バージョン履歴
R2012a で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)