Main Content

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

FPGA 浮動小数点ライブラリ IP マッピング

この例では、Altera や Xilinx などのベンダーから提供される IP ライブラリを統合する浮動小数点ワークフローを示します。設計を浮動小数点ライブラリにマッピングする方法の詳細については、FPGA 浮動小数点ターゲット ライブラリの HDL コードの生成を参照してください。

はじめに

浮動小数点演算をもつ設計を実装すると、より高い精度とより広いダイナミック レンジでのモデル化が可能になり、浮動小数点から固定小数点への変換をスキップできるため時間も節約できます。これは、モデルベース デザインに特に有益です。モデルベース デザインでは、高水準なアルゴリズムが浮動小数点でモデル化され、パイプラインやタイミング制約のような実装のタイミングに関する詳細がありません。しかし、演算を浮動小数点 IP モジュールにマッピングするにはそれらが必要です。HDL Coder は、それらのタイミングの詳細をもつ設計を自動的に最適化して実装し、それらを調整するためのインターフェイスを提供します。最終的に、ベンダー ライブラリの浮動小数点 IP モジュールと統合して浮動小数点演算が実装されます。

浮動小数点 IP ライブラリへの設計のマッピング

このフィールド オリエンテッド制御 (FOC) アルゴリズムの例では、このワークフローで設計を浮動小数点ライブラリにマッピングするための基本的な手順を示します。この用途の詳細については、永久磁石同期機のフィールド オリエンテッド制御の例を参照してください。

このモデルでは単精度を使用しており、加算器、乗算器、比較器、複雑な正弦関数と余弦関数など、基本的な数学演算子を実行するブロックが含まれています。

このモデルの信号レートは、20 $\mu s$ または 50 KHz でのみモデル化されています。このモデルには数値実装のみが含まれ、演算のレイテンシなどの FPGA 実装のタイミングに関する詳細はないことに注意してください。数値演算は、正弦関数と余弦関数も含め、すべて単一のサンプル タイムステップで計算されます。

open_system('hdlcoderFocCurrentSingleTargetHdl');
open_system('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Sine_Cosine');

IP ライブラリの選択

ベンダーの浮動小数点ライブラリにマッピングするために、FPGA デバイスを設定します。

hdlset_param('hdlcoderFocCurrentSingleTargetHdl', 'SynthesisToolChipFamily', 'Arria 10');
hdlset_param('hdlcoderFocCurrentSingleTargetHdl', 'SynthesisTool', 'Altera Quartus II');

ターゲット ライブラリのツールを設定します。

hdlsetuptoolpath('ToolName', 'Altera Quartus II','ToolPath', quartuspath);
hdlsetuptoolpath('ToolName', 'XILINX ISE','ToolPath', isepath);
Prepending following Altera Quartus II path(s) to the system path:
/mathworks/hub/share/apps/HDLTools/Altera/18.1-mw-0/Linux/quartus/bin
Setting QUARTUS_64BIT environment variable to 1 to turn on 64-bit processing.
Setting XILINX environment variable to:
/mathworks/hub/share/apps/HDLTools/Xilinx_ISE/14.7-mw-0/Lin/ISE_DS/ISE
Setting XILINX_EDK environment variable to:
/mathworks/hub/share/apps/HDLTools/Xilinx_ISE/14.7-mw-0/Lin/ISE_DS/EDK
Setting XILINX_PLANAHEAD environment variable to:
/mathworks/hub/share/apps/HDLTools/Xilinx_ISE/14.7-mw-0/Lin/ISE_DS/PlanAhead
Prepending following XILINX ISE path(s) to the system path:
/mathworks/hub/share/apps/HDLTools/Xilinx_ISE/14.7-mw-0/Lin/ISE_DS/ISE/bin/lin64:/mathworks/hub/share/apps/HDLTools/Xilinx_ISE/14.7-mw-0/Lin/ISE_DS/EDK/bin/lin64:/mathworks/hub/share/apps/HDLTools/Xilinx_ISE/14.7-mw-0/Lin/ISE_DS/PlanAhead/bin

