Main Content

浮動小数点のサポート: ベクトル制御アルゴリズム

この例では、単精度と半精度の浮動小数点型を使用して実装された永久磁石同期機 (PMSM) のベクトル制御 (FOC) アルゴリズムを確認します。

はじめに

この設計の固定小数点バージョンについては、電流制御アルゴリズムを固定小数点型を使用して実装する方法について掘り下げた永久磁石同期機のベクトル制御で確認しました。HDL コードを生成する前にモデルを固定小数点に変換しました。

単精度の浮動小数点型を設計で使用し、固定小数点型に変換せずにそのまま HDL コードを生成できます。この例では、固定小数点モデル hdlcoderFocCurrentFixptHdl の単精度と半精度の浮動小数点のバリアントからコードを生成する際の設計の考慮事項を示します。

テストベンチ モデル hdlcoderFocCurrentTestBench には、固定小数点または浮動小数点で実装された DUT を指す参照ブロックがあります。

ネイティブ浮動小数点のサポートの主な特徴

  • FPGA と ASIC の設計に対応したベンダーやターゲットに依存しない RTL

  • 丸めモード、データ型 inf と nan、非正規数に対するオプションのサポートを含む IEEE-754 の全機能のサポート。

  • 広範な Math ブロック (add,mul,div,recip,log,exp,sqrt,rsqrt) と Trigonometric ブロック (sin, cos, sincos, atan, atan2) のサポート。

浮動小数点型を使用する理由

次の理由から、固定小数点に変換せずに、浮動小数点で開始して浮動小数点のまま HDL をターゲットにする場合があります。

  • アルゴリズムに大規模または未知のダイナミック レンジがある (フィードバック ループ内の積分器など)

  • アルゴリズムで固定小数点での設計が難しい演算を使用している (atan2 など)

hdlcoderFocCurrentFloatHDL.slx の固定小数点バージョンでは、アルゴリズムの数値的な動作を維持するために、固定小数点の丸めと飽和の判定が複数行われていることがわかります。たとえば、ブロック hdlcoderFocCurrentFixptHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate は Saturation ブロックであり、ループ内での累積によって結果がオーバーフローしないように積分器のループに配置されています。

open_system('hdlcoderFocCurrentFixptHdl');
open_system('hdlcoderFocCurrentFixptHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate');

固定小数点の変換タスクは、アルゴリズムの複数のレベルでの再検証を伴うため、数週間から数か月かかることがあります。また、非常に高い精度が求められる一部のミッション クリティカルなアプリケーションでは受け入れられない、望ましくない精度の低下につながることもあります。

このような状況では、HDL Coder で利用可能なネイティブ浮動小数点合成機能を使用することを選択できます。

単精度の FOC モデル

単精度バージョンのアルゴリズムを開くには、次のコマンドを実行します。

load_system('hdlcoderFocCurrentFloatHdl');
open_system('hdlcoderFocCurrentFloatHdl/FOC_Current_Control')

浮動小数点バージョンのモデル hdlcoderFocCurrentFloatHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control を見ればわかるように、固定小数点のアルゴリズムに比べ、単精度のモデルには丸めと飽和の追加のブロックや設定が必要ありません。

open_system('hdlcoderFocCurrentFloatHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control')

シミュレーションで動作を検証するには、次のコマンドを実行します。

hasSimPowerSystems = license ('test', 'Power_System_Blocks');
if hasSimPowerSystems
   open_system('hdlcoderFocCurrentTestBench')

   % set single-precision floating-point model in the testbench
   set_param('hdlcoderFocCurrentTestBench/Controller', 'ModelName', 'hdlcoderFocCurrentFloatHdl');

   set_param('hdlcoderFocCurrentTestBench','IgnoredZcDiagnostic','none');
   sim('hdlcoderFocCurrentTestBench')
   set_param('hdlcoderFocCurrentTestBench','IgnoredZcDiagnostic','warn');
end

HDL コードを生成し、コントローラーの生成されたコードを確認できます。

