最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

Simscape HDL ワークフロー アドバイザーを使用した HDL コードの生成

HDL Coder™ のライセンスをお持ちの場合は、Simscape™ HDL ワークフロー アドバイザーを使用して、FPGA プラットフォームに展開するための HDL コードを Simscape モデルから生成できます。Simscape HDL ワークフロー アドバイザーはまず、Simulink® 実装への Simscape モデルの変換を支援します。次に、HDL Coder を使用して、Simulink モデルを HDL コードに変換します。Simscape モデルを HDL コードに変換すると、以下が可能になります。

  • Simscape モデルの最適化された実装を使用することで、物理システムのシミュレーションを加速する

  • FPGA の再設定機能とパラレル化機能をラピッド プロトタイピングに使用する

  • ハードウェアインザループ (HIL) シミュレーションを使用して HDL 実装をリアルタイムでシミュレートする

Simscape HDL ワークフロー アドバイザーの手順

Simscape HDL ワークフロー アドバイザーを使用して Simscape モデルを HDL コードに変換する一般的なワークフローは、以下の手順で構成されます。

  1. Simscape モデルのベースライン結果を生成します。

  2. 関数 simscape.findNonLinearBlocks を使用して、モデルに線形ブロックまたはスイッチド線形ブロックしか含まれていないことを確認します。この関数は、Simscape モデル内の非線形ブロックを検出します。この関数は、ネットワークに含まれるブロックに基づいて、ネットワークの数とタイプ (線形、スイッチド線形、非線形) を返します。この関数はまた、非線形方程式を生成するすべてのブロックの名前も返します。非線形方程式を生成するすべてのブロックを更新するか、または置換します。

  3. 非線形方程式を生成するブロックが含まれなくなったモデルのシミュレーション結果が、ベースライン結果と一致することを確認します。

  4. Simscape ネットワークを、リアルタイム シミュレーションと HDL コード生成用に構成します。

    1. HDL ワークフローの進捗をシミュレーション時間によって監視できるブロックを追加します。

    2. サンプル時間の情報を表示します。

    3. Simscape ネットワークを、固定ステップ、固定コストのシミュレーション用に構成します。

  5. 離散モデルのシミュレーション結果が、ベースライン結果と一致することを確認します。

  6. 関数 sschdladvisor を使用して、Simscape HDL ワークフロー アドバイザーのタスクを実行します。関数 sschdladvisor は以下を行います。

    • モデルがスイッチド線形であり、リアルタイム シミュレーション用に構成されていると確認することによって、HDL コード生成の互換性をチェックする。

    • Simscape ネットワーク用の状態空間係数を抽出する。

    • HDL コード生成と互換性のある、Simscape ネットワークの実装を生成する。

  7. HDL コード生成と互換性のある実装によるシミュレーション結果が、ベースライン結果と一致することを確認します。

  8. HDL コードを生成します。

    1. 関数 hdlsetup を実行して、Simulink モデルを HDL コード生成用に構成します。関数 hdlsetup は、HDL コード生成と互換性をもつよう固定ステップ ソルバーを構成し、シミュレーションの開始時間と終了時間を指定します。

    2. モデル パラメーターと検証モデル生成の設定を保存します。

    3. 関数 makehdl を使用してコードを生成します。

制限

Simscape HDL ワークフロー アドバイザーは、以下が含まれる Simscape ネットワークでは機能しません。

  • イベント。

  • モード チャート。

  • 遅延。

  • 有効な実行時パラメーター。

  • 周期的ソース。

  • ネットワーク接続に起因する非線形性。モデルにこのような非線形性が実際に含まれている場合、関数 sschdladvisor ではすべてのタスクが最後まで実行される可能性もありますが、ゼロ値の出力が生成されます。

Simscape HDL ワークフロー アドバイザーを使用した Simscape モデル用 HDL コードの生成

この例では、Simscape HDL ワークフロー アドバイザーを使用して Simscape モデルを HDL コードに変換する方法を説明します。Simscape ネットワークと Simulink モデルをリアルタイム シミュレーションおよび HDL コード生成用に構成する方法については、モデルの準備を参照してください。Simscape HDL ワークフロー アドバイザーを使用する準備が既にできているバージョンのモデルを開くには、Simscape HDL ワークフロー アドバイザーを使用した HDL コードの生成を参照してください。

モデルの準備

