exponenta event banner

Сопоставление IP-адресов библиотеки с плавающей запятой FPGA

Этот пример иллюстрирует рабочий процесс с плавающей запятой, который интегрирует библиотеки IP, предоставляемые поставщиками, такими как Altera и Xilinx. Дополнительные сведения о сопоставлении конструкций с библиотеками с плавающей запятой см. в разделе Создание кода HDL для целевых библиотек с плавающей запятой FPGA.

Введение

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

Привязка конструкций к IP-библиотекам с плавающей запятой

Этот пример алгоритма управления с ориентацией на поле (FOC) демонстрирует основные шаги этого рабочего процесса по сопоставлению конструкций с библиотеками с плавающей запятой. Подробные сведения об этом приложении см. в примере Полевое управление синхронной машиной с постоянным магнитом.

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

Скорости сигнала в этой модели моделируются$\mu s$ только при 20 или 50 кГц. Обратите внимание, что эта модель содержит только числовую реализацию и не содержит каких-либо деталей синхронизации реализации FPGA, таких как задержки операций. Все численные операции, включая функции sin и cos, вычисляются за один шаг времени выборки.

open_system('hdlcoderFocCurrentSingleTargetHdl');
open_system('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Sine_Cosine');

Выбор IP-библиотеки

Для сопоставления с библиотекой с плавающей запятой поставщика установите устройство FPGA.

hdlset_param('hdlcoderFocCurrentSingleTargetHdl', 'SynthesisToolChipFamily', 'Arria 10');
hdlset_param('hdlcoderFocCurrentSingleTargetHdl', 'SynthesisTool', 'Altera Quartus II');

Настройка инструментов целевой библиотеки.

hdlsetuptoolpath('ToolName', 'Altera Quartus II','ToolPath', quartuspath);
hdlsetuptoolpath('ToolName', 'XILINX ISE','ToolPath', isepath);
Prepending following Altera Quartus II path(s) to the system path:
/mathworks/hub/share/apps/HDLTools/Altera/18.1-mw-0/Linux/quartus/bin
Setting QUARTUS_64BIT environment variable to 1 to turn on 64-bit processing.
Setting XILINX environment variable to:
/mathworks/hub/share/apps/HDLTools/Xilinx_ISE/14.7-mw-0/Lin/ISE_DS/ISE
Setting XILINX_EDK environment variable to:
/mathworks/hub/share/apps/HDLTools/Xilinx_ISE/14.7-mw-0/Lin/ISE_DS/EDK
Setting XILINX_PLANAHEAD environment variable to:
/mathworks/hub/share/apps/HDLTools/Xilinx_ISE/14.7-mw-0/Lin/ISE_DS/PlanAhead
Prepending following XILINX ISE path(s) to the system path:
/mathworks/hub/share/apps/HDLTools/Xilinx_ISE/14.7-mw-0/Lin/ISE_DS/ISE/bin/lin64:/mathworks/hub/share/apps/HDLTools/Xilinx_ISE/14.7-mw-0/Lin/ISE_DS/EDK/bin/lin64:/mathworks/hub/share/apps/HDLTools/Xilinx_ISE/14.7-mw-0/Lin/ISE_DS/PlanAhead/bin

пути инструмента для синтеза с возвратом четвертичного пути и изепатия в нашей среде. См. hdlsetuptoolpath для настройки инструментов в среде.

Первым шагом является выбор библиотеки поставщиков. Для устройств Xilinx можно использовать 'XILINXLOGICORE', а для устройств Altera можно выбрать 'ALTERAFPFUNCTIONS' или 'ALTFP'. Проверьте библиотечную документацию на их поддерживаемые устройства.

Создайте целевой объект конфигурации с плавающей запятой для ALTERAFPFUNCTIONS.

fc = hdlcoder.createFloatingPointTargetConfig('ALTERAFPFUNCTIONS');

Установка объекта конфигурации в модели

