Этот пример иллюстрирует рабочий процесс с плавающей точкой, который интегрирует библиотеки IP, обеспеченные поставщиками, такими как Altera и Xilinx. Для получения дополнительной информации о том, как сопоставить проекты с библиотеками с плавающей точкой, отошлите к FPGA Библиотеку С плавающей точкой, Сопоставляющую документацию.
Реализующие проекты с арифметикой с плавающей точкой включают вам к модели с более высокой точностью и более широким динамическим диапазоном, и экономит время путем пропуска преобразования из плавающей запятой в фиксированную запятую. Это особенно выгодно для модельно-ориентированного проектирования, где высокоуровневые алгоритмы моделированы с с плавающей точкой, и не имеет деталей синхронизации реализации, таких как конвейеризация и синхронизация ограничений. Однако они необходимы, чтобы сопоставить операции с модулями IP с плавающей точкой. HDL Coder автоматически оптимизирует и реализует ваши проекты с этими, синхронизация детализирует и обеспечивает интерфейсы для вас, чтобы настроить их. Математика с плавающей точкой наконец реализована путем интеграции с модулями IP с плавающей точкой от библиотек поставщика.
Этот пример алгоритма Ориентированного на поле управления (FOC) демонстрирует основные шаги в этом рабочем процессе, чтобы сопоставить проекты с библиотеками с плавающей точкой. Смотрите Ориентированный на поле пример управления для получения дополнительной информации об этом приложении.
Эта модель использует с одинарной точностью и содержит блоки, которые выполняют основные математические операторы, такие как сумматоры, множители, компараторы, и объединяют sin и потому что функции.
Уровни сигнала в этой модели моделируются на уровне 20 или 50 кГц только. Заметьте, что эта модель содержит только числовую реализацию и не имеет никаких деталей синхронизации реализации FPGA, таких как задержки операции. Все числовые операции, включая sin и потому что функции, вычисляют в один демонстрационный такт.
open_system('hdlcoderFocCurrentSingleTargetHdl'); open_system('hdlcoderFocCurrentSingleTargetHdl/FOC_Current_Control/Sine_Cosine');
Для того, чтобы сопоставить с поставщиком библиотеку с плавающей точкой, установите устройство 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);
Сгенерируйте код
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. ### Starting HDL check. ### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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. Динамическое насыщение является примером блока, который поддерживается для фиксированной точки, но не отображения с плавающей точкой. В этих случаях блок может быть описан как подграф поддерживаемого подмножества. Для полного списка блоков и режимов, которые могут сопоставить с библиотеками с плавающей точкой, проверяйте поддержку Блока Библиотеки С плавающей точкой, Сопоставляющей документацию.
В этом примере мы заменим подсистемы 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');
Попытайтесь сгенерировать код снова
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. ### Starting HDL check. ### 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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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 и целевой частоты FPGA 250 МГц (или 4 нс). Таким образом мы задаем фактор Сверхдискретизации как отношение этих двух значений, т.е. 5000, подразумевая, что одна единичная задержка, такой как один показанный в цикле, с шагом расчета 20 в исходной модели, эквивалентна 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. ### Starting HDL check. ### 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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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 0: 2 cycles. ### 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. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/html/hdlcoderFocCurrentSingleTargetHdl_codegen_rpt.html');">hdlcoderFocCurrentSingleTargetHdl_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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. ### Starting HDL check. ### Generating Altera(R) megafunction: alterafpf_trig_single_COS for target frequency of 250 MHz. ### Found an existing generated file in a previous session: (/tmp/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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. ### 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. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/hdlsrc/hdlcoderFocCurrentSingleTargetHdl/html/hdlcoderFocCurrentSingleTargetHdl_codegen_rpt.html');">hdlcoderFocCurrentSingleTargetHdl_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples1/tp870e3e6f/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. В этом разделе мы иллюстрируем, как управлять этой настройкой в рабочем процессе 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'
Настройки библиотеки являются конкретной библиотекой. Смотрите 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 и опциях графический интерфейса пользователя, проверяйте FPGA Библиотека С плавающей точкой, Сопоставляющая документацию.