Односкоростная архитектура совместного использования ресурсов

В этом примере показано, как HDL- Coder™ управляет выполнением операций в контексте конвейеризации тактовой частоты. По умолчанию, если разделение ресурсов применяется в области проекта, работающей с самой быстрой базовой частотой дискретизации, то синтезируется локальная многоскоростная архитектура, как описано в Resource Sharing For Area Optimization. Если общие ресурсы работают с более медленной частотой дискретизации и включена конвейеризация тактовой частоты, то генератор кода синтезирует архитектуру с одной скоростью, которая описана в этом примере.

Конвейеризация тактовой частоты является оптимизацией, которая находит островки логики в проекте Simulink, который работает с данными с более медленной частотой дискретизации и вставляет логику конвейеризации и совместного использования ресурсов с (более быстрой) тактовой частотой. В этих случаях совместное использование ресурсов реализуется как временная мультиплексированная архитектура, которая работает с одной скоростью и несет задержку. В порядок организовать выполнение зависимых операций и управлять введенной дополнительной задержкой, HDL Coder(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. Эта модель устанавливает Избыточную дискретизацию = 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 _ совместное использование _ 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 _ совместное использование _ vnl/Subsystem/share присвоен временной интервал [2, 3]. Это связано с тем, что блок «hdlcoder _ singlerate _ sharing/Subsystem/Sum _ piped» с OutputPipeline = 2 находится на пути между входами DUT и входами в эту подсистему. Общая подсистема начинает выполнение в шаге 2 времени и, поскольку SharingFactor = 3, принимает (3-1 = 2) циклы, чтобы завершить. Вход enable в 'gm _ hdlcoder _ singlerate _ совместное использование _ vnl/Subsystem/share/crp _ temp _ shared' утверждается только тогда, когда глобальный счетчик больше или равен 2 или меньше или равен 3.

В дополнение к потоковым и совместно используемым подсистемам генератор кода также планирует любые блоки или подсистемы, содержащие состояние, или реализует многоциклические операции. Например, в проекте используется умножение-накопление блока, который вычисляет точечное произведение на двух векторах с 4 элементами (см. 'gm _ hdlcoder _ singlerate _ совместное использование _ 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', запланирована во времени

Сгенерированная модель валидации имеет нетривиальные изменения, но точно описывает суть синтезированной архитектуры совместного использования с одной скоростью. Эта модель также сравнивает цифры этой синтезированной архитектуры с исходной моделью по модулю добавленной задержки. Для получения дополнительной информации смотрите Рабочий процесс балансировки задержки и модели валидации В HDL- Coder™. Выполнение модели валидации, нажатием кнопки play, сравнит числа между синтезированной и исходной моделью в каждых временных шагах и выдаст утверждение о несоответствии.