Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

HDL ワークフロー スクリプトを使用した Simscape 降圧コンバーター モデルの Speedgoat IO モジュールへの展開

この例では、Simscape™ 降圧コンバーター モデルを Speedgoat IO334 Simulink® プログラム可能 I/O モジュールに展開し、そのモデルをわずか 1 マイクロ秒のサンプル ステップ サイズでリアルタイムに実行する方法を説明します。例では、DCDC コンバーターのトポロジを使用して、Speedgoat リアルタイム ターゲット マシン上でのハードウェアインザループ (HIL) シミュレーション用にパワー エレクトロニクス コンバーター モデルを準備する方法が示されます。

このワークフローを使用するには、以下を行います。

  1. Simscape HDL ワークフロー アドバイザーを使用して、モデルを HDL 互換の実装モデルに変換します。

  2. HDL ワークフロー アドバイザーを使用して、IO334 モジュール用の HDL コードと FPGA ビットストリームを生成します。

  3. Simulink Real-Time を使用して、リアルタイム モデルを Speedgoat のリアルタイム ターゲット マシンに展開します。

モデルは、HDL コード生成まではサンプル時間 1 us で実行され、その後は 50 us で、CPU でリアルタイムに実行されます。HDL コードと FPGA ビットストリームを生成するために、例では、HDL ワークフロー スクリプトをコマンド ラインから実行する方法を示します。ワークフロー アドバイザーのユーザー インターフェイスを使用してこのワークフローを実行する方法を示す例については、Speedgoat FPGA I/O モジュールへの Simscape モデルのハードウェアインザループ実装を参照してください。

セットアップと構成

アルゴリズムを Speedgoat IO モジュールに展開する前に、以下を行います。

1. HDL の言語サポートおよびサポートされるサードパーティ製ツールとハードウェアにリストされている Xilinx® Vivado® の最新バージョンをインストールします。

次に、関数hdlsetuptoolpathを使用して、インストールした Xilinx Vivado 実行可能ファイルへのツール パスを設定します。

hdlsetuptoolpath('ToolName','Xilinx Vivado','ToolPath','C:\Xilinx\Vivado\2019.2\bin\vivado.bat')

2.リアルタイム シミュレーション用に、開発環境とターゲット コンピューターの設定を行います。Get Started with Simulink Real-Time (Simulink Real-Time)を参照してください。

3.Speedgoat ライブラリおよび Speedgoat HDL Coder Integration Package をインストールします。Install Speedgoat HDL Coder Integration Packages を参照してください。

降圧コンバーター モデル

降圧コンバーター モデルを表示するには、次のコマンドを実行します。

open_system('sschdlexBuckConverterExample')

このモデルはリアルタイム展開用に変更され、sschdlex_IO334_BuckConverter という名前で保存されています。このモデルは、FPGA で実行される部分と CPU で実行される部分に分割されています。緑の FPGA サブシステム内の部分は FPGA で実行されます。このサブシステム外の部分は CPU でリアルタイムに実行されます。

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

PWM 発生器と降圧コンバーターを含む緑の FPGA サブシステム内にあるブロック用に、VHDL コードを生成します。このコードはその後、IO334 モジュール搭載の FPGA に展開されます。サブシステムの出力は DAC インターフェイスにマッピングされます。Buck Converter サブシステムからの出力信号は 10V の範囲内でスケーリングされ、uint16 データ型を使用するように変換されます。CPU での出力信号をログに記録するために、50 個のサンプルが 1 つのフレームにパックされます。

open_system('sschdlex_IO334_BuckConverter/FPGA')

降圧コンバーター モデルを確認するには、Buck Converter サブシステムをダブルクリックします。降圧コンバーターは、出力において入力電圧を降下させるパワー コンバーター モデルです。出力における電圧は、デューティ比 D によって降下します。出力電圧 Vout は、Vin/D として計算されます。

open_system('sschdlex_IO334_BuckConverter/FPGA/Buck Converter')

Simscape モデルのデスクトップ シミュレーションの実行

シミュレーション入力は、0.2 から 0.8 までのデューティ比ステップ波形です。DC 入力電圧、PWM 周波数、およびデューティ比を含む入力信号が、モデルの最上位レベルで生成されます。Simscape モデルのサンプル時間は 1us に設定されています。信号のログがモデルの最上位レベルで有効になっています。

