В этом примере показано, как HDL Coder™ управляет выполнением операций в контексте конвейеризации тактовой частоты. По умолчанию, если совместное использование ресурсов применяется в области конструкции, работающей с самой высокой базовой частотой дискретизации, то синтезируется локальная многоскоростная архитектура, как описано в разделе Совместное использование ресурсов для оптимизации области. Если совместно используемые ресурсы работают с более медленной частотой дискретизации и включена конвейеризация тактовой частоты, то генератор кода синтезирует односкоростную архитектуру, которая описана в этом примере.
Конвейеризация тактовой частоты - это оптимизация, которая находит островки логики в конструкции Simulink, которая работает с данными с более медленной частотой дискретизации и вставляет конвейерную логику и логику совместного использования ресурсов с (более быстрой) тактовой частотой. В этих случаях совместное использование ресурсов реализуется как архитектура с временным мультиплексированием, которая работает с одной скоростью и имеет задержку. Чтобы упорядочить выполнение зависимых операций и управлять введенной дополнительной задержкой, кодер HDL (TM) синтезирует соответствующую логику планирования. Рассмотрим модель, hdlcoder_singlerate_sharing.slx.
bdclose('all'); load_system('hdlcoder_singlerate_sharing'); open_system('hdlcoder_singlerate_sharing/Subsystem'); set_param('hdlcoder_singlerate_sharing', 'SimulationCommand', 'update');

Эта модель имеет ограничение избыточной дискретизации, установленное с помощью коэффициента избыточной дискретизации, который определяет, насколько быстрее тактовая частота FPGA работает по отношению к базовому времени выборки Simulink. Эта модель устанавливает Oversampling = 30, что по существу означает, что конвейерная область тактовой частоты может потреблять 30 тактовых циклов для завершения выполнения.
Опции оптимизации для отдельных блоков и подсистем перечислены ниже. Давайте создадим код и проверим модель проверки, чтобы понять односкоростную архитектуру совместного использования.
hdlsaveparams('hdlcoder_singlerate_sharing/Subsystem'); makehdl('hdlcoder_singlerate_sharing/Subsystem');
%% Set Model 'hdlcoder_singlerate_sharing' HDL parameters
hdlset_param('hdlcoder_singlerate_sharing', 'GenerateValidationModel', 'on');
hdlset_param('hdlcoder_singlerate_sharing', 'HDLSubsystem', 'hdlcoder_singlerate_sharing');
hdlset_param('hdlcoder_singlerate_sharing', 'OptimizationReport', 'on');
hdlset_param('hdlcoder_singlerate_sharing', 'Oversampling', 30);
% Set SubSystem HDL parameters
hdlset_param('hdlcoder_singlerate_sharing/Subsystem', 'DistributedPipelining', 'on');
hdlset_param('hdlcoder_singlerate_sharing/Subsystem/Sum_piped', 'Architecture', 'Tree');
% Set Sum HDL parameters
hdlset_param('hdlcoder_singlerate_sharing/Subsystem/Sum_piped', 'OutputPipeline', 2);
% Set SubSystem HDL parameters
hdlset_param('hdlcoder_singlerate_sharing/Subsystem/share', 'SharingFactor', 2);
% Set SubSystem HDL parameters
hdlset_param('hdlcoder_singlerate_sharing/Subsystem/stream1', 'StreamingFactor', 2);
% Set Delay HDL parameters
hdlset_param('hdlcoder_singlerate_sharing/Subsystem/stream1/Delay', 'UseRAM', 'on');
% Set SubSystem HDL parameters
hdlset_param('hdlcoder_singlerate_sharing/Subsystem/stream2', 'StreamingFactor', 4);
### Begin compilation of the model 'hdlcoder_singlerate_sharing'...
### Generating HDL for 'hdlcoder_singlerate_sharing/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_singlerate_sharing', { 'HDL Code Generation' } )">hdlcoder_singlerate_sharing</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoder_singlerate_sharing'.
### Applying HDL optimizations on the model 'hdlcoder_singlerate_sharing'...
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 1: 1 cycles.
### Begin model generation.
### Model generation complete.
### Clock-rate pipelining results can be diagnosed by running this script: <a href="matlab:run('hdlsrc/hdlcoder_singlerate_sharing/highlightClockRatePipelining')">hdlsrc/hdlcoder_singlerate_sharing/highlightClockRatePipelining.m</a>
### To highlight blocks that obstruct distributed pipelining, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoder_singlerate_sharing/highlightDistributedPipeliningBarriers')">hdlsrc/hdlcoder_singlerate_sharing/highlightDistributedPipeliningBarriers.m</a>
### To clear highlighting, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoder_singlerate_sharing/clearhighlighting.m')">hdlsrc/hdlcoder_singlerate_sharing/clearhighlighting.m</a>
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_singlerate_sharing_vnl')">gm_hdlcoder_singlerate_sharing_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_singlerate_sharing'.
### MESSAGE: The design requires 30 times faster clock with respect to the base rate = 0.1.
### Working on crp_temp_shared as hdlsrc/hdlcoder_singlerate_sharing/crp_temp_shared.vhd.
### Working on hdlcoder_singlerate_sharing/Subsystem/share as hdlsrc/hdlcoder_singlerate_sharing/share.vhd.
### Working on crp_temp_streamed as hdlsrc/hdlcoder_singlerate_sharing/crp_temp_streamed.vhd.
### Working on crp_temp_streamed_block as hdlsrc/hdlcoder_singlerate_sharing/crp_temp_streamed_block.vhd.
### Working on hdlcoder_singlerate_sharing/Subsystem/stream1 as hdlsrc/hdlcoder_singlerate_sharing/stream1.vhd.
### Working on crp_temp_streamed_block1 as hdlsrc/hdlcoder_singlerate_sharing/crp_temp_streamed_block1.vhd.
### Working on crp_temp_streamed_block2 as hdlsrc/hdlcoder_singlerate_sharing/crp_temp_streamed_block2.vhd.
### Working on hdlcoder_singlerate_sharing/Subsystem/stream2 as hdlsrc/hdlcoder_singlerate_sharing/stream2.vhd.
### Working on crp_temp_MAC as hdlsrc/hdlcoder_singlerate_sharing/crp_temp_MAC.vhd.
### Working on Subsystem_tc as hdlsrc/hdlcoder_singlerate_sharing/Subsystem_tc.vhd.
### Working on hdlcoder_singlerate_sharing/Subsystem as hdlsrc/hdlcoder_singlerate_sharing/Subsystem.vhd.
### Generating package file hdlsrc/hdlcoder_singlerate_sharing/Subsystem_pkg.vhd.
### Code Generation for 'hdlcoder_singlerate_sharing' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples4/tp687696c7/hdlsrc/hdlcoder_singlerate_sharing/html/hdlcoder_singlerate_sharing_codegen_rpt.html');">hdlcoder_singlerate_sharing_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples4/tp687696c7/hdlsrc/hdlcoder_singlerate_sharing/Subsystem_report.html
### HDL check for 'hdlcoder_singlerate_sharing' complete with 0 errors, 3 warnings, and 5 messages.
### HDL code generation complete.
На глобальном уровне кодер планирует каждую из этих локально совместно используемых и потоковых подсистем в соответствии с их задержкой. Единица планирования представляет собой конвейерную область тактовой частоты, которая была автоматически идентифицирована кодером. Для каждой такой области используется простой блок счетчика в качестве указателя последовательности для логики планирования. Счетчик подсчитывает от нуля до (бюджет тактовой частоты - 1), где бюджет определяется как отношение частоты выборки совместно используемого ресурса к тактовой частоте FPGA. В этом примере бюджет равен 30, потому что мы установили избыточную выборку = 30. Генератор кода назначает временной интервал, в течение которого выполняется каждая потоковая и совместно используемая подсистема: в частности, сама подсистема инкапсулируется в включенную подсистему так, что она активна только в течение этого временного интервала. Значение счетчика или секвенсора определяет текущий шаг времени, и логика, которая вычисляет интервал времени, управляет входами разрешения для этих подсистем.
Для каждой подсистемы, которая определяет совместное использование ресурсов или потоковую передачу, односкоростная архитектура совместного использования ресурсов реализует мультиплексирование с временным разделением. Например, см. «gm _ hdlcoder _ singlerate _ sharing _ vnl/Subsystem/share». Если SharingFactor = N, требуется (N-1) циклов для выполнения общей архитектуры на цикл исходного вычисления.
open_system('gm_hdlcoder_singlerate_sharing_vnl/Subsystem/share'); set_param('gm_hdlcoder_singlerate_sharing_vnl', 'SimulationCommand', 'update');