hdlset_param('hdlcoderFocCurrentFloatHdl', 'FloatingPointTargetConfiguration', hdlcoder.createFloatingPointTargetConfig('NATIVEFLOATINGPOINT'));
makehdl('hdlcoderFocCurrentFloatHdl/FOC_Current_Control');
### Begin compilation of the model 'hdlcoderFocCurrentFloatHdl'...
### Generating HDL for 'hdlcoderFocCurrentFloatHdl/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocCurrentFloatHdl', { 'HDL Code Generation' } )">hdlcoderFocCurrentFloatHdl</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderFocCurrentFloatHdl'.
### Applying HDL optimizations on the model 'hdlcoderFocCurrentFloatHdl'...
### Begin model generation.
### Model generation complete.
### Clock-rate pipelining results can be diagnosed by running this script: <a href="matlab:run('hdlsrc/hdlcoderFocCurrentFloatHdl/highlightClockRatePipelining')">hdlsrc/hdlcoderFocCurrentFloatHdl/highlightClockRatePipelining.m</a>
### To highlight blocks that obstruct distributed pipelining, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoderFocCurrentFloatHdl/highlightDistributedPipeliningBarriers')">hdlsrc/hdlcoderFocCurrentFloatHdl/highlightDistributedPipeliningBarriers.m</a>
### To clear highlighting, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoderFocCurrentFloatHdl/clearhighlighting.m')">hdlsrc/hdlcoderFocCurrentFloatHdl/clearhighlighting.m</a>
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoderFocCurrentFloatHdl_vnl')">gm_hdlcoderFocCurrentFloatHdl_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoderFocCurrentFloatHdl'.
### MESSAGE: The design requires 800 times faster clock with respect to the base rate = 2e-05.
### Working on hdlcoderFocCurrentFloatHdl/FOC_Current_Control/nfp_relop_single as hdlsrc/hdlcoderFocCurrentFloatHdl/nfp_relop_single.vhd.
### Working on hdlcoderFocCurrentFloatHdl/FOC_Current_Control/nfp_relop_single as hdlsrc/hdlcoderFocCurrentFloatHdl/nfp_relop_single_block.vhd.
### Working on hdlcoderFocCurrentFloatHdl/FOC_Current_Control/nfp_sincos_single as hdlsrc/hdlcoderFocCurrentFloatHdl/nfp_sincos_single.vhd.
### Working on hdlcoderFocCurrentFloatHdl/FOC_Current_Control/nfp_relop_single as hdlsrc/hdlcoderFocCurrentFloatHdl/nfp_relop_single_block1.vhd.
### Working on hdlcoderFocCurrentFloatHdl/FOC_Current_Control/nfp_relop_single as hdlsrc/hdlcoderFocCurrentFloatHdl/nfp_relop_single_block2.vhd.
### Working on hdlcoderFocCurrentFloatHdl/FOC_Current_Control/nfp_add_single as hdlsrc/hdlcoderFocCurrentFloatHdl/nfp_add_single.vhd.
### Working on hdlcoderFocCurrentFloatHdl/FOC_Current_Control/nfp_gain_pow2_single as hdlsrc/hdlcoderFocCurrentFloatHdl/nfp_gain_pow2_single.vhd.
### Working on hdlcoderFocCurrentFloatHdl/FOC_Current_Control/nfp_sub_single as hdlsrc/hdlcoderFocCurrentFloatHdl/nfp_sub_single.vhd.
### Working on hdlcoderFocCurrentFloatHdl/FOC_Current_Control/nfp_add2_single as hdlsrc/hdlcoderFocCurrentFloatHdl/nfp_add2_single.vhd.
### Working on hdlcoderFocCurrentFloatHdl/FOC_Current_Control/nfp_mul_single as hdlsrc/hdlcoderFocCurrentFloatHdl/nfp_mul_single.vhd.
### Working on hdlcoderFocCurrentFloatHdl/FOC_Current_Control/nfp_uminus_single as hdlsrc/hdlcoderFocCurrentFloatHdl/nfp_uminus_single.vhd.
### Working on hdlcoderFocCurrentFloatHdl/FOC_Current_Control/nfp_relop_single as hdlsrc/hdlcoderFocCurrentFloatHdl/nfp_relop_single_block3.vhd.
### Working on FOC_Current_Control_tc as hdlsrc/hdlcoderFocCurrentFloatHdl/FOC_Current_Control_tc.vhd.
### Working on hdlcoderFocCurrentFloatHdl/FOC_Current_Control as hdlsrc/hdlcoderFocCurrentFloatHdl/FOC_Current_Control.vhd.
### Generating package file hdlsrc/hdlcoderFocCurrentFloatHdl/FOC_Current_Control_pkg.vhd.
### Code Generation for 'hdlcoderFocCurrentFloatHdl' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/Bdoc22a_1859087_173955/tp0f1f74e6/ex95119120/hdlsrc/hdlcoderFocCurrentFloatHdl/html/hdlcoderFocCurrentFloatHdl_codegen_rpt.html');">hdlcoderFocCurrentFloatHdl_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/Bdoc22a_1859087_173955/tp0f1f74e6/ex95119120/hdlsrc/hdlcoderFocCurrentFloatHdl/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocCurrentFloatHdl' complete with 0 errors, 0 warnings, and 3 messages.
### HDL code generation complete.

半精度の FOC モデル

必要なダイナミック レンジが狭いアプリケーションには、half 型を使用できます。固定小数点型を使用するように設計を変換する必要はありません。half 型を使用すると、メモリの消費がはるかに少なくなり、レイテンシが低くなり、FPGA リソースが節約されます。

半精度の浮動小数点型には、ハードウェアの観点で次の利点があります。

  • レイテンシが低い

  • 面積が小さい

  • 速度が速い

  • 16 ビットの浮動小数点の動作が最適な格納に役立つ

  • 同じサイズの整数データ型や固定小数点データ型に比べてダイナミック レンジが広い

