Simscape FPGA HIL ワークフローでの Simscape モデルからの HDL コードの生成
HDL Coder™ のライセンスと Simscape™ HDL ワークフロー アドバイザーがあれば、FPGA プラットフォームに展開するための HDL コードを Simscape モデルから生成できます。アドバイザーは、Simscape モデルを HDL Coder が HDL コードの生成に使用する Simulink® 実装モデルに変換します。
Simscape モデルを HDL コードに変換すると、以下が可能になります。
Simscape の物理システム モデリング機能を利用する。
FPGA の再設定変更とパラレル化機能を使用して、モデルのプロトタイプを迅速に作成する。
ハードウェアインザループ (HIL) を使用して HDL 実装をリアルタイムでシミュレートする。
Simscape HDL ワークフロー アドバイザーを実行する前に、遅延および有効な実行時パラメーターを除外するようネットワークを構成してください。HDL Coder における Simscape モデルの機能および制限事項の詳細については、Simscape ハードウェアインザループ ワークフロー入門 (HDL Coder)を参照してください。
Simscape HDL ワークフロー アドバイザーを使用した Simscape モデル用 HDL コードの生成
この例では、Simscape HDL ワークフロー アドバイザーと後退オイラー法ソルバーを使用して Simscape モデルを HDL コードに変換する方法を示します。Simscape ネットワークと Simulink モデルをリアルタイム シミュレーションおよび HDL コード生成用に構成する場合は、モデルの準備を参照してください。Simscape HDL ワークフロー アドバイザーを使用する準備が既にできているバージョンのモデルを開くには、Simscape HDL ワークフロー アドバイザーを使用した HDL コードの生成を参照してください。
メモ
この例には、非線形ブロックを置き換えるためのモデルの再設定が含まれます。これは、後退オイラー法ソルバーを使用する場合に必要になります。モデルの再設定を避けるには、[ソルバー タイプ] を [分割]
に設定できます。
モデルの準備
Simscape モデルを FPGA 展開用に準備するには、以下の手順に従います。
ssc_bridge_rectifier
モデルを開きます。MATLAB® コマンド プロンプトで、次のように入力します。baselineModel = 'ssc_bridge_rectifier'; load_system(baselineModel) open_system(baselineModel)
ベースライン シミュレーションの結果をそれ以降の反復と比較するために、Load Voltage スコープ ブロックというラベルのついた Scope ブロックのデータ点制限を取り除き、シミュレーション データ インスペクターでのデータ ログを有効にして、Scope ブロックにデータを入力する信号を取得します。
Scope ブロックを開きます。[ビュー] 、 [コンフィギュレーション プロパティ] をクリックします。[ログ] タブで、[データ点の制限] をオフにします。
Scope ブロックへの接続を右クリックし、
[選択した信号のログ]
を選択します。ログ バッジが信号の上に表示されます。
モデルをシミュレートし、シミュレーション データ インスペクターで結果を表示します。
%% Simulate baseline model sim(baselineModel) %% Get Simulation Data Inspector run IDs for runIDs = Simulink.sdi.getAllRunIDs; runID = runIDs(end); run = Simulink.sdi.getRun(runID); signal1 = run.getSignalByIndex(1); % run.signalCount signal1.checked = true; Simulink.sdi.view
必要に応じて、キーボードの Space キーを押して、シミュレーション データ インスペクターのプロットをビューに収めます。
ベースライン シミュレーションでは、全波ブリッジ整流器の負荷電圧について想定どおりの結果が返されます。
アドバイザーを実行する前に、ネットワークを非線形にするブロックを特定して置換します。ブロックを特定するには、関数
simscape.findNonlearBlocks
を使用します。simscape.findNonlinearBlocks(baselineModel)
Found network that contains nonlinear equations in the following blocks: 'ssc_bridge_rectifier/AC Voltage Source' The number of linear or switched linear networks in the model is 0. The number of nonlinear networks in the model is 1. ans = 1×1 cell array {'ssc_bridge_rectifier/AC Voltage Source'}
モデルには AC Voltage Source ブロックが含まれていますが、これは非線形方程式を生成する周期的なソースです。
Simscape ネットワーク内の Controlled Voltage Source ブロックをもつ周期的ソースを、ネットワーク外の Sine Wave ブロックと置換することができます。
AC Voltage Source ブロックを削除します。
[Simulink] 、 [Sources] ライブラリから Sine Wave ブロックを追加します。
[Simscape] 、 [Utilities] ライブラリから Simulink-PS Converter ブロックを追加します。
[Simscape]、[Foundation Library]、[Electrical]、[Electrical Sources] ライブラリから Controlled Voltage Source ブロックを追加します。
Sine Wave ブロックを Simulink-PS Converter ブロックに接続し、Simulink-PS Converter ブロックを Controlled Voltage Source ブロックに接続します。
削除した AC Voltage Source ブロックのパラメーターと一致するように Sine Wave ブロックを構成します。
[振幅] パラメーターを
sqrt(2)*120
に設定します。[周波数 (rad/sec)] パラメーターを
60*2*pi
に設定します。[サンプル時間] パラメーターを
1e-5
に設定します。その後、[サンプル時間] ボックスの横にある 3 つのドットのアイコンをクリックして、[変数を作成] を選択します。変数に
Ts
という名前をつけて、[作成] をクリックします。これで、この変数をワークスペースで表示し編集できるようになりました。
ネットワークを非線形にするブロックがないことを確認します。
% Simulate sim(baselineModel) % Check for nonlinear blocks simscape.findNonlinearBlocks(baselineModel)
The number of linear or switched linear networks in the model is 1. ans = 0×0 empty cell array
モデルには、線形方程式または線形スイッチド システム方程式を生成するブロックのみが含まれています。これで、後退オイラー法ソルバーのためのモデルの準備が整いました。
モデルをシミュレートし、結果をシミュレーション データ インスペクターでベースライン結果と比較します。
% Get Simulation Data Inspector run IDs runIDs = Simulink.sdi.getAllRunIDs; runBaseline = runIDs(end - 1); runSwitchedLinear = runIDs(end); % Open the Simulation Data Inspector Simulink.sdi.view compBaseline1 = Simulink.sdi.compareRuns(runBaseline,... runSwitchedLinear);
結果はベースライン結果に類似しています。
Simscape HDL ワークフロー アドバイザーの進捗状況チェックを今後実行するために、図に示すように、Digital Clock ブロックを [Simulink] 、 [Sources] ライブラリから、Display ブロックを [Simulink][Sinks] ライブラリから追加して接続します。Digital Clock では、[サンプル時間] パラメーターを
Ts
に設定します。モデルは今のところ、可変ステップ ソルバーを使用するよう設定されています。リアルタイム シミュレーションでは、固定ステップ ソルバーを使用しなければなりません。サンプル時間の色と注釈を使用すると、モデルに連続設定が含まれているかどうかの判別に役立ちます。サンプル時間の色と注釈をオンにするには、[デバッグ] タブにある [情報のオーバーレイ] をクリックし、[サンプル時間] グループで [色] と [テキスト] を選択します。
モデルのブロック線図が更新され、[タイミング凡例] ペインが表示されます。
モデルをリアルタイム シミュレーション用に構成します。
Simulink モデルを固定ステップ、固定コストのシミュレーション用に構成します。[コンフィギュレーション パラメーター] ウィンドウで [ソルバー] をクリックし、以下のように設定します。
[タイプ] を
[固定ステップ]
に設定[ソルバー] を
[離散 (連続状態なし)]
に設定
Simscape ネットワークを固定ステップ、固定コストのシミュレーション用に構成します。Solver Configuration ブロックで以下を実行します。
[ローカル ソルバーを使用] を選択する。
[ソルバー タイプ] を
[後退オイラー]
に設定する。[サンプル時間] に
Ts
を指定する。
モデルをシミュレートし、結果をシミュレーション データ インスペクターでベースライン結果と比較します。
% Simulate sim(baselineModel) % Get Simulation Data Inspector run IDs runIDs = Simulink.sdi.getAllRunIDs; runBaseline = runIDs(end - 2); runRealTime = runIDs(end); % Open the Simulation Data Inspector Simulink.sdi.view compBaseline1 = Simulink.sdi.compareRuns(runBaseline,... runRealTime);
結果はベースライン結果に類似しています。
Simscape HDL ワークフロー アドバイザーを使用した HDL コードの生成
HDL コードを生成するには、Simscape HDL ワークフロー アドバイザーを、モデルの準備の節で準備した Simscape モデル上で実行するか、またはコード生成用に準備された ssc_bridge_rectifier_hdl
モデルを開いて実行します。
モデルの名前を変更します。
「モデルの準備」の節でモデルを準備した場合は、モデルの名前を
ssc_model
に変更します。あらかじめ HDL コード生成用に準備されたモデルを開いて使用するには、MATLAB コマンド プロンプトで以下を入力します。
open_system('ssc_bridge_rectifier_hdl')
モデルをローカル ディレクトリに
ssc_model
として保存します。
Simscape HDL ワークフロー アドバイザーを実行します。
sschdladvisor('ssc_model')
Simscape HDL ワークフロー アドバイザーが開きます。
コード生成互換性チェックを実行します。
[コード生成互換性] 、 [ソルバーのコンフィギュレーションのチェック] を選択し、[このタスクを実行] をクリックします。
[モデルの互換性のチェック] を選択し、[このタスクを実行] をクリックします。
モデルがこれらのチェックをパスすると、アドバイザーがレポートします。
状態空間係数を抽出します。[状態空間の変換] を選択し、[すべて実行] をクリックします。変換には時間がかかる場合があります。
タスクの実行後、アドバイザーは状態空間表現の概要とパラメーターの表を表示します。
状態数: 5
入力数: 1
出力数: 1
モードの数: 7
微分変数の数: 1
離散サンプル時間: 1e-05
パラメーター パラメーター サイズ A 5 x 5 x 7 B 5 x 1 x 7 F0 5 x 1 x 7 C 1 x 5 x 1 D 1 x 1 x 1 Y0 1 x 1 x 1 状態、モード、およびパラメーター データのサイズは、モデルを展開するために必要な FPGA リソースの量の推定に役立ちます。値が大きいほど、必要とされる FPGA リソースの量は多くなります。入出力データは、リアルタイムの展開と可視化に必要な I/O 接続の数とタイプを示します。
メモ
この手順を分割ソルバーを使用して実行する場合、この表の値は異なる値になります。
モデルの HDL 実装を生成します。[実装モデルの生成] 、 [実装モデルを生成] を選択し、[このタスクを実行] をクリックします。
Simscape HDL ワークフロー アドバイザーが実装モデルを生成すると、アドバイザーはタスクがパスしたことをレポートし、生成された
gmStateSpaceHDL_ssc_model
という名前の実装モデルへのリンクを表示します。[gmStateSpaceHDL_ssc_model] をクリックして、生成された実装モデルを開きます。
モデルには、元のモデルのブロックに加えて、HDL ワークフロー アドバイザーをサポートする新しいブロックが含まれています。
Digital Clock、Display、Sine Wave、Load Voltage — 元のモデルから残されているブロック
Rate Transition1 — 異なるレートで動作するブロック間でデータの転送を処理します。
Data Type Conversion1、Data Type Conversion2 — 倍精度と単精度のデータ型間で変換を行います。HDL コード生成には単精度データが必要です。
HDL Subsystem — Simscape ネットワークの HDL コード生成互換バージョンが含まれています。
Load Voltage — 負荷電圧を表示する Scope ブロック。
シミュレーションをベースライン結果と比較するために実装モデルを準備します。
自動生成されたモデルの調整と残留ブロックの削除を必要に応じて行い、モデルをより良く整えることができます。Digial Clock ブロックと Display ブロックは不要ですが、シミュレーションの結果の妨げとなることはありません。
Scope ブロックへの入力信号を右クリックし、[選択した信号のログ] をクリックします。
モデルの剛性が高すぎる場合、検証の不一致が発生する可能性があります。モデルの剛性のチェックについては、Simscape の剛性影響解析を参照してください。
モデル ウィンドウの Display ブロックは、シミュレーションの経過時間を示します。
HDL サブシステムが元の Simscape モデルに対応していることを確認するため、モデルをシミュレートし、結果をベースライン シミュレーションの結果と比較します。
% Simulate sim('gmStateSpaceHDL_ssc_model') % Get Simulation Data Inspector run IDs runIDs = Simulink.sdi.getAllRunIDs; runBaseline = runIDs(end - 3); runHDLImplementation = runIDs(end); % Open the Simulation Data Inspector Simulink.sdi.view compBaseline1 = Simulink.sdi.compareRuns(runBaseline,... runHDLImplementation);
結果はベースライン結果に類似しています。Simscape モデルは HDL コード生成と互換性があります。
実装から HDL コードを生成します。
HDL 実装モデルから [コンフィギュレーション パラメーター] ウィンドウにアクセスします。[HDL コード生成] を展開して [レポート] を選択します。[トレーサビリティ レポートの生成] オプションと [リソース利用レポートを生成] オプションのボックスをオンにします。
関数
hdlsetup
を実行します。hdlsetup('gmStateSpaceHDL_ssc_model')
モデルとサブシステムのパラメーター設定を保存します。
hdlsaveparams('gmStateSpaceHDL_ssc_model');
%% Set Model 'gmStateSpaceHDL_ssc_model' HDL parameters hdlset_param('gmStateSpaceHDL_ssc_model', 'FloatingPointTargetConfiguration', hdlcoder.createFloatingPointTargetConfig('NativeFloatingPoint' ... , 'LatencyStrategy', 'MIN') ... ); hdlset_param('gmStateSpaceHDL_ssc_model', 'HDLSubsystem', 'gmStateSpaceHDL_ssc_model/HDL Subsystem'); hdlset_param('gmStateSpaceHDL_ssc_model', 'MaskParameterAsGeneric', 'on'); hdlset_param('gmStateSpaceHDL_ssc_model', 'Oversampling', 49); % Set SubSystem HDL parameters hdlset_param('gmStateSpaceHDL_ssc_model/HDL Subsystem', 'FlattenHierarchy', 'on'); hdlset_param('gmStateSpaceHDL_ssc_model/HDL Subsystem/HDL Algorithm/Mode Selection/Generate Mode Vector', 'Architecture', 'MATLAB Datapath'); % Set SubSystem HDL parameters hdlset_param('gmStateSpaceHDL_ssc_model/HDL Subsystem/HDL Algorithm/State Update/Multiply State', 'SharingFactor', 1);
検証モデル生成の設定を保存します。
HDLmodelname = 'gmStateSpaceHDL_ssc_model'; hdlset_param(HDLmodelname, 'GenerateValidationModel', 'on');
HDL コードを生成します。
makehdl('gmStateSpaceHDL_ssc_model/HDL Subsystem')
### Generating HDL for 'gmStateSpaceHDL_ssc_model/HDL Subsystem'. ### Using the config set for model gmStateSpaceHDL_ssc_model for HDL code generation parameters. ### Running HDL checks on the model 'gmStateSpaceHDL_ssc_model'. ### Begin compilation of the model 'gmStateSpaceHDL_ssc_model'... ### Applying HDL optimizations on the model 'gmStateSpaceHDL_ssc_model'... ### The code generation and optimization options you have chosen have introduced additional pipeline delays. ### The delay balancing feature has automatically inserted matching delays for compensation. ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 1: 1 cycles. ### Begin model generation. ### Model generation complete. ### Clock-rate pipelining results can be diagnosed by running this script: hdlsrc\gmStateSpaceHDL_ssc_model\... highlightClockRatePipelining.m ### To clear highlighting, click the following MATLAB script: hdlsrc\gmStateSpaceHDL_ssc_model\clearhighlighting.m ### Generating new validation model: gm_gmStateSpaceHDL_ssc_model_vnl. ### Validation model generation complete. ### Begin VHDL Code Generation for 'gmStateSpaceHDL_ssc_model'. ### MESSAGE: The design requires 49 times faster clock with respect to the base rate = 3.33333e-06. ### Working on gmStateSpaceHDL_ssc_model/HDL Subsystem/HDL Algorithm/Mode Iteration Manager/Compare To Constant as hdlsrc\... gmStateSpaceHDL_ssc_model\Compare_To_Constant.vhd. ### Working on gmStateSpaceHDL_ssc_model/HDL Subsystem/nfp_mul_single as hdlsrc\gmStateSpaceHDL_ssc_model\nfp_mul_single.vhd. ### Working on gmStateSpaceHDL_ssc_model/HDL Subsystem/nfp_add_single as hdlsrc\gmStateSpaceHDL_ssc_model\nfp_add_single.vhd. ### Working on dot_product_2 as hdlsrc\gmStateSpaceHDL_ssc_model\dot_product_2.vhd. ### Working on dot_product_1 as hdlsrc\gmStateSpaceHDL_ssc_model\dot_product_1.vhd. ### Working on dot_product_1 as hdlsrc\gmStateSpaceHDL_ssc_model\dot_product_1_block.vhd. ### Working on gmStateSpaceHDL_ssc_model/HDL Subsystem/nfp_relop_single as hdlsrc\gmStateSpaceHDL_ssc_model\nfp_relop_single.vhd. ### Working on gmStateSpaceHDL_ssc_model/HDL Subsystem/nfp_uminus_single as hdlsrc\gmStateSpaceHDL_ssc_model\nfp_uminus_single.vhd. ### Working on HDL Subsystem_tc as hdlsrc\gmStateSpaceHDL_ssc_model\HDL_Subsystem_tc.vhd. ### Working on gmStateSpaceHDL_ssc_model/HDL Subsystem as hdlsrc\gmStateSpaceHDL_ssc_model\HDL_Subsystem.vhd. ### Generating package file hdlsrc\gmStateSpaceHDL_ssc_model\HDL_Subsystem_pkg.vhd. ### Code Generation for 'gmStateSpaceHDL_ssc_model' completed. ### Creating HDL Code Generation Check Report HDL_Subsystem_report.html ### HDL check for 'gmStateSpaceHDL_ssc_model' complete with 0 errors, 2 warnings, and 2 messages. ### HDL code generation complete.
HDL コード生成レポートが開き、生成されたエラーまたは警告があれば表示されます。レポートには、FPGA 展開のリソース要件を記述するリソース利用レポートへのリンクが含まれます。
生成された HDL コードと検証モデルは、
hdlsrc\gmStateSpaceHDL_ssc_model\html
ディレクトリに保存されます。生成されたコードは、HDL_Subsystem_tc.vhd
として保存されます。指定したターゲットへの展開用に HDL コードを生成するには、HDL ワークフロー アドバイザーを使用します。
参考
ブロック
Simscape ブロック
関数
hdladvisor
(HDL Coder) |hdlsaveparams
(HDL Coder) |hdlset_param
(HDL Coder) |hdlsetup
(HDL Coder) |makehdl
(HDL Coder) |simscape.findNonlinearBlocks
|sschdladvisor
(HDL Coder)