FPGA 展開用の HDL コードに変換するために Simscape モデルの準備を整えるには、以下の手順に従います。

  1. モデルを開き、非表示のブロック名を表示します。MATLAB® コマンド プロンプトで、次のように入力します。

    baselineModel = 'ssc_bridge_rectifier';
    load_system(baselineModel)
    set_param(baselineModel,'HideAutomaticNames','off')
    open_system(baselineModel)

  2. ベースライン シミュレーションの結果を、モデルの変更バージョンでの結果と後で比較するには、Load Voltage スコープ ブロックのデータ点制限を取り除き、データをスコープに入力する信号について、シミュレーション データ インスペクターでのデータ ログを有効にします。

    1. スコープの [コンフィギュレーション パラメーター] で、[ログ] パラメーターについて、データ点を制限するオプションをオフにします。

    2. Load Voltage スコープ ブロックへの接続ラインを右クリックし、[選択した信号のログ] を選択します。

    ログ バッジ によって、モデル内の信号がマークされます。

  3. モデルをシミュレートし、シミュレーション データ インスペクターで結果を表示します。

    %% 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 キーを押して、シミュレーション データ インスペクターのプロットをビューに収めます。

    全波ブリッジ整流器の負荷電圧について、ベースライン シミュレーションの結果は予想どおりです。

  4. Simscape HDL ワークフロー アドバイザーは、非線形ネットワークを HDL コードに変換できません。アドバイザーを実行する前に、ネットワークを非線形にするブロックを特定して置換します。ブロックを特定するには、関数 simcape.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 ブロックが含まれていますが、これは非線形方程式を生成する周期的なソースです。

  5. Simscape ネットワーク内の Simscape Controlled Voltage Source ブロックを、ネットワーク外の Simulink Sine Wave ブロックと共に追加することで、Simscape の周期的なソースを置換できます。これには、リアルタイム シミュレーションの実行時に Sine Wave ブロックの周波数と振幅を構成できるという追加の利点があります。

    1. AC Voltage Source ブロックを削除します。

    2. Simulink Sources ライブラリから Sine Wave ブロックを追加します。

    3. Simscape の Utilities ライブラリから Simulink-PS Converter ブロックを追加します。

    4. Simscape/Foundation Library/Electrical/Electrical Sources ライブラリから Controlled Voltage Source ブロックを追加します。

    5. Sine Wave ブロックを Simulink-PS Converter ブロックに接続し、Simulink-PS Converter ブロックを Controlled Voltage Source ブロックに接続します。

  6. Simulink モデルが可変ステップ シミュレーション向けに構成されます。Sine Wave ブロックのサンプル時間を -1 (サンプル時間の継承) に指定すると、シミュレーションによって警告が生成されます。そうする代わりに、ワークスペース変数を使用して Sine Wave ブロックのサンプル時間を 0 に指定します。このワークスペース変数は、シミュレーションの速度や精度を上げるために後で調整できます。取り除いた AC Voltage Source ブロックの [ピーク振幅]sqrt(2)*120 V で、[周波数]60 Hz です。

    Sine Wave ブロックを構成します。

    1. ワークスペースでサンプル時間を定義します。

      Ts = 1e-5;

    2. [振幅] パラメーターを sqrt(2)*120 に設定します。

    3. [周波数 (rad/sec)] パラメーターを 60*2*pi に設定します。

    4. [サンプル時間] パラメーターを Ts に設定します。

  7. ネットワークを非線形にするブロックがないことを確認します。

    % 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

    モデルには、線形方程式またはスイッチド線形方程式を生成するブロックのみが含まれています。

  8. モデルをシミュレートし、結果をシミュレーション データ インスペクターでベースライン結果と比較します。

    % 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);

    結果はベースライン結果に類似しています。

  9. Simscape HDL ワークフロー アドバイザーの進捗を後で確認するには、図に示すように、Digital Clock ブロックを Simulink Sources ライブラリから追加して接続し、Display ブロックを Simulink/Sinks ライブラリから追加して接続します。Digital Clock に対して、[サンプル時間] パラメーターに Ts を指定します。

  10. モデルは現在、可変ステップ ソルバーを使用して連続時間でシミュレーションを実行しています。リアルタイム シミュレーションでは、離散時間シミュレーションのために固定ステップ ソルバーが必要です。サンプル時間の色と注釈は、モデルに連続設定が含まれているかどうかの判別に役立ちます。サンプル時間の色と注釈をオンにするには、Simulink モデル ウィンドウで、[情報表示][サンプル時間][すべて] を選択します。

    モデルのブロック線図が更新され、[サンプル時間の凡例] が表示されます。

  11. モデルをリアルタイム シミュレーション用に構成します。

    1. Simulink モデルを固定ステップ、固定コストのシミュレーション用に構成します。[モデル コンフィギュレーション パラメーター] で、[ソルバー] パラメーターについて以下のように設定します。

      • [タイプ][固定ステップ] に設定する。

      • [ソルバー][離散 (連続状態なし)] に設定する。

    2. Simscape ネットワークを固定ステップ、固定コストのシミュレーション用に構成します。Solver Configuration ブロックで以下を実行します。

      • [ローカル ソルバーを使用] を選択する。

      • [ソルバー タイプ][後退オイラー] に設定されていることを確認する。

      • [サンプル時間]Ts を指定する。

  12. モデルをシミュレートし、結果をシミュレーション データ インスペクターでベースライン結果と比較します。

    % 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 コードの生成

