В этом примере вы рассмотрите алгоритм Ориентированного на поле управления (FOC) для Постоянного магнита синхронной машины (PMSM), реализованного с помощью представления с плавающей точкой с одинарной точностью.
Вы видели версию фиксированной точки этого проекта в Модели FOC (Фиксированная точка), которая берет глубокое погружение в то, как реализовать текущий алгоритм управления с помощью фиксированных точек. Модель была преобразована в фиксированную точку прежде, чем сгенерировать HDL. Преобразование фиксированной точки было необходимым шагом перед генерацией HDL-кода.
Однако начиная в релизе R2016b, HDL Coder поддерживает типы одинарной точности с плавающей точкой, и эта демонстрация показывает конструктивные соображения при генерации кода из моделей одинарной точности с плавающей точкой.
Оба использование демонстраций та же модель испытательного стенда 'hdlcoderFocCurrentTestBench' со ссылочным блоком, указывающим на DUT, реализованный в фиксированной точке или с плавающей точкой.
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 по следующим причинам
Ваши алгоритмы имеют большие или неизвестные динамические диапазоны (например, интеграторы в обратной связи)
Ваш алгоритм использует операции, которые затрудняют, чтобы спроектировать в фиксированной точке (исключая: atan2
В версии фиксированной точки примера hdlcoderFocCurrentFloatHDL.slx вы заметите, что несколько округлений фиксированной точки и решений насыщения сделаны сохранить числовое поведение алгоритма. Например, блок 'hdlcoderFocCurrentFixptHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate', который является блоком насыщения, был помещен в цикл интегратора так, чтобы результаты не переполнялись из-за накопления в цикле.
Иногда, задача преобразования фиксированной точки могла занять несколько недель к месяцам с несколькими уровнями придания вновь юридической силы алгоритма. Это может также привести к нежелательной потере точности, которая не может быть приемлемой для некоторых важных приложений, требующих очень высокой точности. В этих ситуациях можно принять решение использовать нативные функции синтеза с плавающей точкой, доступные в HDL Coder.
Например, настройка алгоритма в версии с одинарной точностью алгоритма не требует дополнительного округления и блоков насыщения и настроек как видно в версии с плавающей точкой модели. 'hdlcoderFocCurrentFloatHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control'
Вот ключевые возможности поддержки с одинарной точностью, доступной в HDL Coder
И целевой агностический RTL не зависящий от производителя продукта для FPGA и/или проекта ASIC
Полный спектр функций IEEE 754 включая дополнительную поддержку denormals и поддержку inf и nan типов данных и округления режимов.
Обширный математический блок (добавляют, mul, отделение, recip, журнал, exp, sqrt, rsqrt) и тригонометрический блок (sin, потому что, sincos, atan, atan2) поддерживают
load_system('hdlcoderFocCurrentFloatHdl'); open_system('hdlcoderFocCurrentFloatHdl/FOC_Current_Control')
% You can generate and review the HDL code for the controller. % hdlset_param('hdlcoderFocCurrentFloatHdl', 'FloatingPointTargetConfiguration', hdlcoder.createFloatingPointTargetConfig('NATIVEFLOATINGPOINT')); makehdl('hdlcoderFocCurrentFloatHdl/FOC_Current_Control');
### 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. ### Starting HDL check. ### 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. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2019bd_1170825_64229/publish_examples2/tp6a800c02/hdlsrc/hdlcoderFocCurrentFloatHdl/html/hdlcoderFocCurrentFloatHdl_codegen_rpt.html');">hdlcoderFocCurrentFloatHdl_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples2/tp6a800c02/hdlsrc/hdlcoderFocCurrentFloatHdl/FOC_Current_Control_report.html ### HDL check for 'hdlcoderFocCurrentFloatHdl' complete with 0 errors, 0 warnings, and 2 messages. ### HDL code generation complete.
Сгенерированный код полностью реализует операторы одинарной точности IEEE для различных операторов с плавающей точкой (добавьте, sub, mul, uminus, pow2 и повторно сократите аккомпанементы), используемый в модели.
Обратитесь к документации для полных нативных возможностей с плавающей точкой, доступных в HDL Coder. Смотрите ссылку в нативной документации с плавающей точкой.