sim('sschdlex_IO334_BuckConverter')

% Display the buck converter output signals in SDI
Simulink.sdi.clearAllSubPlots
Simulink.sdi.setSubPlotLayout(3,1);

allIDs2 = Simulink.sdi.getAllRunIDs;
runID2 = allIDs2(end);
run2 = Simulink.sdi.getRun(runID2);
run2.name = 'Simscape Desktop Simulation';

run2.getAllSignals;
plotOnSubPlot(run2.getSignalsByName('Vout'),1,1,true);
plotOnSubPlot(run2.getSignalsByName('Iinductor'),2,1,true);
plotOnSubPlot(run2.getSignalsByName('Vdiode'),3,1,true);

Simulink.sdi.view;

HDL 実装モデルの生成

HDL コード生成との互換性のために、Simscape HDL ワークフロー アドバイザーを実行して HDL 実装モデルを生成します。

Simscape ソルバーは、サンプル ステップごとに 2 回反復して実行するように設定されています。Simscape HDL ワークフロー アドバイザーは、確定的なリアルタイム動作のために、次の手順でこのソルバー設定を使用します。

set_param('sschdlex_IO334_BuckConverter/FPGA/Buck Converter/Solver Configuration','DoFixedCost','on')
set_param('sschdlex_IO334_BuckConverter/FPGA/Buck Converter/Solver Configuration','MaxNonlinIter','2')

アドバイザーを開くには、モデルに対して関数sschdladvisorを実行します。

sschdladvisor('sschdlex_IO334_BuckConverter')

実装モデルを生成するには、Simscape HDL ワークフロー アドバイザーで、タスクの既定の設定を維持し、タスクを実行します。[すべて実行] ボタンをクリックして、アドバイザーでタスクを実行します。[実装モデルを生成] タスクでモデルへのリンクを確認します。このモデルは元のモデルと同じ名前をもち、接頭辞 gmStateSpaceHDL_ が付きます。

HDL コード生成用の実装モデルの準備

実装モデルを開くには、[実装モデルを生成] タスクのリンクをクリックします。

open_system('gmStateSpaceHDL_sschdlex_IO334_BuckConverte');
set_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'SimulationCommand', 'Update')

このモデルには、元の降圧コンバーター モデルの線形スイッチド システム Simulink 置換モデルが含まれています。Simscape モデルが置き換えられたことがわかります。

open_system('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Buck Converter');

実装モデルは、Simscape サブシステムを、状態空間計算を実行する HDL 互換のアルゴリズムに置き換えます。このサブシステム内を移動すると、状態空間方程式をモデル化するいくつかの遅延、加算器、および Matrix Multiply ブロックが確認されます。このサブシステム内の From ブロックと Goto ブロックは、元のモデルと同じ入力を HDL Subsystem に提供します。

open_system('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Buck Converter/HDL Subsystem/HDL Algorithm')

降圧コンバーター出力信号のデータ型は、HDL コード生成用に単精度浮動小数点に設定されています。

set_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Signal Specification','OutDataTypeStr','single');
set_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Signal Specification1','OutDataTypeStr','single');
set_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Signal Specification2','OutDataTypeStr','single');
set_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Signal Specification3','OutDataTypeStr','single');
set_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Signal Specification4','OutDataTypeStr','single');

HDL 実装モデルのデスクトップ シミュレーションの実行と HDL アルゴリズムの検証

降圧コンバーターの線形スイッチド システムの状態空間モデルを Simulink でシミュレートし、信号をシミュレーション データ インスペクターに表示することができます。実行の比較により、数値結果が一致することが示されます。

HDL 実装モデルをシミュレートします。

sim('gmStateSpaceHDL_sschdlex_IO334_BuckConverte')
%
% Display output signals of buck converter Simscape model in Simulation
% Data Inspector.
Simulink.sdi.clearAllSubPlots
Simulink.sdi.setSubPlotLayout(3,1);

allIDs2 = Simulink.sdi.getAllRunIDs;
runID2 = allIDs2(end);
run2 = Simulink.sdi.getRun(runID2);
run2.name = 'HDL Desktop Simulation';

run2.getAllSignals;
plotOnSubPlot(run2.getSignalsByName('Vout'),1,1,true);
plotOnSubPlot(run2.getSignalsByName('Iinductor'),2,1,true);
plotOnSubPlot(run2.getSignalsByName('Vdiode'),3,1,true);

