exponenta event banner

Поддержка с плавающей запятой: алгоритм управления, ориентированный на область

В этом примере рассматривается алгоритм управления с ориентацией на поле (FOC) для синхронной машины с постоянным магнитом (PMSM), реализованный с использованием типов с плавающей запятой с одинарной точностью и полуконкретностью.

Введение

Вы видели версию этой конструкции с фиксированной точкой в полевом управлении синхронной машиной с постоянным магнитом, которая глубоко погружается в то, как реализовать алгоритм текущего управления с использованием типов с фиксированной точкой. Модель была преобразована в фиксированную точку перед созданием кода HDL.

В конструкции можно использовать типы с одной точностью с плавающей запятой и генерировать код HDL самостоятельно без преобразования в типы с фиксированной запятой. В этом примере показаны конструктивные соображения при создании кода из вариантов с одинарной точностью с плавающей запятой и с полуточностью * модели с фиксированной запятой hdlcoderFocCurrentFixptHdl.

Модель testbench «» hdlcoureFocCurrentStartBench «» имеет опорный блок, указывающий на DUT, реализованный в фиксированной или плавающей точке.

Отличительные особенности поддержки собственной плавающей точки.

  • Независимый от поставщика и целевой агностический RTL для проектирования FPGA и/или ASIC

  • Полный спектр функций IEEE-754, включая поддержку режимов округления, типов данных inf и nan и дополнительную поддержку денормальных чисел.

  • Обширный математический блок (add, mul, div, recip, log, exp, sqrt, rsqrt) и тригонометрический блок (sin, cos, sincos, atan, atan2) поддерживают.

Зачем использовать типы с плавающей запятой

Иногда вы можете начать и оставаться в плавающей точке для целевого HDL по следующим причинам:

  • Алгоритмы имеют большие или неизвестные динамические диапазоны (например, интеграторы в контурах обратной связи)

  • В алгоритме используются операции, которые трудно спроектировать в фиксированной точке (например, atan2)

В версии с фиксированной точкой примера hdlcoderFocCurrentFloatHDL.slx вы заметили, что для сохранения численного поведения алгоритма принимаются несколько решений о округлении и насыщении с фиксированной точкой. Например, в цикл интегратора помещен блок «hdlcoderFocCurrentFixptHdl/FOC _ Current _ Control/DQ _ Current _ Control/D _ Current _ Control/Saturate», который является блоком насыщения, чтобы результаты не перетекали из-за накопления в цикле.

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

Иногда задача преобразования с фиксированной точкой может занимать от нескольких недель до месяцев с несколькими уровнями повторной проверки алгоритма. Это также может привести к нежелательной потере точности, которая может оказаться неприемлемой для некоторых критически важных приложений, требующих очень высокой точности.

В этих ситуациях можно использовать собственные функции синтеза с плавающей запятой, доступные в кодере HDL.

Однострочная модель ВОК

Чтобы открыть версию алгоритма с одинарной точностью, выполните следующие команды:

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

По сравнению с алгоритмом с фиксированной точкой, модель с одной точностью не требует дополнительных блоков округления и насыщения и настроек, как можно видеть в версии модели с плавающей запятой «hdlcoureFocCurrentFloatHdl/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.
### 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/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/hdlsrc/hdlcoderFocCurrentFloatHdl/html/hdlcoderFocCurrentFloatHdl_codegen_rpt.html');">hdlcoderFocCurrentFloatHdl_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/hdlsrc/hdlcoderFocCurrentFloatHdl/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocCurrentFloatHdl' complete with 0 errors, 0 warnings, and 2 messages.
### HDL code generation complete.

Модель ВОК с высокой точностью

Для приложений, требующих меньшего динамического диапазона, можно использовать half без необходимости преобразования конструкции для использования типов с фиксированной точкой. Используя half типы потребляют гораздо меньше памяти, имеют меньшую задержку и экономят ресурсы FPGA.

Преимущества типов с плавающей запятой половинной точности в аппаратной перспективе:

  • Низкая задержка

  • Низкая площадь

  • Высокая скорость

  • 16-разрядное поведение с плавающей запятой, которое будет полезно для оптимального хранения

  • Более широкий динамический диапазон по сравнению с целыми или фиксированными типами данных одинакового размера

Типы половинной точности имеют те же функции, что и типы с плавающей запятой с одинарной и двойной точностью. Поддерживаемые операторы включают базовые арифметические операторы (EX: 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.
### 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/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/hdlsrc/hdlcoderFocCurrentFloatHalfHdl/html/hdlcoderFocCurrentFloatHalfHdl_codegen_rpt.html');">hdlcoderFocCurrentFloatHalfHdl_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/hdlsrc/hdlcoderFocCurrentFloatHalfHdl/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocCurrentFloatHalfHdl' complete with 0 errors, 0 warnings, and 2 messages.
### HDL code generation complete.

Вы можете обратиться к документации для полнофункциональных возможностей с плавающей запятой, доступных в кодере HDL. См. ссылку в документе «Начало работы с поддержкой собственного кодера HDL с плавающей запятой».