quartuspath と isepath は、環境内の合成ツールのパスを返します。環境内でのツールの設定方法については、hdlsetuptoolpathを参照してください。

最初の手順は、ベンダー ライブラリの選択です。Xilinx デバイスの場合は 'XILINXLOGICORE' を使用し、Altera デバイスの場合は 'ALTERAFPFUNCTIONS' または 'ALTFP' を選択できます。サポートされるデバイスについては、ライブラリのドキュメントを確認してください。

ALTERAFPFUNCTIONS の浮動小数点ターゲット構成オブジェクトを作成します。

fc = hdlcoder.createFloatingPointTargetConfig('ALTERAFPFUNCTIONS');

構成オブジェクトをモデルに対して設定します。

hdlset_param('hdlcoderFocCurrentSingleTargetHdl', 'FloatingPointTargetConfiguration', fc);

生成されたコードを QuestaSim でコンパイルしてシミュレートするには、Altera シミュレーション ライブラリをコンパイルし、そのパスをモデルに対して SimulationLibPath パラメーターで設定しなければなりません。詳細については、ツールの設定を確認してください。alterasimulationlibpath は、環境内のコンパイルされた Altera シミュレーション ライブラリのパスを返します。

hdlset_param('hdlcoderFocCurrentSingleTargetHdl', 'SimulationLibPath', alterasimulationlibpath);

Altera Megafunction (ALTERAFPFUNCTIONS) ライブラリでは、特定のターゲット周波数の IP モジュールを生成できます。この例では、ターゲット周波数は 250 MHz に設定されています。

hdlset_param('hdlcoderFocCurrentSingleTargetHdl', 'TargetFrequency', 250);

IP マッピングのための再モデル化

コードを生成します。

try
    makehdl('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control');
catch me
    disp(me.message);
end
### Generating HDL for 'hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocCurrentSingleTargetHdl', { 'HDL Code Generation' } )">hdlcoderFocCurrentSingleTargetHdl</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderFocCurrentSingleTargetHdl'.
### Begin compilation of the model 'hdlcoderFocCurrentSingleTargetHdl'...
### Creating HDL Code Generation Check Report file:///tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocCurrentSingleTargetHdl' complete with 1 errors, 0 warnings, and 0 messages.

For the block 'hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate_Output/Saturation_Dynamic'
   This block is not supported for Altera Megafunction mapping.

このエラー メッセージは、Dynamic Saturation ブロックを浮動小数点ライブラリにマッピングできないことを示しています。

hilite_system('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate_Output/Saturation_Dynamic');

浮動小数点ライブラリ マッピングでサポートされるブロックは、HDL Coder でサポートされるすべてのブロックのうちの一部です。たとえば、Saturation Dynamic は固定小数点でサポートされるブロックですが、浮動小数点マッピングではサポートされません。このような場合は、サポートされるサブセットの部分グラフとしてブロックを記述できます。浮動小数点ライブラリにマッピングできるブロックとモードの完全な一覧については、FPGA 浮動小数点ライブラリのマッピングに対する HDL Coder のサポートを確認してください。

この例では、Dynamic Saturation ブロックを含む Saturate_Output サブシステムを代わりの実装に置き換えます。

open_system('floatFocUtils');
blocksToReplace = {'hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate_Output', ...
    'hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/Q_Current_Control/Saturate_Output'...
    };
position1 = get_param(blocksToReplace{1}, 'Position');
delete_block(blocksToReplace{1});
add_block('floatFocUtils/Saturate_Output_Detailed', ...
    blocksToReplace{1}, 'Position', position1);
position2 = get_param(blocksToReplace{2}, 'Position');
delete_block(blocksToReplace{2});
add_block('floatFocUtils/Saturate_Output_Detailed', ...
    blocksToReplace{2}, 'Position', position2);