半精度型には、単精度および倍精度の浮動小数点型と同じ特徴があります。サポートされる演算子には、以下を含みます。基本的な算術演算子 (例: Add/Sub、Mul、Div/Recip) と Gain、関係演算子、データ型変換。

load_system('hdlcoderFocCurrentFloatHalfHdl');
open_system('hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control')

シミュレーションで動作を検証するには、次のコマンドを実行します。

hasSimPowerSystems = license ('test', 'Power_System_Blocks');
if hasSimPowerSystems
   open_system('hdlcoderFocCurrentTestBench')

   % set half-precision floating-point model in the testbench
   set_param('hdlcoderFocCurrentTestBench/Controller', 'ModelName', 'hdlcoderFocCurrentFloatHalfHdl');

   set_param('hdlcoderFocCurrentTestBench','IgnoredZcDiagnostic','none');
   sim('hdlcoderFocCurrentTestBench')
   set_param('hdlcoderFocCurrentTestBench','IgnoredZcDiagnostic','warn');
end

HDL コードを生成し、コントローラーの生成されたコードを確認できます。

hdlset_param('hdlcoderFocCurrentFloatHalfHdl', 'FloatingPointTargetConfiguration', hdlcoder.createFloatingPointTargetConfig('NATIVEFLOATINGPOINT'));
makehdl('hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control');
### Generating HDL for 'hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocCurrentFloatHalfHdl', { 'HDL Code Generation' } )">hdlcoderFocCurrentFloatHalfHdl</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderFocCurrentFloatHalfHdl'.
### Begin compilation of the model 'hdlcoderFocCurrentFloatHalfHdl'...
### Applying HDL optimizations on the model 'hdlcoderFocCurrentFloatHalfHdl'...
### Begin model generation.
### Model generation complete.
### Clock-rate pipelining results can be diagnosed by running this script: <a href="matlab:run('hdlsrc/hdlcoderFocCurrentFloatHalfHdl/highlightClockRatePipelining')">hdlsrc/hdlcoderFocCurrentFloatHalfHdl/highlightClockRatePipelining.m</a>
### To highlight blocks that obstruct distributed pipelining, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoderFocCurrentFloatHalfHdl/highlightDistributedPipeliningBarriers')">hdlsrc/hdlcoderFocCurrentFloatHalfHdl/highlightDistributedPipeliningBarriers.m</a>
### To clear highlighting, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoderFocCurrentFloatHalfHdl/clearhighlighting.m')">hdlsrc/hdlcoderFocCurrentFloatHalfHdl/clearhighlighting.m</a>
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoderFocCurrentFloatHalfHdl_vnl')">gm_hdlcoderFocCurrentFloatHalfHdl_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoderFocCurrentFloatHalfHdl'.
### MESSAGE: The design requires 800 times faster clock with respect to the base rate = 2e-05.
### Working on hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control/nfp_relop_half as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/nfp_relop_half.vhd.
### Working on hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control/nfp_relop_half as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/nfp_relop_half_block.vhd.
### Working on hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control/nfp_relop_half as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/nfp_relop_half_block1.vhd.
### Working on hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control/nfp_relop_half as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/nfp_relop_half_block2.vhd.
### Working on hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control/nfp_add_half as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/nfp_add_half.vhd.
### Working on hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control/nfp_gain_pow2_half as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/nfp_gain_pow2_half.vhd.
### Working on hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control/nfp_sub_half as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/nfp_sub_half.vhd.
### Working on hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control/nfp_add2_half as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/nfp_add2_half.vhd.
### Working on hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control/nfp_mul_half as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/nfp_mul_half.vhd.
### Working on hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control/nfp_uminus_half as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/nfp_uminus_half.vhd.
### Working on hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control/nfp_relop_half as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/nfp_relop_half_block3.vhd.
### Working on hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control/nfp_convert_sfix_16_En14_to_half as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/nfp_convert_sfix_16_En14_to_half.vhd.
### Working on hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control/nfp_convert_half_to_sfix_16_En8 as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/nfp_convert_half_to_sfix_16_En8.vhd.
### Working on FOC_Current_Control_tc as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control_tc.vhd.
### Working on hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control as hdlsrc/hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control.vhd.
### Generating package file hdlsrc/hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control_pkg.vhd.
### Code Generation for 'hdlcoderFocCurrentFloatHalfHdl' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/Bdoc22a_1859087_173955/tp0f1f74e6/ex95119120/hdlsrc/hdlcoderFocCurrentFloatHalfHdl/html/hdlcoderFocCurrentFloatHalfHdl_codegen_rpt.html');">hdlcoderFocCurrentFloatHalfHdl_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/Bdoc22a_1859087_173955/tp0f1f74e6/ex95119120/hdlsrc/hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocCurrentFloatHalfHdl' complete with 0 errors, 1 warnings, and 3 messages.
### HDL code generation complete.

HDL Coder で利用できるネイティブ浮動小数点の完全な機能については、ドキュメントで参照できます。HDL Coder のネイティブ浮動小数点サポート入門のリンクを参照してください。