hdlset_param('hdlcoderFocCurrentSingleTargetHdl', 'FloatingPointTargetConfiguration', fc);

Чтобы собрать и моделировать сгенерированный код с QuestaSim, Вы должны собрать библиотеку моделирования Altera и установить ее путь на модели с параметром SimulationLibPath. Дополнительные сведения см. в разделе Настройка инструмента. alterasimulationlibpath возвращает путь к скомпилированной библиотеке моделирования Altera в нашей среде.

hdlset_param('hdlcoderFocCurrentSingleTargetHdl', 'SimulationLibPath', alterasimulationlibpath);

Библиотека Altera Megafunction (ALTERAFPFUNCTIONS) позволяет создавать IP-модули для заданной целевой частоты. В этом примере целевая частота устанавливается равной 250MHz.

hdlset_param('hdlcoderFocCurrentSingleTargetHdl', 'TargetFrequency', 250);

Ремоделирование для IP-сопоставления

Создать код

try
    makehdl('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control');
catch me
    disp(me.message);
end
### Generating HDL for 'hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocCurrentSingleTargetHdl', { 'HDL Code Generation' } )">hdlcoderFocCurrentSingleTargetHdl</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderFocCurrentSingleTargetHdl'.
### Begin compilation of the model 'hdlcoderFocCurrentSingleTargetHdl'...
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocCurrentSingleTargetHdl' complete with 1 errors, 0 warnings, and 0 messages.

For the block 'hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate_Output/Saturation_Dynamic'
   This block is not supported for Altera Megafunction mapping.

Сообщение об ошибке указывает на то, что блок динамического насыщения не может сопоставляться с библиотекой с плавающей запятой.

hilite_system('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate_Output/Saturation_Dynamic');

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

В этом примере мы заменим Saturate_Output подсистемы, которые содержат блоки динамического насыщения, альтернативной реализацией.

open_system('floatFocUtils');
blocksToReplace = {'hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate_Output', ...
    'hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/Q_Current_Control/Saturate_Output'...
    };
position1 = get_param(blocksToReplace{1}, 'Position');
delete_block(blocksToReplace{1});
add_block('floatFocUtils/Saturate_Output_Detailed', ...
    blocksToReplace{1}, 'Position', position1);
position2 = get_param(blocksToReplace{2}, 'Position');
delete_block(blocksToReplace{2});
add_block('floatFocUtils/Saturate_Output_Detailed', ...
    blocksToReplace{2}, 'Position', position2);
bdclose('floatFocUtils');
open_system(blocksToReplace{1}, 'force');

Применение конвейеризации тактовой частоты для устранения задержек IP

Попробуйте создать код еще раз

try
    makehdl('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control');
catch me
    disp(me.message);
end
### Generating HDL for 'hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocCurrentSingleTargetHdl', { 'HDL Code Generation' } )">hdlcoderFocCurrentSingleTargetHdl</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderFocCurrentSingleTargetHdl'.
### Begin compilation of the model 'hdlcoderFocCurrentSingleTargetHdl'...
### Applying HDL optimizations on the model 'hdlcoderFocCurrentSingleTargetHdl'...
### Using /mathworks/hub/share/apps/HDLTools/Altera/18.1-mw-0/Linux/quartus/bin/../sopc_builder/bin/ip-generate for the selected floating point IP library.
### Generating Altera(R) megafunction: alterafpf_add_single for target frequency of 250 MHz.
### alterafpf_add_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_mul_single for target frequency of 250 MHz.
### alterafpf_mul_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_sub_single for target frequency of 250 MHz.
### alterafpf_sub_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_neq_single_NEQ for target frequency of 250 MHz.
### alterafpf_neq_single_NEQ takes 0 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_le_single_LE for target frequency of 250 MHz.
### alterafpf_le_single_LE takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_ge_single_GE for target frequency of 250 MHz.
### alterafpf_ge_single_GE takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_gt_single_GT for target frequency of 250 MHz.
### alterafpf_gt_single_GT takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_lt_single_LT for target frequency of 250 MHz.
### alterafpf_lt_single_LT takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_trig_single_SIN for target frequency of 250 MHz.
### alterafpf_trig_single_SIN takes 26 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_trig_single_COS for target frequency of 250 MHz.
### alterafpf_trig_single_COS takes 25 cycles.
### Done.
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocCurrentSingleTargetHdl' complete with 5 errors, 0 warnings, and 0 messages.
### HDL check for 'hdlcoderFocCurrentSingleTargetHdl' complete with 5 errors, 0 warnings, and 0 messages.
Target-specific code generation cannot complete for the following reason(s): 'Cannot allocate 1 delays for hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate_relop_lower.'.