bdclose('floatFocUtils');
open_system(blocksToReplace{1}, 'force');

IP のレイテンシを解決するためのクロック レート パイプラインの適用

コードの生成をもう一度試します。

try
    makehdl('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control');
catch me
    disp(me.message);
end
### Generating HDL for 'hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocCurrentSingleTargetHdl', { 'HDL Code Generation' } )">hdlcoderFocCurrentSingleTargetHdl</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderFocCurrentSingleTargetHdl'.
### Begin compilation of the model 'hdlcoderFocCurrentSingleTargetHdl'...
### Applying HDL optimizations on the model 'hdlcoderFocCurrentSingleTargetHdl'...
### <a href="matlab:configset.internal.open('hdlcoderFocCurrentSingleTargetHdl','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' inserts pipeline registers at input or output or both ports of certain blocks to create patterns that efficiently map blocks to DSP units on the target FPGA device. To enable adaptive pipelining, please set the option to 'On'.
### <a href="matlab:configset.internal.open('hdlcoderFocCurrentSingleTargetHdl','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware.  To disable pipeline insertion for mapping lookup tables to RAM, please set the option to 'Off'.
### Using /mathworks/hub/share/apps/HDLTools/Altera/18.1-mw-0/Linux/quartus/bin/../sopc_builder/bin/ip-generate for the selected floating point IP library.
### Generating Altera(R) megafunction: alterafpf_add_single for target frequency of 250 MHz.
### alterafpf_add_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_mul_single for target frequency of 250 MHz.
### alterafpf_mul_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_sub_single for target frequency of 250 MHz.
### alterafpf_sub_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_neq_single_NEQ for target frequency of 250 MHz.
### alterafpf_neq_single_NEQ takes 0 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_le_single_LE for target frequency of 250 MHz.
### alterafpf_le_single_LE takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_ge_single_GE for target frequency of 250 MHz.
### alterafpf_ge_single_GE takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_gt_single_GT for target frequency of 250 MHz.
### alterafpf_gt_single_GT takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_lt_single_LT for target frequency of 250 MHz.
### alterafpf_lt_single_LT takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_trig_single_SIN for target frequency of 250 MHz.
### alterafpf_trig_single_SIN takes 26 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_trig_single_COS for target frequency of 250 MHz.
### alterafpf_trig_single_COS takes 25 cycles.
### Done.
### Creating HDL Code Generation Check Report file:///tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocCurrentSingleTargetHdl' complete with 5 errors, 0 warnings, and 2 messages.
### HDL check for 'hdlcoderFocCurrentSingleTargetHdl' complete with 5 errors, 0 warnings, and 2 messages.
Target-specific code generation cannot complete for the following reason(s): 'Cannot allocate 1 delays for hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate_relop_lower.'.

これらのエラー メッセージは、フィードバック ループでモデル化されている遅延が置き換え対象の等価な浮動小数点 IP モジュールのレイテンシよりも少ないため、それらのループ内の演算を HDL Coder で浮動小数点 IP モジュールに置き換えることができないことを示しています。浮動小数点 IP モジュールは、パイプライン方式のブロックとして実装されます。一部のモジュールには最小レイテンシの要件があります。フィードバック ループのレイテンシが変わると正しい実装が生成されないため、HDL Coder では、そのようなフィードバック ループ内のレイテンシは追加できないようになっています。

このエラーは、フィードバック ループ内の加算器に複数のサイクルが必要であるのに対し、ループに遅延が 1 つしかないことを示しています。

hilite_system('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Add');

この状況に対処する方法として、いくつかの選択肢があります。

  • ターゲット周波数を小さくすると、パイプラインの深さの要件が軽減されることがあります。ただし、この場合、設計内の他のすべての IP モジュールも遅くなる可能性があります。

  • ループで使用される IP モジュールをレイテンシが小さくなるように設定します。この場合、IP モジュールの動作周波数も遅くなる可能性がありますが、影響を受けるのは指定した IP モジュールのみです。

  • クロック レート パイプラインを適用します。データ レートが FPGA のクロック レートよりも遅い場合、FPGA では、演算が終了するまでにクロック レートで複数のサイクルが必要になり、引き続き数値の整合性が維持されます。クロック レート パイプラインの詳細については、クロックレート パイプラインを参照してください。

