このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
HDL コード生成の MATLAB Function ブロック内での永続変数および fi オブジェクトの使用
以下のガイドラインでは、モデルの MATLAB Function ブロック内で永続変数を使用するときの推奨設定を示します。MATLAB Function ブロックは、[User-Defined Functions] ブロック ライブラリで使用できます。MATLAB Function ブロックの永続変数は、Simulink® モデルの遅延要素と同様に動作します。
各ガイドラインに準拠要件のレベルを示す重大度レベルが割り当てられています。詳細については、HDL モデリング ガイドラインの重大度レベルを参照してください。
永続変数の更新は MATLAB Function の最後で行う
ガイドライン ID
2.8.1
重大度
強く推奨
説明
MATLAB Function ブロック内の永続変数がターゲット FPGA デバイスのレジスタにマップされるようにするには、MATLAB Function ブロック内の MATLAB® コードの最後で永続変数を更新します。永続変数の値が関数で読み取られるまたは使用されるまで、永続変数を更新しないでください。
たとえば、次の MATLAB コードは、値が出力時に読み取られる前に永続変数 FF0
が更新されるように関数によって更新されるため、推奨されません。
function FF_out0 = fcn(FF_in) %#codegen persistent FF0 if isempty(FF0) FF0 = zeros(1, 'like', FF_in); end % Incorrect order of FF update FF0 = FF_in % Output FF0. FF_out0 is NOT delayed FF_out0 = FF0;
次の MATLAB コードは、コードの最後で値が FF0
に書き込まれるため推奨されます。
function FF_out0 = fcn(FF_in) %#codegen persistent FF0 if isempty(FF0) FF0 = zeros(1, 'like', FF_in); end % Output FF0 FF_out0 = FF0; % Write FF update at the end of the code FF0 = FF_in
MATLAB Function ブロック内の永続変数からの代数ループ エラーの回避
ガイドライン ID
2.8.2
重大度
必須
説明
Simulink® モデルがフィードバック ループ内に MATLAB Function ブロックを含み、永続変数を使用している場合、モデルをコンパイルまたはシミュレートすると、代数ループ エラーが発生する場合があります。モデルをシミュレートして HDL コードを生成するには、非直達を使用します。
場合によって、フィードバック ループ内の MATLAB Function ブロックの永続的な遅延により、代数ループ エラーが発生することがあります。直達を使用すると、ブロックの出力は入力に直接依存します。[直達を許可] をオフにすると、ブロックの出力は、内部状態とプロパティに依存し、入力には依存しません。非直達セマンティクスは、出力を状態にのみ依存させることで、代数ループ エラーを回避します。
たとえば、モデル hdlcoder_MLFB_avoid_algebraic_loops
を開きます。
modelname = 'hdlcoder_MLFB_avoid_algebraic_loops'; blkname = 'hdlcoder_MLFB_avoid_algebraic_loops/Subsystem_AlgLoop_Issue/MATLAB Function1'; open_system(modelname)
モデルをシミュレートすると、代数ループ エラー メッセージが表示されます。MATLAB Function ブロック hdlcoder_MLFB_avoid_algebraic_loops/Subsystem_AlgLoop_Issue/MATLAB Function
は MATLAB Function ブロック内の永続変数を使用します。
open_system(blkname)
このエラーを回避するには、非直達を使用します。コマンド ラインで非直達を指定するには、関数 get_param
を使用して MATLABFunctionConfiguration
オブジェクトを作成し、プロパティ値 AllowDirectFeedthrough
を変更します。
MLFBConfig = get_param(blkname, 'MATLABFunctionConfiguration');
MLFBConfig.AllowDirectFeedthrough = 0;
MATLABFunctionConfiguration
も参照してください。
UI から非直達を指定するには、次を行います。
MATLAB Function ブロック
MATLAB Function1
を開きます。プロパティ インスペクターを開きます。[モデル化] タブの [設計] セクションで、[プロパティ インスペクター] をクリックします。
[プロパティ インスペクター] で、[詳細設定] セクションを開き、[直達を許可] チェック ボックスをオフにします。
MATLAB Function ブロック、Chart ブロック、および Truth Table ブロックでの代数ループ エラーの回避も参照してください。
代数エラーが生じることなく、モデルはシミュレートされます。これで Subsystem ブロック Subsystem_AlgLoop_Issue
の HDL コードを生成することができます。
open_system(modelname) set_param('hdlcoder_MLFB_avoid_algebraic_loops', 'SimulationCommand', 'Update') makehdl('hdlcoder_MLFB_avoid_algebraic_loops/Subsystem_AlgLoop_Issue')
MATLAB Function ブロック内での hdlfimath 設定の使用と fi オブジェクトの指定
ガイドライン ID
2.8.3
重大度
強く推奨
説明
fimath
プロパティは、fi オブジェクトに算術演算を実行するためのルールを定義します。算術演算を制御する fimath
プロパティを指定するには、fimath
オブジェクトを使用します。既定の fimath
プロパティ設定を確認するには、次のコマンドを実行します。
F = fimath
F = RoundingMethod: Nearest OverflowAction: Saturate ProductMode: FullPrecision SumMode: FullPrecision
既定の fimath
設定では、丸め誤差とオーバーフローが削減します。ただし、これらの設定を使用する MATLAB Function ブロックの HDL コード生成では、ターゲットの FPGA デバイスで追加のリソース使用が生じる可能性があります。追加のロジックを回避するには、hdlfimath
を使用します。関数 hdlfimath
は、HDL コード生成用に最適化された fimath
プロパティを定義するユーティリティです。既定の hdlfimath
設定を確認するには、次のコマンドを実行します。
H = hdlfimath
H = RoundingMethod: Floor OverflowAction: Wrap ProductMode: FullPrecision SumMode: FullPrecision
これらの設定を使用する MATLAB Function ブロックの HDL コード生成では、追加のリソース使用を回避し、ターゲット FPGA デバイス上の面積を節約します。
MATLAB Function ブロックにこれらの設定を指定するには、次のようにします。
MATLAB Function ブロックをダブルクリックします。
[モデル化] タブの [設計] セクションで、[プロパティ インスペクター] をクリックします。
[プロパティ インスペクター] で、[固定小数点プロパティ] セクションを開きます。次を行います。
[これらの継承される Simulink 信号タイプを fi オブジェクトとして扱う] で、
[固定小数点および整数]
を選択します。既定の
[固定小数点]
設定を使用する場合、fi オブジェクトを使用して指定された固定小数点データ型と、int8
やint16
などの組み込み整数型の処理方法が異なります。組み込み整数型を使用している場合、整数型計算の出力データ型は入力データ型と同じになります。ビット幅は、数値計算を実行するように拡張されません。[MATLAB 関数 fimath] で、[それ以外を指定] を選択し、「
hdlfimath
」と入力します。
既定の hdlfimath 設定と異なる丸め演算を実行するには、以下に示すように fi オブジェクトを使用してこれらの設定を明示的に指定します。
A = fi(4.9, 1, 8)
A = 4.8750 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 8 FractionLength: 4
B = fi(2.3, 1, 10)
B = 2.2969 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 10 FractionLength: 7
C = fi(A+B, 'RoundingMethod', 'Nearest', 'OverflowAction', 'Saturate')
C = 7.1719 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 12 FractionLength: 7 RoundingMethod: Nearest OverflowAction: Saturate ProductMode: FullPrecision SumMode: FullPrecision
MATLAB Function ブロックの hdfimath に従って fimath 設定が指定されているか確認するには、チェックMATLAB Function ブロックの設定をチェックを実行できます。