Эти сообщения об ошибках указывают на то, что кодер HDL не может заменить операции в контурах обратной связи IP-модулями с плавающей запятой, так как эти контуры моделируются с меньшими задержками, чем задержка эквивалентных IP-модулей с плавающей запятой, которые должны быть заменены. IP-модули с плавающей запятой реализованы в виде конвейерных блоков. Для некоторых модулей существуют минимальные требования к задержке. Поскольку изменение латентности цикла обратной связи порождает неправильную реализацию, кодер ЛВП предотвращает добавление такой латентности внутри цикла обратной связи.

Ошибка указывает, что сумматор внутри контура обратной связи требует нескольких циклов, но контур имеет только одну задержку.

hilite_system('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Add');

В этой ситуации имеется несколько вариантов:

  • Уменьшение целевой частоты может снизить требования к глубине трубопровода. Однако это также может замедлить работу всех других IP-модулей в конструкции.

  • Настройте IP-модули, используемые в цикле, с меньшей задержкой. Это также замедляет рабочую частоту IP-модулей, но только для указанных IP-модулей.

  • Применение конвейеризации тактовой частоты. Когда скорость передачи данных ниже, чем тактовая частота FPGA, FPGA имеет несколько циклов на тактовой частоте для завершения операций и по-прежнему сохраняет численную согласованность. Дополнительные сведения о конвейеризации тактовой частоты см. в разделе Конвейеризация тактовой частоты.

Применим опцию конвейеризации тактовой частоты для решения проблемы контура обратной связи, так как время выборки 20$\mu s$ и целевая частота FPGA 250 МГц (или 4 нс). Таким образом, мы определяем коэффициент избыточной дискретизации как отношение двух значений, то есть 5000, что означает, что одна единичная задержка, такая как показанная в цикле, с временем выборки 20 в$\mu s$ исходной модели, эквивалентна 5000 циклам тактовой частоты во время выборки 4 нс на FPGA. Их достаточно для IP-модулей с плавающей запятой в контурах. Конвейеризация тактовой частоты является идеальным вариантом для этой конструкции.

Установите избыточную выборку на 5000.

hdlset_param('hdlcoderFocCurrentSingleTargetHdl', 'Oversampling', 5000);

Создать код