ここでは、クロックレート パイプラインの方法を適用してフィードバック ループの問題を解決します。問題は、サンプル時間が 20 $\mu s$ で、FPGA のターゲット周波数が 250 MHz (または 4 ナノ秒) になっていることです。したがって、2 つの値の比としてオーバーサンプリング係数を 5000 と定義します。これは、元のモデルの 20 $\mu s$ のサンプル時間を使用してループに示されるような 1 単位遅延が、FPGA の 4 ナノ秒のサンプル時間では 5000 クロック レート サイクルに相当することを意味します。これらはループ内の浮動小数点 IP モジュールに対して十分です。クロック レート パイプラインは、この設計に対する理想的な方法となります。

オーバーサンプリングを 5000 に設定します。

hdlset_param('hdlcoderFocCurrentSingleTargetHdl', 'Oversampling', 5000);

コードを生成します。

makehdl('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control');
### Generating HDL for 'hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocCurrentSingleTargetHdl', { 'HDL Code Generation' } )">hdlcoderFocCurrentSingleTargetHdl</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderFocCurrentSingleTargetHdl'.
### Begin compilation of the model 'hdlcoderFocCurrentSingleTargetHdl'...
### Applying HDL optimizations on the model 'hdlcoderFocCurrentSingleTargetHdl'...
### <a href="matlab:configset.internal.open('hdlcoderFocCurrentSingleTargetHdl','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' inserts pipeline registers at input or output or both ports of certain blocks to create patterns that efficiently map blocks to DSP units on the target FPGA device. To enable adaptive pipelining, please set the option to 'On'.
### <a href="matlab:configset.internal.open('hdlcoderFocCurrentSingleTargetHdl','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware.  To disable pipeline insertion for mapping lookup tables to RAM, please set the option to 'Off'.
### Using /mathworks/hub/share/apps/HDLTools/Altera/18.1-mw-0/Linux/quartus/bin/../sopc_builder/bin/ip-generate for the selected floating point IP library.
### Generating Altera(R) megafunction: alterafpf_add_single for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_add_single.vhd). Reusing the generated file.
### alterafpf_add_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_mul_single for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_mul_single.vhd). Reusing the generated file.
### alterafpf_mul_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_gt_single_GT for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_gt_single_GT.vhd). Reusing the generated file.
### alterafpf_gt_single_GT takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_lt_single_LT for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_lt_single_LT.vhd). Reusing the generated file.
### alterafpf_lt_single_LT takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_sub_single for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_sub_single.vhd). Reusing the generated file.
### alterafpf_sub_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_trig_single_SIN for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_trig_single_SIN.vhd). Reusing the generated file.
### alterafpf_trig_single_SIN takes 26 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_trig_single_COS for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_trig_single_COS.vhd). Reusing the generated file.
### alterafpf_trig_single_COS takes 25 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_le_single_LE for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_le_single_LE.vhd). Reusing the generated file.
### alterafpf_le_single_LE takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_ge_single_GE for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_ge_single_GE.vhd). Reusing the generated file.
### alterafpf_ge_single_GE takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_neq_single_NEQ for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_neq_single_NEQ.vhd). Reusing the generated file.
### alterafpf_neq_single_NEQ takes 0 cycles.
### Done.
### 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: 2 cycles.
### Begin model generation.
### Model generation complete.
### Clock-rate pipelining results can be diagnosed by running this script: <a href="matlab:run('hdlsrc/hdlcoderFocCurrentSingleTargetHdl/highlightClockRatePipelining')">hdlsrc/hdlcoderFocCurrentSingleTargetHdl/highlightClockRatePipelining.m</a>
### To clear highlighting, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoderFocCurrentSingleTargetHdl/clearhighlighting.m')">hdlsrc/hdlcoderFocCurrentSingleTargetHdl/clearhighlighting.m</a>
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoderFocCurrentSingleTargetHdl_vnl')">gm_hdlcoderFocCurrentSingleTargetHdl_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoderFocCurrentSingleTargetHdl'.
### MESSAGE: The design requires 5000 times faster clock with respect to the base rate = 2e-05.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate_Output as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Saturate_Output.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/D_Current_Control.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/DQ_Current_Control.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Clarke_Transform as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Clarke_Transform.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Sine_Cosine as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Sine_Cosine.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Park_Transform as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Park_Transform.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Inverse_Park_Transform as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Inverse_Park_Transform.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Inverse_Clarke_Transform as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Inverse_Clarke_Transform.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Space_Vector_Modulation as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Space_Vector_Modulation.vhd.
### Working on FOC_Current_Control_tc as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_tc.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control.vhd.
### Generating package file hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_pkg.vhd.
### Code Generation for 'hdlcoderFocCurrentSingleTargetHdl' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/html/hdlcoderFocCurrentSingleTargetHdl_codegen_rpt.html');">hdlcoderFocCurrentSingleTargetHdl_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocCurrentSingleTargetHdl' complete with 0 errors, 0 warnings, and 4 messages.
### HDL code generation complete.