Simulink.sdi.view;

HDL 実装モデルが元の Simscape モデルと一致することを確認するために、状態空間検証モデルを生成します。[実装モデルを生成] タスクで、[実装モデルの検証ロジックの生成] チェック ボックスをオンにして、このタスクを実行します。モデルをシミュレートしてもアサーションは表示されませんが、これは、数値結果が一致することを示します。HDL 実装モデルの Simscape アルゴリズムに対する検証を参照してください。

HDL ワークフロー アドバイザー

HDL ワークフロー アドバイザーは、HDL コード生成および FPGA 設計のプロセスをサポートします。このアドバイザーを使用して以下のことを行います。

  • モデルに HDL コード生成との互換性があるか確認し、非互換の設定を修正。

  • HDL コード、テスト ベンチ、およびそのコードとテスト ベンチをビルドして実行するスクリプトを生成。

  • 合成およびタイミングの解析を実行し、生成されたコードを SoC、FPGA、Speedgoat I/O のモジュールに展開。

モデル内の FPGA サブシステム用にアドバイザーを実行します。モデル内のサブシステム用に HDL ワークフロー アドバイザーを開くには、関数hdladvisorを使用します。以下に例を示します。

hdladvisor('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA')

アドバイザー内のタスクの詳細については、該当するタスクを右クリックして [これはなに?] を選択します。HDL ワークフロー アドバイザーのご利用の前にを参照してください。

Simulink Real-Time インターフェイス モデルを生成するワークフロー スクリプトの実行

ラピッド プロトタイピングのために、HDL ワークフロー アドバイザーの設定をスクリプトにエクスポートします。このスクリプトは、コマンド ラインから実行する MATLAB® ファイルです。スクリプトを変更して実行するか、設定を HDL ワークフロー アドバイザーのユーザー インターフェイスにインポートすることができます。スクリプトを使用した HDL ワークフローの実行を参照してください。

この例では、HDL ワークフロー スクリプトの実行方法を説明します。Simulink Real-Time インターフェイス モデルを生成するには、次の MATLAB スクリプトを開いて実行します。

edit('hdlworkflow_buck_IO334')
%% ------------------------------------------------------------------------
% This script contains the model, target settings, interface mapping, and 
% the Workflow Configuration settings for generating HDL code for the HDL
% implementation model generated for the buck converter model, and for
% deploying the code to the FPGA on board the Speedgoat IO334-325K module.
%% -----------------------------------------------------------------------

%% Set Parameters for HDL Code Generation 

% Model HDL parameters
% -------------------------------------------------------------------------
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'FloatingPointTargetConfiguration', hdlcoder.createFloatingPointTargetConfig('NativeFloatingPoint', 'LatencyStrategy', 'MIN'));
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'HDLSubsystem', 'gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA');
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'Oversampling', 100);
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'ScalarizePorts', 'DUTLevel');
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'TargetFrequency', 200);
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'Workflow', 'Simulink Real-Time FPGA I/O');
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'TargetPlatform', 'Speedgoat IO334-325k');
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'AdaptivePipelining', 'off');

%% Map DUT Ports to Target Interfaces

% Input port mapping
% -------------------------------------------------------------------------
% All input signals to the "FPGA" subsystem are mapped to the PCIe
% interface. I.e. these signals will be transferred from the CPU of the
% real-time target machine to the IO334 FPGA over the PCIe bus.

hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/PWM Period', 'IOInterface', 'PCIe Interface');
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Duty Cycle', 'IOInterface', 'PCIe Interface');
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DC Input Voltage', 'IOInterface', 'PCIe Interface');

% Output port mapping
% -------------------------------------------------------------------------
% The scaled output signals of the converter are mapped to the analog
% output interface of the IO334. 

hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC V Out', 'IOInterface', 'IO334 AO Data [0:15]');
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC V Out', 'IOInterfaceMapping', 'Channel 01');

hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC V Diode', 'IOInterface', 'IO334 AO Data [0:15]');
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC V Diode', 'IOInterfaceMapping', 'Channel 02');

hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC I Inductor', 'IOInterface', 'IO334 AO Data [0:15]');
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC I Inductor', 'IOInterfaceMapping', 'Channel 03');

hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC Trigger', 'IOInterface', 'IO334 AO Trigger [0:1]');
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC Trigger', 'IOInterfaceMapping', 'Channel 01 to 08');

% The signal frames are mapped to PCIe registers. They are read by the CPU for data logging.
hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/PCIe Out', 'IOInterface', 'PCIe Interface');

%% Workflow Configuration Settings

% HDL Workflow Advisor is opened with the following settings.
hWC = hdlcoder.WorkflowConfig('SynthesisTool','Xilinx Vivado','TargetWorkflow','Simulink Real-Time FPGA I/O');

% Specify the top level project directory.
hWC.ProjectFolder = 'hdl_prj';
hWC.ReferenceDesignToolVersion = '2019.2';

% Set Workflow tasks to run.
hWC.RunTaskGenerateRTLCodeAndIPCore = true;
hWC.RunTaskCreateProject = true;
hWC.RunTaskBuildFPGABitstream = true;
hWC.RunTaskGenerateSimulinkRealTimeInterface = true;

%% Run the Workflow
hdlcoder.runWorkflow('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA', hWC);

リアルタイム シミュレーション用の Simulink Real-Time インターフェイス モデルの準備

ワークフロー スクリプトを実行すると、RTL コードと IP コアが生成され、Vivado プロジェクトが作成され、FPGA ビットストリームがビルドされて、その後 Simulink Real-Time インターフェイス モデルが生成されます。

Speedgoat リアルタイム ターゲット マシンにモデルを展開する前に、以下を行います。

1. Speedgoat リアルタイム ターゲット マシンの CPU で実行されているすべてのブロックのサンプル時間を 50 us に設定します (FPGA のドライバー ブロックを含む)。

generated_model = gcs;
Ts = 50e-6;
set_param([generated_model,'/FPGA'],'ts','Ts');

2.信号 PCIe_V_out_framePCIe_V_diode_frame、および PCIe_I_inductor_frame に対して、シミュレーション データ インスペクターの設定 [入力処理] を [Columns as channels (frame based)] に設定します。File Log ブロックのマスク内で、ログの記号を右クリックして [計測のプロパティ] ダイアログ ボックスに移動します。ログの記号を表示するために、モデルの更新が必要な場合があります。

set_param(generated_model, 'SimulationCommand', 'update');

あるいは、以下のコマンドを使用して、信号のログをフレーム ベース モードに設定することができます。

Simulink.sdi.setSignalInputProcessingMode([generated_model,'/File Log/Demux'], 1,'frame');
Simulink.sdi.setSignalInputProcessingMode([generated_model,'/File Log 1/Demux'], 1,'frame');
Simulink.sdi.setSignalInputProcessingMode([generated_model,'/File Log 2/Demux'], 1,'frame');

ターゲット マシンへの接続とリアルタイム シミュレーションの実行

これで、Speedgoat リアルタイム ターゲット マシンにモデルを展開できるようになりました。降圧コンバーター モデルは、IO334 上の FPGA に自動的に読み込まれます。

Speedgoat リアルタイム ターゲット マシンに接続します。

tg = slrealtime;
tg.connect;

モデルをビルドしてターゲット マシンにダウンロードします。

rtwbuild(generated_model);
tg.load(generated_model);

モデルの実行を開始します。

tg.start;
pause(10);

ファイルのログ ブロックは、ターゲット マシンの SSD 上に信号を保存します。モデルが停止すると、データはホスト コンピューターに自動的にアップロードされます。このデータはシミュレーション データ インスペクターで可視化されます。リアルタイム シミュレーションの結果が元の Simscape モデルと一致することを確認できます。

Simulink.sdi.setSubPlotLayout(3,1);
allIDs = Simulink.sdi.getAllRunIDs;
runID = allIDs(end);
run = Simulink.sdi.getRun(runID);
run.name = 'Real Time Simulation on IO334';
run.getAllSignals
plotOnSubPlot(run.getSignalsByName('PCIe_V_out_frame'),1,1,true);
plotOnSubPlot(run.getSignalsByName('PCIe_I_inductor_frame'),2,1,true);
plotOnSubPlot(run.getSignalsByName('PCIe_V_diode_frame'),3,1,true);
Simulink.sdi.view

あるいは、IO334 のアナログ出力で信号を測定できます。以下の図は、MATLAB 内の信号のプロットを示しています。

参考

関数

関連するトピック