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');

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

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

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

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

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

fc = hdlcoder.createFloatingPointTargetConfig('ALTERAFPFUNCTIONS');

Установите объект строения в модели

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

Чтобы скомпилировать и симулировать сгенерированный код с помощью QuestaSim, необходимо скомпилировать библиотеку симуляции Altera и задать ее путь к модели с помощью параметра SimulationLibPath. Дополнительные сведения см. в Setup инструмента. 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 Coder поддерживаемых блоков. Динамика насыщения является примером блока, который поддерживается для отображения с фиксированной точкой, но не с плавающей точкой. В этих случаях блок может быть описан как подграфик поддерживаемого подмножества. Полный список блоков и режимов, которые могут быть сопоставлены с библиотеками с плавающей точкой, см. HDL Coder разделе Поддержка библиотечном Отображении 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 Coder не может заменить операции в циклах обратной связи на IP-модули с плавающей точкой, потому что эти циклы моделируются с меньшим количеством задержек, чем задержки эквивалентных IP-модулей с плавающей точкой, которые будут заменены. IP-модули с плавающей точкой реализованы как конвейерные блоки. Для некоторых модулей существуют минимальные требования к задержке. Поскольку изменение задержки цикла обратной связи генерирует неправильную реализацию, HDL Coder препятствует сложению такой задержки внутри цикла обратной связи.

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

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 Coder автоматически добавляет необходимые задержки соответствия для поддержания синхронизации данных. Для получения дополнительной информации см. раздел «Балансировка задержки».

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

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

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 Coder.

Мы будем использовать 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]

LibrarySettings содержит параметры всей библиотеки. Проверьте настройку библиотеки 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 Coder выводит задержку на основе настроек библиотеки и целевой частоты, если применимо. Мы также можем задать задержку для отдельного 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}

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

Другие настройки IP заданы в ExtraArgs. Например, HDL Coder вызывает 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 Coder преодолевает разрыв между алгоритмами высокого уровня, смоделированными с плавающей точкой, и деталями реализации FPGA низкого уровня. Это не только автоматизирует процесс быстрого прототипирования, но и позволяет эффективно исследовать варианты проекта алгоритмов высокого уровня. Этот пример демонстрирует необходимые шаги для генерации синтезируемого HDL-кода с плавающей точкой. API командной строки, используемые в этом примере, помогают автоматизировать весь процесс генерации кода и проектировать исследования пространства. Все API имеют соответствующие настройки GUI для простоты использования. Дополнительные сведения об API и графическом интерфейсе пользователя опций см. в разделе Генерация HDL-кода для целевых библиотек с плавающей точкой FPGA.