makehdl('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control');
### Generating HDL for 'hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocCurrentSingleTargetHdl', { 'HDL Code Generation' } )">hdlcoderFocCurrentSingleTargetHdl</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderFocCurrentSingleTargetHdl'.
### Begin compilation of the model 'hdlcoderFocCurrentSingleTargetHdl'...
### Applying HDL optimizations on the model 'hdlcoderFocCurrentSingleTargetHdl'...
### Using /mathworks/hub/share/apps/HDLTools/Altera/18.1-mw-0/Linux/quartus/bin/../sopc_builder/bin/ip-generate for the selected floating point IP library.
### Generating Altera(R) megafunction: alterafpf_add_single for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_add_single.vhd). Reusing the generated file.
### alterafpf_add_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_mul_single for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_mul_single.vhd). Reusing the generated file.
### alterafpf_mul_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_gt_single_GT for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_gt_single_GT.vhd). Reusing the generated file.
### alterafpf_gt_single_GT takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_lt_single_LT for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_lt_single_LT.vhd). Reusing the generated file.
### alterafpf_lt_single_LT takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_sub_single for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_sub_single.vhd). Reusing the generated file.
### alterafpf_sub_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_trig_single_SIN for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_trig_single_SIN.vhd). Reusing the generated file.
### alterafpf_trig_single_SIN takes 26 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_trig_single_COS for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_trig_single_COS.vhd). Reusing the generated file.
### alterafpf_trig_single_COS takes 25 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_le_single_LE for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_le_single_LE.vhd). Reusing the generated file.
### alterafpf_le_single_LE takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_ge_single_GE for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_ge_single_GE.vhd). Reusing the generated file.
### alterafpf_ge_single_GE takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_neq_single_NEQ for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_neq_single_NEQ.vhd). Reusing the generated file.
### alterafpf_neq_single_NEQ takes 0 cycles.
### Done.
### The code generation and optimization options you have chosen have introduced additional pipeline delays.
### The delay balancing feature has automatically inserted matching delays for compensation.
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 1: 2 cycles.
### Begin model generation.
### Model generation complete.
### Clock-rate pipelining results can be diagnosed by running this script: <a href="matlab:run('hdlsrc/hdlcoderFocCurrentSingleTargetHdl/highlightClockRatePipelining')">hdlsrc/hdlcoderFocCurrentSingleTargetHdl/highlightClockRatePipelining.m</a>
### To clear highlighting, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoderFocCurrentSingleTargetHdl/clearhighlighting.m')">hdlsrc/hdlcoderFocCurrentSingleTargetHdl/clearhighlighting.m</a>
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoderFocCurrentSingleTargetHdl_vnl')">gm_hdlcoderFocCurrentSingleTargetHdl_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoderFocCurrentSingleTargetHdl'.
### MESSAGE: The design requires 5000 times faster clock with respect to the base rate = 2e-05.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate_Output as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Saturate_Output.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/D_Current_Control.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/DQ_Current_Control.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Clarke_Transform as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Clarke_Transform.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Sine_Cosine as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Sine_Cosine.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Park_Transform as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Park_Transform.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Inverse_Park_Transform as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Inverse_Park_Transform.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Inverse_Clarke_Transform as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Inverse_Clarke_Transform.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Space_Vector_Modulation as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Space_Vector_Modulation.vhd.
### Working on FOC_Current_Control_tc as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_tc.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control.vhd.
### Generating package file hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_pkg.vhd.
### Code Generation for 'hdlcoderFocCurrentSingleTargetHdl' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/html/hdlcoderFocCurrentSingleTargetHdl_codegen_rpt.html');">hdlcoderFocCurrentSingleTargetHdl_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocCurrentSingleTargetHdl' complete with 0 errors, 0 warnings, and 2 messages.
### HDL code generation complete.

Теперь вся конструкция отображается на IP-модули с плавающей запятой. Отчет о формировании целевого кода обобщает использование плавающего IP-модуля.

Проверьте созданную модель для получения подробной информации о внедрении. Например, подсистема gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Add, соответствующая hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Add в исходной модели, показывает, что эта операция занимает 3 цикла.

hilite_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Add/Add_pd1');
get_param('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Add/Add_pd1', ...
    'DelayLength')
ans =

    '3'

Поскольку IP-модули с плавающей запятой вводят задержки во всей конструкции, кодер HDL автоматически добавляет необходимые задержки согласования для поддержания синхронизации данных. Дополнительные сведения см. в разделе Балансировка задержки.

Совместное использование IP-адресов с плавающей запятой

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

hdlset_param('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control', 'FlattenHierarchy', 'on');
hdlset_param('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control', 'SharingFactor', 4);

Создать код

