Main Content

MATLAB Function ブロックを使用した RAM マッピング

この例では、MapPersistentVarsToRAM ブロックレベル パラメーターを使用して永続配列を RAM にマッピングする方法を示します。RAM サイズは RAMMappingThreshold 以上でなければなりません。リソース レポートには、RAM マッピングによる面積改善の差が表示されます。

ライン バッファー モデル

モデル hdlcoder_ram_mapping_matlab_function を開きます。

open_system('hdlcoder_ram_mapping_matlab_function')
set_param('hdlcoder_ram_mapping_matlab_function', 'SimulationCommand', 'Update')

モデル内の DUT サブシステムが Line Buffer MATLAB Function ブロックを駆動します。

open_system('hdlcoder_ram_mapping_matlab_function/HDL_DUT')

ライン バッファーの MATLAB® コード実装を確認するには、MATLAB Function ブロックを開きます。

open_system('hdlcoder_ram_mapping_matlab_function/HDL_DUT/Line Buffer')

HDL コードの生成

1. リソース利用レポートの生成を有効にします。レポートには、設計で使用される加算器、減算器、乗算器、レジスタ、および RAM の数が表示されます。

hdlset_param('hdlcoder_ram_mapping_matlab_function', 'resourcereport', 'on')

2.HDL_DUT サブシステムの HDL コードを生成します。

makehdl('hdlcoder_ram_mapping_matlab_function/HDL_DUT')

HDL Coder™ にコード生成レポートが表示されます。このレポートで、[高水準リソース レポート] セクションを選択します。この設計では 81 個のレジスタと 648 個の 1 ビット レジスタが使用されます。既定では、MapPersistentVarsToRAM プロパティは無効化されていて、コード ジェネレーターは RAM リソースを推定または消費しません。

RAM マッピングの有効化と HDL コードの生成

1. MATLAB Function ブロックで MapPersistentVarsToRAM HDL パラメーターを有効にします。

ml_subsys = 'hdlcoder_ram_mapping_matlab_function/HDL_DUT/Line Buffer';
hdlset_param(ml_subsys, 'MapPersistentVarsToRAM', 'on')

2.HDL_DUT サブシステムの HDL コードを生成します。

makehdl('hdlcoder_ram_mapping_matlab_function/HDL_DUT')

コード生成レポートで、[高水準リソース レポート] セクションを選択します。この設計では、1 つのレジスタ、8 つの 1 ビット レジスタ、および 1 つの RAM が使用されます。推定される RAM の数は、指定する RAMMappingThreshold によって決まります。RAM マッピングのパラメーターを参照してください。

MATLAB Datapath アーキテクチャを使用した RAM マッピング

MATLAB Datapath アーキテクチャでは、MATLAB Function ブロックが通常のサブシステムと同様に扱われます。このアーキテクチャは、記述した MATLAB コードを Simulink® でデータフロー表現に変換します。これにより、HDL Coder は、MATLAB Function ブロックを越えたモデル内の他の Simulink ブロックとの間でさらに広く最適化を使用できます。

1. MATLAB Datapath HDL アーキテクチャを有効にして、MATLAB Function ブロックで MapPersistentVarsToRAM パラメーターを設定します。

hdlset_param(ml_subsys, 'Architecture', 'MATLAB Datapath')
hdlset_param(ml_subsys, 'MapPersistentVarsToRAM', 'on')
Error using cell/ismember (line 34)
Input A of class cell and input B of class cell must be cell arrays of
character vectors, unless one is a character vector.

Error in internal.matlab.publish.compareFigures (line 35)
[unchanged, iNewToOld] = ismember(newId, oldId);

Error in internal.matlab.publish.PublishSimulinkSystems/leavingCell (line 28)
            systemsToSnap = internal.matlab.publish.compareFigures(obj.savedState, newSystems);

Error in snapnow>leavingCell (line 208)
            newFiles = data.plugins(iPlugins).instance.leavingCell(iCell);

Error in snapnow (line 144)
                        data = leavingCell(iCell(k), data, doCapture(k));

Error in RAMMappingWithMATLABFunctionBlockExample (line 28)
hdlset_param('hdlcoder_ram_mapping_matlab_function', 'resourcereport', 'on')

Error in evalmxdom>instrumentAndRun (line 114)
text = evalc(evalstr);

Error in evalmxdom (line 21)
[data,text,laste] = instrumentAndRun(file,cellBoundaries,imageDir,imagePrefix,options);

Error in publish (line 207)
    dom = evalmxdom(file,dom,cellBoundaries,prefix,imageDir,outputDir,options);

Error in publishMainFile (line 19)
            publish(metadata.main,opts);

Error in examples.previewExampleInSandbox (line 79)
publishMainFile(metadata, metadata.filepath);

Error in examples.connector.previewExampleInSandbox (line 3)
        examples.previewExampleInSandbox(id);
Error using cell/ismember (line 34)
Input A of class cell and input B of class cell must be cell arrays of
character vectors, unless one is a character vector.

Error in internal.matlab.publish.compareFigures (line 35)
[unchanged, iNewToOld] = ismember(newId, oldId);

Error in internal.matlab.publish.PublishSimulinkSystems/leavingCell (line 28)
            systemsToSnap = internal.matlab.publish.compareFigures(obj.savedState, newSystems);

Error in snapnow>leavingCell (line 208)
            newFiles = data.plugins(iPlugins).instance.leavingCell(iCell);

Error in snapnow (line 144)
                        data = leavingCell(iCell(k), data, doCapture(k));

Error in RAMMappingWithMATLABFunctionBlockExample (line 68)
hdlset_param(ml_subsys, 'Architecture', 'MATLAB Datapath')

Error in evalmxdom>instrumentAndRun (line 114)
text = evalc(evalstr);

Error in evalmxdom (line 21)
[data,text,laste] = instrumentAndRun(file,cellBoundaries,imageDir,imagePrefix,options);

Error in publish (line 207)
    dom = evalmxdom(file,dom,cellBoundaries,prefix,imageDir,outputDir,options);

Error in publishMainFile (line 19)
            publish(metadata.main,opts);

Error in examples.previewExampleInSandbox (line 79)
publishMainFile(metadata, metadata.filepath);

Error in examples.connector.previewExampleInSandbox (line 3)
        examples.previewExampleInSandbox(id);

2.HDL_DUT サブシステムの HDL コードを生成します。

makehdl('hdlcoder_ram_mapping_matlab_function/HDL_DUT')

[高水準リソース レポート] は、MATLAB Function ブロックの既定のアーキテクチャを使用した設計と同じ数のリソースがこの設計で消費されることを示しています。MATLAB Datapath アーキテクチャが MATLAB コードを Simulink データフロー表現に変更する方法を確認するには、生成されたモデル gm_hdlcoder_ram_mapping_matlab_function を開いて、HDL_DUT サブシステムに移動します。MATLAB Function ブロックの代わりに Line Buffer サブシステムがあります。Subsystem ブロック内には、推定される RAM ブロックを表示したデータフロー表現があります。

MATLAB Function ブロック内の永続配列の効率的な RAM マッピングを可能にする設計パターンの詳細については、eml_hdl_design_patterns/RAMs ライブラリを参照してください。

関連するトピック