FPGA отображение IP библиотеки с плавающей точкой

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

Введение

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

Отображение проектов к библиотекам IP с плавающей точкой

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

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

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

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 для данной целевой частоты. В этом примере целевая частота установлена в 250 МГц.

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.

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

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 нс). Таким образом мы задаем фактор Сверхдискретизации как отношение этих двух значений, i.e. 5000, означая, что одна единичная задержка, такой как один показанный в цикле, с шагом расчета 20$\mu s$ в исходной модели, эквивалентна 5 000 циклов тактовой частоты в шаге расчета 4 нс на FPGA. Они достаточны для модулей IP с плавающей точкой в циклах. Конвейеризация тактовой частоты является идеальной опцией для этого проекта.

Установите сверхдискретизацию на 5 000.

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 с плавающей точкой подходят для доли, потому что они обычно идентичны для того же вида. Дюйм/с с плавающей точкой является обычно дорогими операциями, и желательно совместно использовать эти ресурсы, если это возможно, уменьшать место области. 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 и простую модель, содержащую, каждый добавляет блок для этого раздела.

Создайте целевой объект настройки с плавающей точкой для ЛОГИЧЕСКОГО СЕРДЕЧНИКА XILINX.

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 от этой библиотеки. Например, Цель задает c_optimization параметр к ЛОГИЧЕСКОМУ СЕРДЕЧНИКУ XILINX. Мы можем переключить его на 'ОБЛАСТЬ'.

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

  LatencyDrivenMode with properties:

    LatencyStrategy: 'MIN'
          Objective: 'AREA'

Настройки библиотеки являются конкретной библиотекой. Смотрите Генерируют HDL-код для FPGA Целевые Библиотеки С плавающей точкой для всех настроек для определенных библиотек.

IPConfig обеспечивает настройки, такие как Задержка и 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}

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

Другой IP определенные настройки задан с ExtraArgs. Например, HDL Coder вызывает ЛОГИЧЕСКИЙ СЕРДЕЧНИК XILINX, чтобы сгенерировать модули IP с плавающей точкой, не используя блоков DSP по умолчанию. ЛОГИЧЕСКИЙ СЕРДЕЧНИК XILINX обеспечивает параметр 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 Целевые Библиотеки С плавающей точкой.