makehdl('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control');
### Generating HDL for 'hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocCurrentSingleTargetHdl', { 'HDL Code Generation' } )">hdlcoderFocCurrentSingleTargetHdl</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderFocCurrentSingleTargetHdl'.
### Begin compilation of the model 'hdlcoderFocCurrentSingleTargetHdl'...
### Applying HDL optimizations on the model 'hdlcoderFocCurrentSingleTargetHdl'...
### Generating Altera(R) megafunction: alterafpf_trig_single_COS for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_trig_single_COS.vhd). Reusing the generated file.
### alterafpf_trig_single_COS takes 25 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_trig_single_SIN for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_trig_single_SIN.vhd). Reusing the generated file.
### alterafpf_trig_single_SIN takes 26 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_mul_single for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_mul_single.vhd). Reusing the generated file.
### alterafpf_mul_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_add_single for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_add_single.vhd). Reusing the generated file.
### alterafpf_add_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_sub_single for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_sub_single.vhd). Reusing the generated file.
### alterafpf_sub_single takes 3 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_gt_single_GT for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_gt_single_GT.vhd). Reusing the generated file.
### alterafpf_gt_single_GT takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_lt_single_LT for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_lt_single_LT.vhd). Reusing the generated file.
### alterafpf_lt_single_LT takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_neq_single_NEQ for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_neq_single_NEQ.vhd). Reusing the generated file.
### alterafpf_neq_single_NEQ takes 0 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_ge_single_GE for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_ge_single_GE.vhd). Reusing the generated file.
### alterafpf_ge_single_GE takes 1 cycles.
### Done.
### Generating Altera(R) megafunction: alterafpf_le_single_LE for target frequency of 250 MHz.
### Found an existing generated file in a previous session: (/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/Altera/Arria_10/unspecified/F250/synth/alterafpf_le_single_LE.vhd). Reusing the generated file.
### alterafpf_le_single_LE takes 1 cycles.
### Done.
### Using /mathworks/hub/share/apps/HDLTools/Altera/18.1-mw-0/Linux/quartus/bin/../sopc_builder/bin/ip-generate for the selected floating point IP library.
### Begin model generation.
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoderFocCurrentSingleTargetHdl_vnl')">gm_hdlcoderFocCurrentSingleTargetHdl_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoderFocCurrentSingleTargetHdl'.
### MESSAGE: The design requires 5000 times faster clock with respect to the base rate = 2e-05.
### Working on crp_temp_shared as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared.vhd.
### Working on crp_temp_shared_block as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block.vhd.
### Working on crp_temp_shared_block1 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block1.vhd.
### Working on crp_temp_shared_block2 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block2.vhd.
### Working on crp_temp_shared_block3 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block3.vhd.
### Working on crp_temp_shared_block4 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block4.vhd.
### Working on crp_temp_shared_block5 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block5.vhd.
### Working on crp_temp_shared_block6 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block6.vhd.
### Working on crp_temp_shared_block7 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block7.vhd.
### Working on crp_temp_shared_block8 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block8.vhd.
### Working on crp_temp_shared_block9 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block9.vhd.
### Working on crp_temp_shared_block10 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block10.vhd.
### Working on crp_temp_shared_block11 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block11.vhd.
### Working on crp_temp_shared_block12 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block12.vhd.
### Working on crp_temp_shared_block13 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block13.vhd.
### Working on crp_temp_shared_block14 as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/crp_temp_shared_block14.vhd.
### Working on FOC_Current_Control_tc as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_tc.vhd.
### Working on hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control as hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control.vhd.
### Generating package file hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_pkg.vhd.
### Code Generation for 'hdlcoderFocCurrentSingleTargetHdl' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/html/hdlcoderFocCurrentSingleTargetHdl_codegen_rpt.html');">hdlcoderFocCurrentSingleTargetHdl_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocCurrentSingleTargetHdl' complete with 0 errors, 0 warnings, and 1 messages.
### HDL code generation complete.

Мы можем подтвердить, что теперь из отчета о ресурсах с плавающей запятой выводится меньшее количество IP-модулей.

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

