Main Content

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

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 から非直達を指定するには、次を行います。

  1. MATLAB Function ブロック MATLAB Function1 を開きます。

  2. プロパティ インスペクターを開きます。[モデル化] タブの [設計] セクションで、[プロパティ インスペクター] をクリックします。

  3. [プロパティ インスペクター] で、[詳細設定] セクションを開き、[直達を許可] チェック ボックスをオフにします。

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 オブジェクトを使用して指定された固定小数点データ型と、int8int16 などの組み込み整数型の処理方法が異なります。組み込み整数型を使用している場合、整数型計算の出力データ型は入力データ型と同じになります。ビット幅は、数値計算を実行するように拡張されません。

    • [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 ブロックの設定をチェックを実行できます。

参考

ブロック

関数

関連するトピック