これで、設計全体が浮動小数点 IP モジュールにマッピングされました。ターゲット コード生成レポートに、浮動小数点 IP モジュールの使用についての概要が示されます。

生成されたモデルで実装の詳細を調べます。たとえば、元のモデルの hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Add に対応するサブシステム gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Add について、この演算に 3 サイクルかかることがわかります。

hilite_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Add/Add_pd1');
get_param('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Add/Add_pd1', ...
    'DelayLength')
ans =

    '3'

浮動小数点 IP モジュールによって設計全体にレイテンシが導入されるため、HDL Coder は、データの同期を維持するために必要な一致する遅延を自動的に追加します。詳細については、遅延の均衡化を参照してください。

浮動小数点 IP の共有

浮動小数点 IP モジュールは、同じ種類であれば通常は同じであるため、共有に適しています。浮動小数点 IP は一般に計算量の多い演算であり、可能であれば、それらのリソースを共有して面積のフットプリントを削減することが推奨されます。HDL Coder は、同じサブシステム内のリソースを共有します。より多くのリソースが共有されるように、サブシステムの階層をフラット化し、最上位のネットワークでリソース共有係数を設定します。

hdlset_param('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control', 'FlattenHierarchy', 'on');
hdlset_param('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control', 'SharingFactor', 4);

コードを生成します。