open_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control');
set_param('gm_hdlcoderFocCurrentSingleTargetHdl', 'SimulationCommand', 'update');
set_param('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control', 'ZoomFactor', 'FitSystem');
hilite_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/crp_temp_shared');
hilite_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/crp_temp_shared1');
hilite_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/crp_temp_shared2');
hilite_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/crp_temp_shared3');
hilite_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/crp_temp_shared4');
hilite_system('gm_hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/crp_temp_shared5');

Конфигурация библиотеки IP

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

Мы будем использовать XILINX LOGICORE и простую модель, содержащую один блок добавления для этого раздела.

Создайте целевой объект конфигурации с плавающей запятой для XILINX LOGICORE.

fc = hdlcoder.createFloatingPointTargetConfig('XILINXLOGICORE');

Помимо имени библиотеки, объект конфигурации имеет два других поля для настроек библиотеки и отдельных параметров IP-модулей соответственно.

fc
fc = 

  FloatingPointTargetConfig with properties:

            Library: 'XILINXLOGICORE'
    LibrarySettings: [1x1 fpconfig.LatencyDrivenMode]
           IPConfig: [1x1 hdlcoder.FloatingPointTargetConfig.IPConfig]

LibrureSettings содержит параметры для всей библиотеки. Проверьте настройку библиотеки XILINX LOGICORE.

fc.LibrarySettings
ans = 

  LatencyDrivenMode with properties:

    LatencyStrategy: 'MIN'
          Objective: 'SPEED'

Эти параметры применимы ко всем IP-модулям из этой библиотеки. Например, Objective задает параметр c_optimization для XILINX LOGICORE. Мы можем переключить его на 'AREA'.

fc.LibrarySettings.Objective = 'AREA';
fc.LibrarySettings
ans = 

  LatencyDrivenMode with properties:

    LatencyStrategy: 'MIN'
          Objective: 'AREA'

Параметры библиотеки зависят от библиотеки. См. раздел Создание кода HDL для целевых библиотек с плавающей запятой FPGA для всех настроек для определенных библиотек.

IPConfig предоставляет настройки, такие как Latency и ExtraArgs, для отдельных IP-модулей.

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

fc.IPConfig.customize('ADDSUB', 'SINGLE', 'Latency', 11);
fc.IPConfig
ans = 

       Name                DataType             MinLatency    MaxLatency    Latency    ExtraArgs 
    ___________    _________________________    __________    __________    _______    __________

    {'ADDSUB' }    {'DOUBLE'               }        12            12          -1       {0x0 char}
    {'ADDSUB' }    {'SINGLE'               }        12            12          11       {0x0 char}
    {'CONVERT'}    {'DOUBLE_TO_NUMERICTYPE'}         6             6          -1       {0x0 char}
    {'CONVERT'}    {'NUMERICTYPE_TO_DOUBLE'}         6             6          -1       {0x0 char}
    {'CONVERT'}    {'NUMERICTYPE_TO_SINGLE'}         6             6          -1       {0x0 char}
    {'CONVERT'}    {'SINGLE_TO_NUMERICTYPE'}         6             6          -1       {0x0 char}
    {'DIV'    }    {'DOUBLE'               }        57            57          -1       {0x0 char}
    {'DIV'    }    {'SINGLE'               }        28            28          -1       {0x0 char}
    {'MUL'    }    {'DOUBLE'               }         9             9          -1       {0x0 char}
    {'MUL'    }    {'SINGLE'               }         8             8          -1       {0x0 char}
    {'RELOP'  }    {'DOUBLE'               }         2             2          -1       {0x0 char}
    {'RELOP'  }    {'SINGLE'               }         2             2          -1       {0x0 char}
    {'SQRT'   }    {'DOUBLE'               }        57            57          -1       {0x0 char}
    {'SQRT'   }    {'SINGLE'               }        28            28          -1       {0x0 char}

Задержка для IP ADDSUB становится равной 11 вместо значения по умолчанию 12.

