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

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

Конвейеризация тактовой частоты является оптимизацией, которая находит острова логики в проекте 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);

### 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.
### Starting HDL check.
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 0: 1 cycles.
### 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.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2020bd_1444674_32127/publish_examples4/tpaa9d743b/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/BR2020bd_1444674_32127/publish_examples4/tpaa9d743b/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) циклы, чтобы завершиться. Разрешать вход к '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.

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