makehdl('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control');
### Generating HDL for 'hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocCurrentSingleTargetHdl', { 'HDL Code Generation' } )">hdlcoderFocCurrentSingleTargetHdl</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderFocCurrentSingleTargetHdl'.
### Begin compilation of the model 'hdlcoderFocCurrentSingleTargetHdl'...
### Applying HDL optimizations on the model 'hdlcoderFocCurrentSingleTargetHdl'...
### <a href="matlab:configset.internal.open('hdlcoderFocCurrentSingleTargetHdl','AdaptivePipelining')">'AdaptivePipelining'</a> is set to 'Off' for the model. 'AdaptivePipelining' inserts pipeline registers at input or output or both ports of certain blocks to create patterns that efficiently map blocks to DSP units on the target FPGA device. To enable adaptive pipelining, please set the option to 'On'.
### <a href="matlab:configset.internal.open('hdlcoderFocCurrentSingleTargetHdl','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware.  To disable pipeline insertion for mapping lookup tables to RAM, please set the option to 'Off'.
### Generating Altera(R) megafunction: alterafpf_trig_single_COS for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_trig_single_COS.vhd). Reusing the generated file.
### alterafpf_trig_single_COS takes 25 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_trig_single_SIN for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_trig_single_SIN.vhd). Reusing the generated file.
### alterafpf_trig_single_SIN takes 26 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_mul_single for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_mul_single.vhd). Reusing the generated file.
### alterafpf_mul_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_add_single for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_add_single.vhd). Reusing the generated file.
### alterafpf_add_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_sub_single for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_sub_single.vhd). Reusing the generated file.
### alterafpf_sub_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_gt_single_GT for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_gt_single_GT.vhd). Reusing the generated file.
### alterafpf_gt_single_GT takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_lt_single_LT for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_lt_single_LT.vhd). Reusing the generated file.
### alterafpf_lt_single_LT takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_neq_single_NEQ for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_neq_single_NEQ.vhd). Reusing the generated file.
### alterafpf_neq_single_NEQ takes 0 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_ge_single_GE for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_ge_single_GE.vhd). Reusing the generated file.
### alterafpf_ge_single_GE takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_le_single_LE for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_le_single_LE.vhd). Reusing the generated file.
### alterafpf_le_single_LE takes 1 cycles.
### Done.
### Using /mathworks/hub/share/apps/HDLTools/Altera/18.1-mw-0/Linux/quartus/bin/../sopc_builder/bin/ip-generate for the selected floating point IP library.
### Begin model generation.
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoderFocCurrentSingleTargetHdl_vnl')">gm_hdlcoderFocCurrentSingleTargetHdl_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoderFocCurrentSingleTargetHdl'.
### MESSAGE: The design requires 5000 times faster clock with respect to the base rate = 2e-05.
### Working on crp_temp_shared as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared.vhd.
### Working on crp_temp_shared_block as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block.vhd.
### Working on crp_temp_shared_block1 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block1.vhd.
### Working on crp_temp_shared_block2 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block2.vhd.
### Working on crp_temp_shared_block3 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block3.vhd.
### Working on crp_temp_shared_block4 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block4.vhd.
### Working on crp_temp_shared_block5 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block5.vhd.
### Working on crp_temp_shared_block6 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block6.vhd.
### Working on crp_temp_shared_block7 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block7.vhd.
### Working on crp_temp_shared_block8 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block8.vhd.
### Working on crp_temp_shared_block9 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block9.vhd.
### Working on crp_temp_shared_block10 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block10.vhd.
### Working on crp_temp_shared_block11 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block11.vhd.
### Working on crp_temp_shared_block12 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block12.vhd.
### Working on crp_temp_shared_block13 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block13.vhd.
### Working on crp_temp_shared_block14 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block14.vhd.
### Working on FOC_Current_Control_tc as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_tc.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control.vhd.
### Generating package file hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_pkg.vhd.
### Code Generation for 'hdlcoderFocCurrentSingleTargetHdl' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/html/hdlcoderFocCurrentSingleTargetHdl_codegen_rpt.html');">hdlcoderFocCurrentSingleTargetHdl_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/Bdoc21a_1695482_245258/tp2e600926/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocCurrentSingleTargetHdl' complete with 0 errors, 0 warnings, and 3 messages.
### HDL code generation complete.

浮動小数点リソース レポートから、推定される IP モジュールが少なくなっていることを確認できます。

また、生成されたモデルを検査してリソース共有の結果を確認することもできます。

open_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control');
set_param('gm_hdlcoderFocCurrentSingleTargetHdl', 'SimulationCommand', 'update');
set_param('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control', 'ZoomFactor', 'FitSystem');
hilite_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/crp_temp_shared');
hilite_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/crp_temp_shared1');
hilite_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/crp_temp_shared2');
hilite_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/crp_temp_shared3');
hilite_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/crp_temp_shared4');
hilite_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/crp_temp_shared5');

IP ライブラリの構成

浮動小数点 IP ライブラリには、それらの IP モジュール向けのカスタマイズ オプションがいくつかあります。この節では、この構成を HDL Coder ワークフローで制御する方法を示します。

