В этом примере показано, как улучшить возможности совместного использования ресурсов для оптимизации конструкции модели путем внесения определенных изменений в конструкцию. Совместное использование ресурсов - это оптимизация кодера HDL, которая улучшает использование области в конструкции целевого устройства 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Можно также запустить workflow-процесс синтеза в модели. Результаты синтеза для этой модели:
Resource Usage
_________________________ ________
Slice LUTs 29381
Slice Registers 24140
DSPs 50
Block Ram Tile 0
URAM 0Дополнительные сведения о рабочем процессе синтеза см. в разделах Генерация кода HDL и Синтез FPGA из Simulink Model.
После дальнейшего анализа модели можно увидеть, что существует несколько шаблонов, которые можно изменить для улучшения совместного использования ресурсов.
Первый такой шаблон имеет блоки Add и Subtract, имена которых начинаются с «AddSub» и выходные данные которых поступают в блоки Sin.
Второй шаблон соответствует блоку суммы (в виде сложения или вычитания), за которым следует блок усиления.
В обоих этих шаблонах имеются некоторые различия в выделенных блоках, которые предотвращают оптимальное совместное использование ресурсов. Различия заключаются в следующем:
Во-первых, знаки блоков Суммы в области вблизи блоков усиления различны. Проходя сверху вниз, знаки +++ и ---.
Это несоответствие можно исправить следующими изменениями:
Переключить знаки нижнего блока суммы с --- кому +++
Установите три нижних блока Sin в блоки Cos.
Измените входные данные блока Cos и двух нижних блоков Sum с Inport 5 «Theta» на Inport 4 «Theta».
Во-вторых, знаки блоков Суммы в различных областях различны. Проходя сверху вниз, знаки +-, ++, +- и ++.
Прямо сейчас блоки с обоими положительными знаками делятся отдельно от блоков с чередующимися знаками, требующими больше ресурсов. Можно дополнительно упростить модель, чтобы уменьшить количество блоков суммы в модели при одновременном улучшении совместного использования ресурсов. Входные данные блоков Sum одинаковы, и можно уменьшить необходимое количество блоков Sum до двух. Затем несоответствие между знаками легко фиксируется введением блока «Унарный минус».
Затем расхождение устраняется, и эта модель теперь использует больше ресурсов, чем исходная.
Эта отредактированная модель сохраняется как hdlcoureParkTransformShare.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 уменьшилось после совместного использования.
Дополнительные сведения о том, как улучшить совместное использование ресурсов с автоматической заменой повторяющихся шаблонов с помощью приложения Clone Detection, см. в разделе Улучшение совместного использования ресурсов с помощью Clone Detection and Replacement.