Main Content

永続変数と System object による状態のモデル化

この例では、HDL コードの生成のために、MATLAB® 設計内の状態と遅延を永続変数と System object を使用してモデル化する方法を説明します。

はじめに

System object を使用して遅延をモデル化すると、簡潔なコードを生成できます。

MATLAB では、永続変数を使用する関数を複数回呼び出しても、遅延が複数生成されることはありません。代わりに、その関数の状態が複数回更新されます。

状態をもつ関数で実装されたコードを再利用するには、関数を複数回複製して、遅延をもつアルゴリズムのインスタンスを複数作成する必要があります。

MATLAB コードの確認

ソーベル アルゴリズムの実装について確認します。

設計を検証し、遅延とライン バッファーが次の要素を使用してどのようにモデル化されているか確認します。

関数 filterdelaymlhdlc_sobel コード内で別の名前で複製され、HDL コード生成向けの MATLAB のアルゴリズムには複数のバージョンがインスタンス化されます。

MATLAB 永続変数を使用している場合、遅延線の実装は複雑になります。

次に、mlhdlc_sysobj_sobel で System object を使用して簡単に実装された同じアルゴリズムを見てみましょう。

HDL コード生成の制約内で使用する場合、dsp.Delay オブジェクトは必ずレジスタにマッピングされます。永続変数がレジスタと推定されるためには、変数を書き込んでレジスタとしてマッピングする前に、慎重に変数を読み取る必要があります。

MATLAB 設計

demo_files = {...
    'mlhdlc_sysobj_sobel', ...
    'mlhdlc_sysobj_sobel_tb', ...
    'mlhdlc_sobel', ...
    'mlhdlc_sobel_tb'
    };

新規フォルダーの作成と関連ファイルのコピー

次のコードを実行して、必要なサンプル ファイルを一時フォルダーにコピーします。

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_delay_modeling'];

% create a temporary folder and copy the MATLAB files
cd(tempdir);
[~, ~, ~] = rmdir(mlhdlc_temp_dir, 's');
mkdir(mlhdlc_temp_dir);
cd(mlhdlc_temp_dir);

for ii=1:numel(demo_files)
    copyfile(fullfile(mlhdlc_demo_dir, [demo_files{ii},'.m*']), mlhdlc_temp_dir);
end

既知の制限事項

事前定義された System object について、HDL Coder™ では step メソッドのみがサポートされています。output メソッドと update メソッドはサポートされていません。

step メソッドしかサポートされていないため、遅延をモデリング フィードバック パスで使用することはできません。たとえば、dsp.Delay System object を使用している場合、次の MATLAB コードを使用することはできません。

%#codegen
function y = accumulate(u)
persistent p;
if isempty(p)
   p = 0;
end
y = p;
p = p + u;

HDL Coder プロジェクトの新規作成

新しいプロジェクトを作成するには、次のコマンドを入力します。

coder -hdlcoder -new mlhdlc_sobel

次に、mlhdlc_sobel.m ファイルを MATLAB 関数としてプロジェクトに追加し、mlhdlc_sobel_tb.m を MATLAB テスト ベンチとして追加します。

MATLAB HDL Coder プロジェクトの作成と入力に関する詳細なチュートリアルについては、MATLAB から HDL へのワークフロー入門を参照してください。

固定小数点変換と HDL コード生成の実行

ワークフロー アドバイザーを起動して [コード生成] の手順を右クリックします。[選択したタスクまで実行] オプションを選択して、最初から HDL コード生成までのすべての手順を実行します。

コード生成ログのウィンドウにあるハイパーリンクをクリックして、生成された HDL コードを確認します。

次に、System object 設計のプロジェクトを新規作成します。

coder -hdlcoder -new mlhdlc_sysobj_sobel

mlhdlc_sysobj_sobel.m ファイルを MATLAB 関数としてプロジェクトに追加し、mlhdlc_sysobj_sobel_tb.m を MATLAB テスト ベンチとして追加します。

コード生成手順を繰り返し、生成された固定小数点 MATLAB および HDL コードを確認します。

その他のメモ:

dsp.Delay オブジェクトで Length プロパティを 1 より大きい値に設定することで、整数の遅延をモデル化できます。これらの遅延オブジェクトは、生成されたコードにおいてシフト レジスタにマッピングされます。

最適化オプション [永続配列変数を RAM にマッピング] を有効にすると、次の条件で遅延 System object がブロック RAM にマッピングされます。

  • dsp.DelayInitialConditions プロパティが 0 に設定されている。

  • 遅延入力データ型が浮動小数点でない。

  • RAMSize (DelayLength * InputWordLength) の値が [RAM マッピングのしきい値] 以上である。

生成ファイルのクリーンアップ

プロジェクト用の一時フォルダーをクリーンアップするには、次のコマンドを実行します。

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_delay_modeling'];
clear mex;
cd (mlhdlc_demo_dir);
rmdir(mlhdlc_temp_dir, 's');