モデルの準備の手順を踏んで準備した Simscape モデル上か、またはコード生成用にあらかじめ準備された Simscape モデル上で Simscape HDL ワークフロー アドバイザーを実行して、HDL コードを生成します。

  1. モデルの名前を変更します。

    • HDL コード生成用に準備したモデルで作業を続行するには、モデルの名前を ssc_model に変更します。

    • あらかじめ HDL コード生成用に準備されたモデルを開いて使用するには、MATLAB コマンド プロンプトで以下を入力します。

      open_system('ssc_bridge_rectifier_hdl')

      モデルをローカル ディレクトリに ssc_model として保存します。

  2. Simscape HDL ワークフロー アドバイザーを実行します。

    sschdladvisor('ssc_model')

    Simscape HDL ワークフロー アドバイザーが開きます。

  3. コード生成互換性チェックを実行します。

    1. [コード生成互換性][ソルバーのコンフィギュレーションのチェック] を選択し、[このタスクを実行] をクリックします。

    2. [スイッチド線形のチェック] を選択し、[このタスクを実行] をクリックします。

    モデルがこれらの各チェックをパスするたびに、アドバイザーがレポートします。

  4. 状態空間係数を抽出します。[状態空間の変換][状態空間パラメーターを取得] を選択し、[このタスクを実行] をクリックします。変換には時間がかかる場合があります。モデル ウィンドウの Display ブロックは、シミュレーションの経過時間を示します。

    タスクの実行後、アドバイザーは状態空間表現の概要とパラメーターの表を表示します。

    • 状態数: 5

    • 入力数: 1

    • 出力数: 1

    • モードの数: 7

    • 離散サンプル時間: 1e-05

    パラメーターパラメーター サイズ
    A5 x 5 x 7
    B5 x 1 x 7
    F05 x 1 x 7
    C1 x 5 x 7
    D1 x 1 x 7
    Y01 x 1 x 7

    状態、モード、およびパラメーター データのサイズは、モデルを展開するために必要な FPGA リソースの量の推定に役立ちます。値が大きいほど、必要とされる FPGA リソースの量は多くなります。入出力データは、リアルタイムの展開と可視化に必要な I/O 接続の数とタイプを示します。

  5. モデルの HDL 実装を生成します。[実装モデルの生成][実装モデルを生成] を選択し、[このタスクを実行] をクリックします。

    実装モデルが生成されると、アドバイザーはタスクがパスしたことをレポートし、生成された gmStateSpaceHDL_ssc_model という名前の実装モデルへのリンクを表示します。

  6. 提示されたリンクをクリックして、生成された実装モデルを開きます。

    モデルには、以下のラベルをもつブロックが含まれています。

    • Subsystem — 準備されたモデルと、Simscape HDL ワークフロー アドバイザーによって追加された信号の経路指定が含まれている Simulink サブシステム。このモデルに対しては、アドバイザーは Sine Wave ブロック入力を HDL Subsystem へと経路指定する Goto ブロックを追加します。

    • TSubsystem ブロックから HDL Subsystem ブロックへと Sine Wave ブロック入力の経路を指定する From ブロック。

    • Rate Transition1 — さまざまなレートで動作するブロック間でデータの転送を処理します。

    • Data Type Conversion1 — HDL コード生成で必要とされるため、double データ型を single データ型に変換します。

    • HDL Subsystem —Simscape ネットワークの HDL コード生成互換バージョンが含まれる Simulink サブシステム。このモデルに対しては、アドバイザーは Sine Wave ブロック入力を HDL Subsystem ブロックへと経路指定する Goto ブロックを追加します。

    • Scope — 負荷電圧を表示します。

  7. シミュレーションをベースライン結果と比較するために HDL Subsystem を準備します。

    1. T From ブロックを削除します。

    2. Sine Wave ブロックを Subsystem ブロックからコピーして、最上位モデルに貼り付けます。

    3. Sine Wave ブロックを Rate Transition1 ブロックに接続します。

    4. ベースライン モデルが含まれる Subsystem ブロックを削除します。

    5. シミュレーション データ インスペクターで、Scope ブロックに向かう信号のデータ ログを有効にします。

  8. 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 コード生成と互換性のある実装に変換されました。

  9. 実装から HDL コードを生成します。

    1. [モデル コンフィギュレーション パラメーター] の [HDL コード生成][レポート] で、[トレーサビリティ レポートの生成] オプションと [リソース利用レポートを生成] オプションを選択します。

    2. 関数 hdlsetup を実行します。

      hdlsetup('gmStateSpaceHDL_ssc_model')
    3. モデルとサブシステムのパラメーター設定を保存します。

      hdlsaveparams('gmStateSpaceHDL_ssc_model');
      
      %% Set Model 'gmStateSpaceHDL_ssc_model' HDL parameters
      hdlset_param('gmStateSpaceHDL_ssc_model', 'FloatingPointTargetConfiguration', ...
         hdlcoder.createFloatingPointTargetConfig('NativeFloatingPoint'));
      hdlset_param('gmStateSpaceHDL_ssc_model', 'MaskParameterAsGeneric', 'on');
      hdlset_param('gmStateSpaceHDL_ssc_model', 'Oversampling', 100);
      
      % Set SubSystem HDL parameters
      hdlset_param('gmStateSpaceHDL_ssc_model/HDL Subsystem', 'FlattenHierarchy', 'on');
      
    4. 検証モデルの生成設定を保存します。

      HDLmodelname = 'gmStateSpaceHDL_ssc_model';
      hdlset_param(HDLmodelname, 'GenerateValidationModel', 'on');
    5. 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.
      ### Starting HDL check.
      ### 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 0: 1 cycles.
      ### Clock-rate pipelining results can be diagnosed by running this script:...
          C:\Temp\hdlsrc\gmStateSpaceHDL_ssc_model\highlightClockRatePipelining.m
      ### One or more feedback loops in the model are inhibiting optimizations. ...
          To highlight these loops in your model, click the following MATLAB ... 
          script: C:\Temp\hdlsrc\gmStateSpaceHDL_ssc_model\highlightFeedbackLoop.m
      ### To clear highlighting, click the following MATLAB ...
          script: C:\Temp\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 100 times faster clock ...
          with respect to the base rate = 2e-07.
      ### Working on gmStateSpaceHDL_ssc_model/HDL Subsystem/HDL Algorithm/Mode ...
          Selection/Mode Vector To Index/Subsystem1 ...
          as C:\Temp\hdlsrc\gmStateSpaceHDL_ssc_model\Subsystem1.vhd.
      ### Working on gmStateSpaceHDL_ssc_model/HDL Subsystem/nfp_mul_comp ...
          as C:\Temp\hdlsrc\gmStateSpaceHDL_ssc_model\nfp_mul_comp.vhd.
      ### Working on gmStateSpaceHDL_ssc_model/HDL Subsystem/nfp_add_comp ...
          as C:\Temp\hdlsrc\gmStateSpaceHDL_ssc_model\nfp_add_comp.vhd.
      ### Working on MultiplyAndAdd_2_entries ...
          as C:\Temp\hdlsrc\gmStateSpaceHDL_ssc_model\MultiplyAndAdd_2_entries.vhd.
      ### Working on MultiplyAndAdd_1_entries ...
          as C:\Temp\hdlsrc\gmStateSpaceHDL_ssc_model\MultiplyAndAdd_1_entries.vhd.
      ### Working on gmStateSpaceHDL_ssc_model/HDL Subsystem/nfp_uminus_comp ...
          as C:\Temp\hdlsrc\gmStateSpaceHDL_ssc_model\nfp_uminus_comp.vhd.
      ### Working on gmStateSpaceHDL_ssc_model/HDL Subsystem/nfp_relop_comp ...
          as C:\Temp\hdlsrc\gmStateSpaceHDL_ssc_model\nfp_relop_comp.vhd.
      ### Working on HDL Subsystem_tc ...
          as C:\Temp\hdlsrc\gmStateSpaceHDL_ssc_model\HDL_Subsystem_tc.vhd.
      ### Working on gmStateSpaceHDL_ssc_model/HDL Subsystem ...
          as C:\Temp\hdlsrc\gmStateSpaceHDL_ssc_model\HDL_Subsystem.vhd.
      ### Generating package file ...
          C:\Temp\hdlsrc\gmStateSpaceHDL_ssc_model\HDL_Subsystem_pkg.vhd.
      ### Generating HTML files for code generation report ...
          at gmStateSpaceHDL_ssc_model_codegen_rpt.html
      ### Creating HDL Code Generation Check Report HDL_Subsystem_report.html
      ### HDL check for 'gmStateSpaceHDL_ssc_model' complete ...
          with 0 errors, 0 warnings, and 3 messages.
      ### HDL code generation complete.

      HDL コード生成レポートが開き、生成されたエラーまたは警告があれば表示されます。レポートには、FPGA 展開のリソース要件を記述するリソース利用レポートへのリンクが含まれます。

    生成された HDL コードと検証モデルは、hdlsrc\gmStateSpaceHDL_ssc_model\html ディレクトリに保存されます。生成されたコードは HDL_Subsystem_tc.vhd として保存されます。

    指定したターゲットへの展開用に HDL コードを生成するには、HDL ワークフロー アドバイザーを使用します。

参考

ブロック

Simscape ブロック

関数

関連する例

詳細