Обратите внимание, что «gm _ hdlcoder _ singlerate _ sharing _ vnl/Subsystem/share» назначен интервал времени [2, 3]. Это происходит потому, что блок суммы элементов «hdlcoder _ singlerate _ sharing/Subsystem/Sum _ piped» с OutputPipeline = 2 находится на пути между входами DUT и входами в эту подсистему. Совместно используемая подсистема начинает выполнение во временном шаге 2 и, поскольку SharingFactor = 3, выполняет (3-1 = 2) циклы. Параметр enable input to 'gm _ hdlcoder _ singlerate _ sharing _ vnl/Subsystem/share/crp _ temp _ shared' устанавливается только в том случае, если глобальный счетчик больше или равен 2 или меньше или равен 3.
Помимо потоковых и совместно используемых подсистем, генератор кода также планирует любые блоки или подсистемы, содержащие состояние или реализующие многоцикловые операции. Например, в конструкции используется блок умножения-накопления, который вычисляет скалярное произведение на двух 4-элементных векторах (см. 'gm _ hdlcoder _ singlerate _ sharing _ vnl/Subsystem/crp _ temp _ MAC'). Для этого требуется 4 цикла, которые планируются в интервале времени [4, 7]. Это происходит потому, что на пути от входов к этому блоку умножения-накопления находятся две области потока. Первая область потоковой передачи, gm _ hdlcoder _ singlerate _ sharing _ vnl/Subsystem/stream1, запланирована во временном интервале [0, 1] из-за коэффициента потоковой передачи 2, а вторая область потоковой передачи, gm _ hdlcoder _ singlerate _ sharing _ vnl/Subsystem/stream2, запланирована во временном интервале [1, 4] из-фактора потоковой передачи 4
Созданная модель проверки имеет нетривиальные изменения, но точно отражает суть синтезированной архитектуры разделения одной скорости. Эта модель также сравнивает цифры этой синтезированной архитектуры с исходной моделью по модулю добавленной задержки. Дополнительные сведения см. в разделе Рабочий процесс модели балансировки и проверки задержки в Coder™ HDL. Запуск модели проверки путем нажатия кнопки воспроизведения сравнивает числа между синтезированной и исходной моделью в каждом шаге времени и выдает утверждение о несоответствиях.