この節では、XILINX LOGICORE と 1 つの add ブロックを含む簡単なモデルを使用します。

XILINX LOGICORE の浮動小数点ターゲット構成オブジェクトを作成します。

fc = hdlcoder.createFloatingPointTargetConfig('XILINXLOGICORE');

構成オブジェクトには、ライブラリ名のほかに、ライブラリの設定と個々の IP モジュールの設定にそれぞれ対応する 2 つのフィールドがあります。

fc
fc = 

  FloatingPointTargetConfig with properties:

            Library: 'XILINXLOGICORE'
    LibrarySettings: [1x1 fpconfig.LatencyDrivenMode]
           IPConfig: [1x1 hdlcoder.FloatingPointTargetConfig.IPConfig]

LibrarySettings には、ライブラリ全体の設定が含まれます。XILINX LOGICORE ライブラリの設定を確認します。

fc.LibrarySettings
ans = 

  LatencyDrivenMode with properties:

    LatencyStrategy: 'MIN'
          Objective: 'SPEED'

これらは、このライブラリのすべての IP モジュールに適用される設定です。たとえば、Objective は、XILINX LOGICORE に対して c_optimization パラメーターを指定します。これを 'AREA' に切り替えることができます。

fc.LibrarySettings.Objective = 'AREA';
fc.LibrarySettings
ans = 

  LatencyDrivenMode with properties:

    LatencyStrategy: 'MIN'
          Objective: 'AREA'

ライブラリの設定は、ライブラリごとに異なります。特定のライブラリのすべての設定については、FPGA 浮動小数点ターゲット ライブラリの HDL コードの生成を参照してください。

IPConfig は、Latency や ExtraArgs など、個々の IP モジュールに対する設定を提供します。

前の節で示したように、レイテンシは IP マッピングの重要なプロパティです。HDL Coder は、ライブラリの設定とターゲット周波数 (該当する場合) に基づいてレイテンシを推定します。さらに、個々の IP モジュールのレイテンシを構成オブジェクトで指定することもできます。HDL Coder は、それらをコード生成と最適化に使用します。

fc.IPConfig.customize('ADDSUB', 'SINGLE', 'Latency', 11);
fc.IPConfig
ans = 

       Name                DataType             MinLatency    MaxLatency    Latency    ExtraArgs 
    ___________    _________________________    __________    __________    _______    __________

    {'ADDSUB' }    {'DOUBLE'               }        12            12          -1       {0x0 char}
    {'ADDSUB' }    {'SINGLE'               }        12            12          11       {0x0 char}
    {'CONVERT'}    {'DOUBLE_TO_NUMERICTYPE'}         6             6          -1       {0x0 char}
    {'CONVERT'}    {'NUMERICTYPE_TO_DOUBLE'}         6             6          -1       {0x0 char}
    {'CONVERT'}    {'NUMERICTYPE_TO_SINGLE'}         6             6          -1       {0x0 char}
    {'CONVERT'}    {'SINGLE_TO_NUMERICTYPE'}         6             6          -1       {0x0 char}
    {'DIV'    }    {'DOUBLE'               }        57            57          -1       {0x0 char}
    {'DIV'    }    {'SINGLE'               }        28            28          -1       {0x0 char}
    {'MUL'    }    {'DOUBLE'               }         9             9          -1       {0x0 char}
    {'MUL'    }    {'SINGLE'               }         8             8          -1       {0x0 char}
    {'RELOP'  }    {'DOUBLE'               }         2             2          -1       {0x0 char}
    {'RELOP'  }    {'SINGLE'               }         2             2          -1       {0x0 char}
    {'SQRT'   }    {'DOUBLE'               }        57            57          -1       {0x0 char}
    {'SQRT'   }    {'SINGLE'               }        28            28          -1       {0x0 char}

ADDSUB IP のレイテンシが既定値の 12 ではなく 11 になります。

