В этом примере показано, как улучшить возможности совместного использования ресурсов для оптимизации проекта модели путем внесения определенных изменений в ваш проект. Совместное использование ресурсов является оптимизацией HDL Coder, которая улучшает использование областей в проекте на целевом устройстве FPGA. Оптимизация идентифицирует несколько функционально эквивалентных ресурсов и заменяет их одним повторным соединением. Для получения дополнительной информации см. раздел «Совместное использование ресурсов».
Выполните следующие строки кода, чтобы скопировать необходимые файлы примера во временную папку.
design_name = 'hdlcoderParkTransform'; design_new_name = 'hdlcoderParkTransformCopy'; hdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos'); hdlc_temp_dir = [tempdir 'hdlcoderParkTransformDir']; % Create a temporary folder and copy the Simulink model. cd(tempdir); [~, ~, ~] = rmdir(hdlc_temp_dir, 's'); mkdir(hdlc_temp_dir); cd(hdlc_temp_dir); copyfile(fullfile(hdlc_demo_dir, [design_name,'.slx']), fullfile(hdlc_temp_dir, [design_new_name,'.slx']), 'f'); % Open the model. open_system(design_new_name);
% Set a SharingFactor of 6 on the subsystem of interest and generate % HDL along with the corresponding reports from the model. subsystem = [design_new_name '/DUT']; hdlset_param(subsystem, 'SharingFactor', 6); makehdl(subsystem);
### Generating HDL for 'hdlcoderParkTransformCopy/DUT'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderParkTransformCopy', { 'HDL Code Generation' } )">hdlcoderParkTransformCopy</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoderParkTransformCopy'. ### Begin compilation of the model 'hdlcoderParkTransformCopy'... ### Applying HDL optimizations on the model 'hdlcoderParkTransformCopy'... ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 1: 43 cycles. ### Output port 2: 43 cycles. ### Begin model generation. ### Model generation complete. ### Begin VHDL Code Generation for 'hdlcoderParkTransformCopy'. ### MESSAGE: The design requires 6 times faster clock with respect to the base rate = 1e-05. ### Working on hdlcoderParkTransformCopy/DUT/nfp_sin_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_sin_single.vhd. ### Working on hdlcoderParkTransformCopy/DUT/nfp_add_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_add_single.vhd. ### Working on hdlcoderParkTransformCopy/DUT/nfp_sub_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_sub_single.vhd. ### Working on hdlcoderParkTransformCopy/DUT/nfp_mul_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_mul_single.vhd. ### Working on hdlcoderParkTransformCopy/DUT/nfp_mul_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_mul_single_block.vhd. ### Working on hdlcoderParkTransformCopy/DUT/nfp_add_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_add_single_block.vhd. ### Working on hdlcoderParkTransformCopy/DUT/nfp_add2_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_add2_single.vhd. ### Working on hdlcoderParkTransformCopy/DUT/nfp_sub_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_sub_single_block.vhd. ### Working on DUT_tc as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/DUT_tc.vhd. ### Working on hdlcoderParkTransformCopy/DUT as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/DUT.vhd. ### Generating package file hdl_prj/hdlsrc/hdlcoderParkTransformCopy/DUT_pkg.vhd. ### Code Generation for 'hdlcoderParkTransformCopy' completed. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples1/hdlcoderParkTransformDir/hdl_prj/hdlsrc/hdlcoderParkTransformCopy/html/hdlcoderParkTransformCopy_codegen_rpt.html');">hdlcoderParkTransformCopy_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples1/hdlcoderParkTransformDir/hdl_prj/hdlsrc/hdlcoderParkTransformCopy/DUT_report.html ### HDL check for 'hdlcoderParkTransformCopy' complete with 0 errors, 1 warnings, and 1 messages. ### HDL code generation complete.
В сгенерированном отчете Потоковая передача и совместное использование обратите внимание, что существуют определенные группы, которые были определены как имеющие право на совместное использование:
Resource Type Group Size Block Name _________________ ____________ ____________ Trigonometry 6 sine Sum 2 AddSub2 Sum 2 AddSub1 Product 6 Product Product 2 Gain
Отчет о ресурсах с плавающей точкой показывает необходимые операторы:
Resource Usage _________________________ ________ Adders 4 Multipliers 2 Sin 1 Subtractors 2
Доклад о ресурсах высокого уровня показывает, что, по оценкам, использование ресурсов для проекта:
Resource Usage _________________________ ________ Multipliers 9 Adders/Subtractors 152 Registers 1121 Total 1-Bit Registers 15896 RAMs 0 Multiplexers 857 I/O Bits 228 Static Shift operators 5 Dynamic Shift operators 13
Можно также запустить рабочий процесс синтеза на модели. Результаты синтеза для этой модели:
Resource Usage _________________________ ________ Slice LUTs 29381 Slice Registers 24140 DSPs 50 Block Ram Tile 0 URAM 0
Для получения дополнительной информации о рабочем процессе синтеза смотрите Генерация HDL-кода и FPGA Synthesis из Simulink Model.
При последующем анализе модели можно увидеть, что существует несколько шаблонов, которые могут быть изменены, чтобы улучшить совместное использование ресурсов.
Первый такой шаблон с блоками Add и Вычитать, имена которых начинаются с «AddSub», и выход которых переходит к блокам Sin.
Второй шаблон соответствует блоку Sum (как сложение или вычитание), за которым следует блок Gain.
В обоих этих шаблонах существуют некоторые расхождения в подсвеченных блоках, которые препятствуют оптимальному совместному использованию ресурсов. Различия заключаются в следующем:
Во-первых, знаки блоков Sum в области около блоков Gain разные. Идя сверху вниз, знаки +++
и ---
.
Вы можете исправить это несоответствие со следующими изменениями:
Переключите знаки нижнего блока Sum из ---
на +++
Сделайте три нижних блока Sin в блоки Cos.
Измените вход на блок Cos и два нижних блока Sum с Inport 5 «ShiftedTheta» на Inport 4 «Theta».
Во-вторых, знаки блоков Sum в различных областях различны. Идя сверху вниз, знаки +-
, ++
, +-
и ++
.
Прямо сейчас блоки с обоими положительными знаками делятся отдельно от блоков с чередующимися знаками, требующими больших ресурсов. Можно дополнительно упростить модель, чтобы уменьшить количество блоков Sum в модели с одновременным улучшением совместного использования ресурсов. Входы блоков Sum одинаковы, и можно уменьшить количество блоков Sum до двух. Затем несоответствие между знаками легко фиксируется путем введения блока Unary Minus.
Затем устраняется расхождение, и эта модель теперь имеет больше ресурсов, чем оригинал.
Эта отредактированная модель сохранена как hdlcoderParkTransformShare.slx. Скопируйте эту версию модели во временную директорию с помощью следующих команд:
design_name = 'hdlcoderParkTransformShare'; design_new_name = 'hdlcoderParkTransformShareCopy'; copyfile(fullfile(hdlc_demo_dir, [design_name,'.slx']), fullfile(hdlc_temp_dir, [design_new_name,'.slx']), 'f'); % Open the model. open_system(design_new_name);
Поскольку эта модель была улучшена для совместного использования ресурсов, больше блоков разделяются и приводят к улучшению использования ресурсов. Установите SharingFactor 3 на интересующей подсистеме и сгенерируйте HDL вместе с соответствующими отчетами из оптимизированной модели
subsystem = [design_new_name '/DUT']; hdlset_param(subsystem, 'SharingFactor', 6); makehdl(subsystem);
### Generating HDL for 'hdlcoderParkTransformShareCopy/DUT'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderParkTransformShareCopy', { 'HDL Code Generation' } )">hdlcoderParkTransformShareCopy</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoderParkTransformShareCopy'. ### Begin compilation of the model 'hdlcoderParkTransformShareCopy'... ### Applying HDL optimizations on the model 'hdlcoderParkTransformShareCopy'... ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 1: 39 cycles. ### Output port 2: 39 cycles. ### Begin model generation. ### Model generation complete. ### Generating new validation model: <a href="matlab:open_system('gm_hdlcoderParkTransformShareCopy_vnl')">gm_hdlcoderParkTransformShareCopy_vnl</a>. ### Validation model generation complete. ### Begin VHDL Code Generation for 'hdlcoderParkTransformShareCopy'. ### MESSAGE: The design requires 6 times faster clock with respect to the base rate = 6. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_sincos_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_sincos_single.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_sub_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_sub_single.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_mul_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_mul_single.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_add_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_add_single.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_mul_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_mul_single_block.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_uminus_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_uminus_single.vhd. ### Working on DUT_tc as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_tc.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT.vhd. ### Generating package file hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_pkg.vhd. ### Code Generation for 'hdlcoderParkTransformShareCopy' completed. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples1/hdlcoderParkTransformDir/hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/html/hdlcoderParkTransformShareCopy_codegen_rpt.html');">hdlcoderParkTransformShareCopy_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples1/hdlcoderParkTransformDir/hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_report.html ### HDL check for 'hdlcoderParkTransformShareCopy' complete with 0 errors, 1 warnings, and 1 messages. ### HDL code generation complete.
После внесения этих изменений в проект в отчете Native Floating-Point Resource Report показаны необходимые обновленные операторы:
Resource Usage _________________________ ________ Adders 2 Multipliers 2 SinCos 1 Subtractors 1 Unary Minus 1
Заметьте, что количество сумматоров, умножителей и вычитателей уменьшилось после совместного использования.
После совместного использования в Докладе о ресурсах высокого уровня показано, что использование ресурсов для проекта было оценено как:
Resource Usage _________________________ ________ Multipliers 13 Adders/Subtractors 178 Registers 1012 Total 1-Bit Registers 16888 RAMs 0 Multiplexers 610 I/O Bits 196 Static Shift operators 8 Dynamic Shift operators 8
После выполнения синтеза на модели можно увидеть следующие результаты:
Resource Usage _________________________ ________ Slice LUTs 8792 Slice Registers 8419 DSPs 13 Block Ram Tile 0 URAM 0
Заметьте, что количество LUT среза, регистров среза и DSP уменьшилось после совместного использования.
Чтобы узнать, как улучшить совместное использование ресурсов с автоматической заменой повторяющихся шаблонов с помощью приложения Обнаружения клонов, смотрите раздел Улучшение совместного использования ресурсов с обнаружением и заменой клонов.