Другие параметры IP-адресов задаются с помощью ExtraArgs. Например, кодер HDL вызывает XILINX LOGICORE для генерации IP-модулей с плавающей запятой без использования каких-либо блоков DSP по умолчанию. XILINX LOGICORE предоставляет параметр, c_mult_usage для управления использованием DSP. Чтобы использовать блоки DSP, мы можем передать другой параметр с ExtraArgs, чтобы переопределить поведение по умолчанию. Поскольку строка ExtraArgs добавляется к параметрам генерации IP-модулей по умолчанию, она должна соответствовать синтаксису параметров библиотеки. Проверьте использование параметров и синтаксис документов IP-библиотеки.

fc.IPConfig.customize('ADDSUB', 'SINGLE', 'ExtraArgs', 'CSET c_mult_usage=Full_Usage');
fc.IPConfig
ans = 

       Name                DataType             MinLatency    MaxLatency    Latency               ExtraArgs            
    ___________    _________________________    __________    __________    _______    ________________________________

    {'ADDSUB' }    {'DOUBLE'               }        12            12          -1       {0x0 char                      }
    {'ADDSUB' }    {'SINGLE'               }        12            12          11       {'CSET c_mult_usage=Full_Usage'}
    {'CONVERT'}    {'DOUBLE_TO_NUMERICTYPE'}         6             6          -1       {0x0 char                      }
    {'CONVERT'}    {'NUMERICTYPE_TO_DOUBLE'}         6             6          -1       {0x0 char                      }
    {'CONVERT'}    {'NUMERICTYPE_TO_SINGLE'}         6             6          -1       {0x0 char                      }
    {'CONVERT'}    {'SINGLE_TO_NUMERICTYPE'}         6             6          -1       {0x0 char                      }
    {'DIV'    }    {'DOUBLE'               }        57            57          -1       {0x0 char                      }
    {'DIV'    }    {'SINGLE'               }        28            28          -1       {0x0 char                      }
    {'MUL'    }    {'DOUBLE'               }         9             9          -1       {0x0 char                      }
    {'MUL'    }    {'SINGLE'               }         8             8          -1       {0x0 char                      }
    {'RELOP'  }    {'DOUBLE'               }         2             2          -1       {0x0 char                      }
    {'RELOP'  }    {'SINGLE'               }         2             2          -1       {0x0 char                      }
    {'SQRT'   }    {'DOUBLE'               }        57            57          -1       {0x0 char                      }
    {'SQRT'   }    {'SINGLE'               }        28            28          -1       {0x0 char                      }

Откройте модель и задайте на ней объект конфигурации.

open_system('hdlcoder_targetIP_configuration');
hdlset_param('hdlcoder_targetIP_configuration', 'FloatingPointTargetConfiguration', fc);

Выполните синтез и сопоставление для подтверждения использования блока DSP.

  hWC = hdlcoder.WorkflowConfig('SynthesisTool','Xilinx ISE', ...
      'TargetWorkflow','Generic ASIC/FPGA');
  hWC.SkipPreRouteTimingAnalysis = true;
  hWC.RunTaskAnnotateModelWithSynthesisResult = false;
  hWC.GenerateRTLCode = true;
  hWC.validate;
  hdlcoder.runWorkflow('hdlcoder_targetIP_configuration/Add_Subsystem', hWC);

Резюме

Кодер HDL устраняет разрыв между высокоуровневыми алгоритмами, моделируемыми с плавающей запятой, и деталями реализации FPGA низкого уровня. Он не только автоматизирует процесс быстрого создания прототипов, но и позволяет эффективно исследовать варианты проектирования высокоуровневых алгоритмов. Этот пример демонстрирует необходимые шаги для генерации синтезируемого кода HDL с плавающей запятой. API командной строки, используемые в этом примере, помогают автоматизировать весь процесс создания кода и проектировать исследования пространства. Все API имеют соответствующие настройки GUI для простоты использования. Дополнительные сведения о параметрах API и GUI см. в разделе Создание кода HDL для целевых библиотек FPGA с плавающей запятой.