その他の IP 固有の設定は、ExtraArgs で指定します。たとえば、HDL Coder は、XILINX LOGICORE を呼び出して浮動小数点 IP モジュールを生成する際、既定では DSP ブロックを使用しません。XILINX LOGICORE には、DSP の使用方法を制御するパラメーター c_mult_usage があります。DSP ブロックを使用する場合は、ExtraArgs で別の設定を渡して既定の動作をオーバーライドできます。ExtraArgs の文字列は既定の IP モジュール生成パラメーターに加えられるため、ライブラリの設定の構文に準拠しなければなりません。パラメーターの使用法と構文については、IP ライブラリのドキュメントを確認してください。

fc.IPConfig.customize('ADDSUB', 'SINGLE', 'ExtraArgs', 'CSET c_mult_usage=Full_Usage');
fc.IPConfig
ans = 

       Name                DataType             MinLatency    MaxLatency    Latency               ExtraArgs            
    ___________    _________________________    __________    __________    _______    ________________________________

    {'ADDSUB' }    {'DOUBLE'               }        12            12          -1       {0x0 char                      }
    {'ADDSUB' }    {'SINGLE'               }        12            12          11       {'CSET c_mult_usage=Full_Usage'}
    {'CONVERT'}    {'DOUBLE_TO_NUMERICTYPE'}         6             6          -1       {0x0 char                      }
    {'CONVERT'}    {'NUMERICTYPE_TO_DOUBLE'}         6             6          -1       {0x0 char                      }
    {'CONVERT'}    {'NUMERICTYPE_TO_SINGLE'}         6             6          -1       {0x0 char                      }
    {'CONVERT'}    {'SINGLE_TO_NUMERICTYPE'}         6             6          -1       {0x0 char                      }
    {'DIV'    }    {'DOUBLE'               }        57            57          -1       {0x0 char                      }
    {'DIV'    }    {'SINGLE'               }        28            28          -1       {0x0 char                      }
    {'MUL'    }    {'DOUBLE'               }         9             9          -1       {0x0 char                      }
    {'MUL'    }    {'SINGLE'               }         8             8          -1       {0x0 char                      }
    {'RELOP'  }    {'DOUBLE'               }         2             2          -1       {0x0 char                      }
    {'RELOP'  }    {'SINGLE'               }         2             2          -1       {0x0 char                      }
    {'SQRT'   }    {'DOUBLE'               }        57            57          -1       {0x0 char                      }
    {'SQRT'   }    {'SINGLE'               }        28            28          -1       {0x0 char                      }

モデルを開き、構成オブジェクトを設定します。

open_system('hdlcoder_targetIP_configuration');
hdlset_param('hdlcoder_targetIP_configuration', 'FloatingPointTargetConfiguration', fc);

合成とマッピングを実行して、DSP ブロックの使用方法を確認します。

  hWC = hdlcoder.WorkflowConfig('SynthesisTool','Xilinx ISE', ...
      'TargetWorkflow','Generic ASIC/FPGA');
  hWC.SkipPreRouteTimingAnalysis = true;
  hWC.RunTaskAnnotateModelWithSynthesisResult = false;
  hWC.GenerateRTLCode = true;
  hWC.validate;
  hdlcoder.runWorkflow('hdlcoder_targetIP_configuration/Add_Subsystem', hWC);

概要

HDL Coder は、浮動小数点でモデル化された高水準なアルゴリズムと低水準な FPGA 実装の詳細の間にあるギャップを埋めます。高速なプロトタイピングのためにプロセスが自動化されるだけでなく、高水準なアルゴリズムの設計の選択肢を効率的に調査できるようになります。この例では、合成可能な浮動小数点 HDL コードを生成するために必要な手順を示しています。この例で使用しているコマンド ライン API は、コード生成プロセス全体の自動化や設計空間の調査に役立ちます。使いやすいように、すべての API にそれぞれ対応する GUI の設定があります。API と GUI のオプションの詳細については、FPGA 浮動小数点ターゲット ライブラリの HDL コードの生成を確認してください。