В этом примере показано, как 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); ### 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/BR2021bd_1724986_151598/publish_examples4/tpe7e54b58/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/BR2021bd_1724986_151598/publish_examples4/tpe7e54b58/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™. Выполнение модели валидации, путем нажатия кнопки воспроизведения, сравнит численные данные между синтезируемым и исходной моделью в каждом временные шаги и выдаст утверждение на несоответствиях.