В этом примере вы просматриваете алгоритм векторного управления (FOC) для синхронной машины с постоянными магнитами (PMSM), реализованный с использованием типов с плавающей точностью с одной точностью и половинной точностью.
Вы видели версию этого проекта с фиксированной точкой в векторном управлении синхронной машиной с постоянными магнитами, которая глубоко погружается в то, как реализовать текущий алгоритм управления с использованием фиксированных точек. Модель была преобразована в фиксированную точку перед генерацией HDL-кода.
Можно использовать в проекте типы с одной точностью с плавающей точностью и генерировать HDL-код нативно, не преобразуя их в фиксированные точки. Этот пример показывает факторы проекта при генерации кода из вариантов с одной точностью с плавающей точностью и половинной точностью * модели с фиксированной точкой hdlcoderFocCurrentFixptHdl.
Модель testbench 'hdlcoderFocCurrentTestBench' имеет эталонный блок, указывающий на DUT, реализованный в с фиксированной точкой или с плавающей точкой.
Независимый от поставщика и целевой agnostic RTL для проекта ПЛИС и/или ASIC
Полная область значений функций IEEE-754, включая поддержку режимов округления, типов данных inf и nan, и опциональную поддержку денормальных чисел.
Обширный математический блок (add, mul, div, recip, журнал, exp, sqrt, rsqrt) и тригонометрический блок (sin, cos, sincos, atan, atan2) поддержки.
Иногда вы можете захотеть начать и остаться в HDL с плавающей точкой по следующим причинам:
Ваши алгоритмы имеют большие или неизвестные динамические области значений (для примера интеграторов в циклах обратной связи)
Ваш алгоритм использует операции, которые трудно спроектировать в фиксированной точке (например, atan2)
В версии с фиксированной точкой примера hdlcoderFocCurrentFloatHDL.slx вы замечаете, что для сохранения численного поведения алгоритма принимаются несколько решений об округлении и насыщении с фиксированной точкой. Например, блок 'hdlcoderFocCurrentFixptHdl/FOC _ Current _ Control/D _ Current _ Control/Saturate', который является блоком насыщения, был помещен в цикл интегратора, так что результаты не переполнены из-за накопления в цикле.
open_system('hdlcoderFocCurrentFixptHdl'); open_system('hdlcoderFocCurrentFixptHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate');
Иногда задача преобразования с фиксированной точкой может занять несколько недель в месяцы с несколькими уровнями перевалки алгоритма. Это также может привести к нежелательной потере точности, которая может быть неприемлема для некоторых критически важных приложений, требующих очень высокой точности.
В этих ситуациях можно выбрать использование собственных функций синтеза с плавающей точкой, доступных в HDL Coder.
Чтобы открыть версию алгоритма с одной точностью, запустите следующие команды:
load_system('hdlcoderFocCurrentFloatHdl'); open_system('hdlcoderFocCurrentFloatHdl/FOC_Current_Control')
В сравнении с алгоритмом с фиксированной точностью одноточная модель не требует дополнительных блоков округления и насыщения и настроек, как видно из версии модели 'hdlcoderFocCurrentFloatHdl/FOC _ Current _ Control/DQ _ Current _ Control/D _ Current _ Controll
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 Coder. См. ссылку в разделе Начало работы с HDL Coder поддержки с плавающей точкой.