В этом примере рассматривается алгоритм управления с ориентацией на поле (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 с плавающей запятой».