В этом примере показано, как 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, сравнит числа между синтезированной и исходной моделью в каждых временных шагах и выдаст утверждение о несоответствии.