Улучшите разделение ресурсов с модификациями проекта

В этом примере показано, как улучшить возможности для разделения ресурсов, чтобы оптимизировать ваш проект модели путем создания определенных модификаций к проекту. Разделение ресурсов является оптимизацией 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'...
### <a href="matlab:configset.internal.open('hdlcoderParkTransformCopy','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware.  To disable pipeline insertion for mapping lookup tables to RAM, set the option to 'Off'.
### 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/BR2021bd_1724986_151598/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/BR2021bd_1724986_151598/publish_examples1/hdlcoderParkTransformDir/hdl_prj/hdlsrc/hdlcoderParkTransformCopy/DUT_report.html
### HDL check for 'hdlcoderParkTransformCopy' complete with 0 errors, 1 warnings, and 2 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 из Модели Simulink.

Выявите закономерности в модели

На последующий анализ модели вы видите, что существует несколько шаблонов, которые могут быть изменены, чтобы улучшить разделение ресурсов.

Первое такой шаблон с Добавлением, и Вычтите блоки, имена которых запускаются с "AddSub" и чей выход переходит к блокам Sin.

Второй шаблон соответствует Сумме (как сложение или вычитание) блок, сопровождаемый блоком Gain.

В обоих из этих шаблонов существуют некоторые несходства в подсвеченных блоках, которые предотвращают разделение ресурсов оптимально. Несходства следующие:

Во-первых, знаки блоков Суммы в области около блоков Усиления отличаются. Идя сверху донизу, знаками является +++ и ---.

Можно зафиксировать это несоответствие со следующими изменениями:

  1. Переключите знаки нижнего блока Sum из --- к +++

  2. Сделайте три нижних блока Sin с блоками Cos.

  3. Измените вход в блок Cos и два нижних блока Суммы от Inport 5 "ShiftedTheta" до "theta" Inport 4.

Во-вторых, знаки блоков Суммы в различных областях отличаются. Идя от от начала до конца, знаками является +-, ++, +- и ++.

Прямо сейчас блоки с обоими положительными знаками совместно используются отдельно от блоков с чередованием знаков, требуя большего количества ресурсов. Можно упростить модель далее, чтобы сократить количество блоков Суммы в модели при улучшении разделения ресурсов. Вход с блоками Суммы является тем же самым, и можно сократить количество Суммы, блокирует вас, нуждаются к два. Затем несоответствие между между знаками легко фиксируется путем представления блока 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'...
### <a href="matlab:configset.internal.open('hdlcoderParkTransformShareCopy','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware.  To disable pipeline insertion for mapping lookup tables to RAM, set the option to 'Off'.
### 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/BR2021bd_1724986_151598/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/BR2021bd_1724986_151598/publish_examples1/hdlcoderParkTransformDir/hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_report.html
### HDL check for 'hdlcoderParkTransformShareCopy' complete with 0 errors, 1 warnings, and 2 messages.
### HDL code generation complete.

После создания тех модификаций проекта Нативный Отчет Ресурса С плавающей точкой показывает обновленные необходимые операторы:

             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

Заметьте, что Срез LUTs, Регистры Среза и количества DSPS уменьшал после совместного использования.

Чтобы изучить, как можно далее улучшить разделение ресурсов с автоматически заменой повторяющихся шаблонов с помощью приложения Обнаружения клонов, смотрите, Улучшают Разделение ресурсов с Обнаружением клонов и Заменой.

Для просмотра документации необходимо авторизоваться на сайте