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

В этом примере вы рассмотрите алгоритм Ориентированного на поле управления (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')

Сгенерируйте HDL-код для алгоритма управления

% 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/BR2019ad_1062519_57051/publish_examples2/tp7aed3100/hdlsrc/hdlcoderFocCurrentFloatHdl/html/hdlcoderFocCurrentFloatHdl_codegen_rpt.html');">hdlcoderFocCurrentFloatHdl_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2019ad_1062519_57051/publish_examples2/tp7aed3100/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. Смотрите ссылку в нативной документации с плавающей точкой.