Конвейеризация тактовой частоты

В этом примере показано, как применить конвейеризацию тактовой частоты, чтобы оптимизировать медленные пути в вашем проекте и таким образом уменьшать задержку, увеличить частоту часов и использование области уменьшения. Для получения дополнительной информации о том, как использовать конвейеризацию тактовой частоты, обратитесь к документации конвейеризации тактовой частоты.

Введение

Алгоритмический проект с Simulink может ввести многих низкая скорость datapaths в сгенерированном проекте HDL. Эти медленные пути соответствуют более медленным операциям шага расчета Simulink или даже из-за алгоритмической скорости передачи данных, действующей на более медленном уровне, чем тактовая частота HDL.

Конвейеризация тактовой частоты идентифицирует максимальные подобласти в модели, действующей на той же скорости передачи данных, и разграничена или блоками изменения уровня или блоками задержки. Эти подобласти называются областями тактовой частоты, потому что они делают хороших кандидатов на конвейеризацию тактовой частоты. Если выход области тактовой частоты является блоком Delay на скорости передачи данных, то HDL Coder поглощает тот блок Delay. Это позволяет бюджет нескольких конвейеров тактовой частоты, соответствующих отношению скорости передачи данных к тактовой частоте.

Рассмотрите Ориентированный на поле пример управления. Это описывает проект блока управления приводом, который будет сопоставлен с FPGA. Входные выборки в этом проекте прибывают каждые 20 или 50 кГц. В закрытом цикле управления важно, чтобы задержка диспетчера была в течение желаемого времени отклика. В этой модели существует задержка на выходном порте, приводящем к задержке 20.

Чтобы соответствовать конструктивным ограничениям как синхронизация и область, мы можем хотеть применить несколько оптимизации как конвейеризация ввода/вывода, распределенная конвейеризация, потоковая передача и/или совместное использование. Далее, нетривиальные математические функции как sqrt или деление, вероятно, придется реализовать, когда мультицикл конвейерно обработал операции. Конвейеры, введенные любой из вышеупомянутых функций и оптимизации, применяются на том же уровне, на котором действует путь прохождения сигнала, который равняется 20. Таким образом представление любой дополнительной конвейеризации вводит нежелательную задержку наверху и может нарушить бюджет задержки замкнутого цикла.

Однако FPGA может реализовать этот контроллер в порядке МГц, что означает, что введенные конвейеры могут затем действовать на уровне МГц, таким образом, минимизирующем удар на задержку. Конвейеризация тактовой частоты является методом, чтобы усилить этот дифференциал уровня, конвейерно обработать контроллер и таким образом улучшить его область и характеристики синхронизации на FPGA. Этот пример идет через шаги для взятия этого проекта и инкрементно применения синхронизации и оптимизации области с помощью конвейеризации тактовой частоты.

Подготовка модели

Важный первый шаг в применении конвейеризации тактовой частоты должен подготовить модель так, чтобы это поддавалось конвейеризации тактовой частоты. Ниже некоторые основные шаги:

  • Определение дифференциала уровня: Пути прохождения сигнала в Simulink заканчиваются на медленных путях в HDL из-за двух основных причин. Во-первых, путь прохождения сигнала действует в шаге расчета, который медленнее, чем основной шаг расчета модели. Во-вторых, базовый шаг расчета Simulink может соответствовать скорости передачи данных вместо тактовой частоты. Например, основной шаг расчета в hdlcoderFocCurrentFixptHdl.slx модели является 20 secs. Итоговая реализация FPGA контроллера может предназначаться для 40 МГц (или 25 нс). Проблема установить шаг расчета модели на 25 нс состоит в том, что он решительно замедляет производительность симуляции Simulink. Чтобы обойти это, HDL Coder обеспечивает установку, названную Сверхдискретизацией, которая задает, насколько быстрее тактовая частота FPGA запускается относительно базового шага расчета Simulink. Таким образом, в этом случае, мы требуем 800x сверхдискретизация.

  • Установите оптимизацию на подсистемах: Для проектов фиксированной точки конвейеризация тактовой частоты применяется на Подсистему только, когда кодер должен вставить конвейеризацию. Опции HDL Coder, которые приводят к введению конвейеризации, распределяются, конвейерно обрабатывая, совместно используя, передавая потоком, конвейеризация ввода/вывода, ограниченный выходной конвейер, адаптивная конвейеризация и любые реализации блока, которые вводят реализации мультицикла включая реализации с плавающей точкой (для получения дополнительной информации, обратитесь к документации относительно отдельных блоков, чтобы изучить удар их свойств HDL на задержке. Оптимизация может быть применена или локально путем поддержания иерархий подсистемы или глобально если базовые подсистемы все сглажены. В бывшем случае примените настройки конвейеризации и оптимизации на отдельные подсистемы и в глобальном случае, эти настройки должны быть на подсистеме верхнего уровня. Смотрите, что иерархия сглаживается для получения дополнительной информации о предпосылках для Выравнивания Иерархии.

Применение конвейеризации тактовой частоты

Теперь мы готовы применить конвейеризацию тактовой частоты. Опция функции идет по умолчанию и автоматически найдет области тактовой частоты. Смотрите, что тактовая частота конвейерно обрабатывает документацию, чтобы изучить, как конвейерный бюджет определяется и как формируются области тактовой частоты.

srcHdlModel = 'hdlcoderFocCurrentFixptHdl';
dstHdlModel = 'hdlcoderFocClockRatePipelining';
dstHdlDut   = [dstHdlModel '/FOC_Current_Control'];
gmHdlModel  = ['gm_' dstHdlModel];
gmHdlDut    = ['gm_' dstHdlDut];

open_system(srcHdlModel);
save_system(srcHdlModel,dstHdlModel);

FOC_Current_Control подсистемы содержит алгоритм, из которого мы сгенерируем HDL-код

open_system(dstHdlDut);

Мы можем теперь сконфигурировать модель, чтобы использовать конвейеризацию тактовой частоты.

hdlset_param(dstHdlModel, 'ClockRatePipelining', 'on');
hdlset_param(dstHdlModel, 'Oversampling', 800);
hdlset_param(dstHdlDut, 'DistributedPipelining', 'on');
set_param([dstHdlDut '/DQ_Current_Control/D_Current_Control'], 'TreatAsAtomicUnit', 'off');
set_param([dstHdlDut '/DQ_Current_Control/Q_Current_Control'], 'TreatAsAtomicUnit', 'off');

hdlset_param([dstHdlDut '/DQ_Current_Control/D_Current_Control'], 'DistributedPipelining', 'on');
hdlset_param([dstHdlDut '/DQ_Current_Control/Q_Current_Control'], 'DistributedPipelining', 'on');

hdlset_param([dstHdlDut '/Clarke_Transform'], 'DistributedPipelining', 'on');
hdlset_param([dstHdlDut '/Park_Transform'], 'DistributedPipelining', 'on');
hdlset_param([dstHdlDut '/Sine_Cosine'], 'DistributedPipelining', 'on');
hdlset_param([dstHdlDut '/Inverse_Park_Transform'], 'DistributedPipelining', 'on');
hdlset_param([dstHdlDut '/Inverse_Clarke_Transform'], 'DistributedPipelining', 'on');
hdlset_param([dstHdlDut '/Space_Vector_Modulation'], 'DistributedPipelining', 'on');

save_system(dstHdlModel);

Чтобы видеть удар конвейеризации тактовой частоты, сгенерируйте HDL-код и взгляд в подсистеме верхнего уровня сгенерированной модели.

makehdl(dstHdlDut);
### Generating HDL for 'hdlcoderFocClockRatePipelining/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocClockRatePipelining', { 'HDL Code Generation' } )">hdlcoderFocClockRatePipelining</a> for HDL code generation parameters.
### Starting HDL check.
### To highlight blocks that obstruct distributed pipelining, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoderFocClockRatePipelining/highlightDistributedPipeliningBarriers')">hdlsrc/hdlcoderFocClockRatePipelining/highlightDistributedPipeliningBarriers.m</a>
### To clear highlighting, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoderFocClockRatePipelining/clearhighlighting.m')">hdlsrc/hdlcoderFocClockRatePipelining/clearhighlighting.m</a>
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoderFocClockRatePipelining_vnl')">gm_hdlcoderFocClockRatePipelining_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoderFocClockRatePipelining'.
### MESSAGE: The design requires 800 times faster clock with respect to the base rate = 2e-05.
### Working on hdlcoderFocClockRatePipelining/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate_Output as hdlsrc/hdlcoderFocClockRatePipelining/Saturate_Output.vhd.
### Working on hdlcoderFocClockRatePipelining/FOC_Current_Control/DQ_Current_Control/D_Current_Control as hdlsrc/hdlcoderFocClockRatePipelining/D_Current_Control.vhd.
### Working on hdlcoderFocClockRatePipelining/FOC_Current_Control/DQ_Current_Control/Q_Current_Control/Saturate_Output as hdlsrc/hdlcoderFocClockRatePipelining/Saturate_Output_block.vhd.
### Working on hdlcoderFocClockRatePipelining/FOC_Current_Control/DQ_Current_Control/Q_Current_Control as hdlsrc/hdlcoderFocClockRatePipelining/Q_Current_Control.vhd.
### Working on hdlcoderFocClockRatePipelining/FOC_Current_Control/DQ_Current_Control as hdlsrc/hdlcoderFocClockRatePipelining/DQ_Current_Control.vhd.
### Working on hdlcoderFocClockRatePipelining/FOC_Current_Control/Sine_Cosine/Sine_Cosine_LUT as hdlsrc/hdlcoderFocClockRatePipelining/Sine_Cosine_LUT.vhd.
### Working on hdlcoderFocClockRatePipelining/FOC_Current_Control/Sine_Cosine as hdlsrc/hdlcoderFocClockRatePipelining/Sine_Cosine.vhd.
### Working on hdlcoderFocClockRatePipelining/FOC_Current_Control/Clarke_Transform as hdlsrc/hdlcoderFocClockRatePipelining/Clarke_Transform.vhd.
### Working on hdlcoderFocClockRatePipelining/FOC_Current_Control/Park_Transform as hdlsrc/hdlcoderFocClockRatePipelining/Park_Transform.vhd.
### Working on hdlcoderFocClockRatePipelining/FOC_Current_Control/Inverse_Park_Transform as hdlsrc/hdlcoderFocClockRatePipelining/Inverse_Park_Transform.vhd.
### Working on hdlcoderFocClockRatePipelining/FOC_Current_Control/Inverse_Clarke_Transform as hdlsrc/hdlcoderFocClockRatePipelining/Inverse_Clarke_Transform.vhd.
### Working on hdlcoderFocClockRatePipelining/FOC_Current_Control/Space_Vector_Modulation as hdlsrc/hdlcoderFocClockRatePipelining/Space_Vector_Modulation.vhd.
### Working on FOC_Current_Control_tc as hdlsrc/hdlcoderFocClockRatePipelining/FOC_Current_Control_tc.vhd.
### Working on hdlcoderFocClockRatePipelining/FOC_Current_Control as hdlsrc/hdlcoderFocClockRatePipelining/FOC_Current_Control.vhd.
### Generating package file hdlsrc/hdlcoderFocClockRatePipelining/FOC_Current_Control_pkg.vhd.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2019bd_1170825_64229/publish_examples6/tp2ee3fced/hdlsrc/hdlcoderFocClockRatePipelining/html/hdlcoderFocClockRatePipelining_codegen_rpt.html');">hdlcoderFocClockRatePipelining_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples6/tp2ee3fced/hdlsrc/hdlcoderFocClockRatePipelining/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocClockRatePipelining' complete with 0 errors, 0 warnings, and 2 messages.
### HDL code generation complete.

Мы можем рассмотреть сгенерированную модель и заметить, что целый проект был конвейерной Тактовой частотой и запускается на высокой скорости. Если существуют подсистемы в сгенерированной модели, которые не являются тактовой частотой, конвейерной, затем проверяют (как упомянуто выше), если был набор оптимизации на подсистеме в исходной модели.

open_system(gmHdlDut);
set_param(gmHdlModel, 'SimulationCommand', 'update');
set_param(gmHdlDut, 'ZoomFactor', 'FitSystem');

% Further, rate-transitions are introduced on the design inputs to bring them
% to the clock-rate, which is determined as the original base sample time divided by the Oversampling factor,
% which is 2e-5/800 = 2.5e-8 or 25 ns. All pipelines are introduced at this rate and are thus operating at the clock-rate.
% Finally, observe that the output-side delay has been replaced by a down-sampling
% rate transition bringing the signal back to the data-rate. The clock frequency of the design was improved by inserting pipelines at the clock-rate, without incurring any additional sample time delays.

Как со всей оптимизацией, рекомендуется, чтобы модель валидации и co-имитационная-модель были сгенерированы, и пользователь проверяет, что функциональное поведение проекта неизменно. Страницы документации верификации описывают эти концепции в большей глубине.

Локальная оптимизация с опциями подсистемы

Дифференциал уровня на медленном пути подразумевает, что расчет вдоль этого пути может взять несколько тактов. А именно, позволенная задержка задана бюджетом тактовой частоты (см., что тактовая частота конвейерно обрабатывает документацию). Кроме добавления конвейеров, чтобы улучшить частоту часов, мы могли снова использовать аппаратные ресурсы путем усиления бюджета задержки. Установка опций разделения ресурсов как StreamingFactor и SharingFactor в области медленного пути делает точно это. Этот раздел демонстрирует, как разделение ресурсов применяется в областях тактовой частоты.

Когда разделение ресурсов применяется к пути тактовой частоты, HDL Coder сверхдискретизировал архитектуру совместно используемого ресурса для мультиплексирования времени, как проиллюстрировано в примере Разделения ресурсов. Однако, если совместное использование или потоковую передачу требуют в медленном datapath, затем HDL Coder реализует разделение ресурсов без сверхдискретизации. Чтобы инициировать такое совместное использование, установите или совместное использование или потоковую передачу на подсистеме, на которую вы хотите применить разделение ресурсов или потоковую передачу.

srcHdlModel = 'hdlcoderFocClockRatePipelining';
dstHdlModel = 'hdlcoderFocSharing';
dstHdlDut   = [dstHdlModel '/FOC_Current_Control'];
gmHdlModel  = ['gm_' dstHdlModel];
gmHdlDut    = ['gm_' dstHdlDut];

open_system(srcHdlModel);
save_system(srcHdlModel,dstHdlModel);

open_system(dstHdlDut);
hilite_system([dstHdlDut '/Park_Transform']);
hilite_system([dstHdlDut '/Inverse_Park_Transform']);
hilite_system([dstHdlDut '/Clarke_Transform']);

Подсистема Park_Transform и подсистема Inverse_Park_Transform каждое использование 4 множителя в них, которые могут быть потенциально совместно использованы. Кроме того, подсистема Clarke_Transform и подсистема Inverse_Clarke_Transform каждое использование 2 усиления, которые могут быть потенциально совместно использованы, если они не просто power-2 усиления, который приводит к сдвигам вместо умножения. Следовательно, усиление в Inverse_Clarke_Transform не может быть совместно использовано. Теперь мы можем установить соответствующие факторы совместного использования на каждой подсистеме, на которую мы хотим применить разделение ресурсов.

hdlset_param([dstHdlDut '/Park_Transform'], 'SharingFactor', 4);
hdlset_param([dstHdlDut '/Inverse_Park_Transform'], 'SharingFactor', 4);
hdlset_param([dstHdlDut '/Clarke_Transform'], 'SharingFactor', 2);

save_system(dstHdlModel);

makehdl(dstHdlDut);
### Generating HDL for 'hdlcoderFocSharing/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocSharing', { 'HDL Code Generation' } )">hdlcoderFocSharing</a> for HDL code generation parameters.
### Starting HDL check.
### To highlight blocks that obstruct distributed pipelining, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoderFocSharing/highlightDistributedPipeliningBarriers')">hdlsrc/hdlcoderFocSharing/highlightDistributedPipeliningBarriers.m</a>
### To clear highlighting, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoderFocSharing/clearhighlighting.m')">hdlsrc/hdlcoderFocSharing/clearhighlighting.m</a>
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoderFocSharing_vnl')">gm_hdlcoderFocSharing_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoderFocSharing'.
### MESSAGE: The design requires 800 times faster clock with respect to the base rate = 2e-05.
### Working on hdlcoderFocSharing/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate_Output as hdlsrc/hdlcoderFocSharing/Saturate_Output.vhd.
### Working on hdlcoderFocSharing/FOC_Current_Control/DQ_Current_Control/D_Current_Control as hdlsrc/hdlcoderFocSharing/D_Current_Control.vhd.
### Working on hdlcoderFocSharing/FOC_Current_Control/DQ_Current_Control/Q_Current_Control/Saturate_Output as hdlsrc/hdlcoderFocSharing/Saturate_Output_block.vhd.
### Working on hdlcoderFocSharing/FOC_Current_Control/DQ_Current_Control/Q_Current_Control as hdlsrc/hdlcoderFocSharing/Q_Current_Control.vhd.
### Working on hdlcoderFocSharing/FOC_Current_Control/DQ_Current_Control as hdlsrc/hdlcoderFocSharing/DQ_Current_Control.vhd.
### Working on Clarke_Transform_shared as hdlsrc/hdlcoderFocSharing/Clarke_Transform_shared.vhd.
### Working on hdlcoderFocSharing/FOC_Current_Control/Clarke_Transform as hdlsrc/hdlcoderFocSharing/Clarke_Transform.vhd.
### Working on Park_Transform_shared as hdlsrc/hdlcoderFocSharing/Park_Transform_shared.vhd.
### Working on hdlcoderFocSharing/FOC_Current_Control/Park_Transform as hdlsrc/hdlcoderFocSharing/Park_Transform.vhd.
### Working on hdlcoderFocSharing/FOC_Current_Control/Sine_Cosine/Sine_Cosine_LUT as hdlsrc/hdlcoderFocSharing/Sine_Cosine_LUT.vhd.
### Working on hdlcoderFocSharing/FOC_Current_Control/Sine_Cosine as hdlsrc/hdlcoderFocSharing/Sine_Cosine.vhd.
### Working on Sine_Cosine_nw as hdlsrc/hdlcoderFocSharing/Sine_Cosine_nw.vhd.
### Working on Inverse_Park_Transform_shared as hdlsrc/hdlcoderFocSharing/Inverse_Park_Transform_shared.vhd.
### Working on hdlcoderFocSharing/FOC_Current_Control/Inverse_Park_Transform as hdlsrc/hdlcoderFocSharing/Inverse_Park_Transform.vhd.
### Working on hdlcoderFocSharing/FOC_Current_Control/Inverse_Clarke_Transform as hdlsrc/hdlcoderFocSharing/Inverse_Clarke_Transform.vhd.
### Working on Inverse_Clarke_Transform_nw as hdlsrc/hdlcoderFocSharing/Inverse_Clarke_Transform_nw.vhd.
### Working on hdlcoderFocSharing/FOC_Current_Control/Space_Vector_Modulation as hdlsrc/hdlcoderFocSharing/Space_Vector_Modulation.vhd.
### Working on Space_Vector_Modulation_nw as hdlsrc/hdlcoderFocSharing/Space_Vector_Modulation_nw.vhd.
### Working on FOC_Current_Control_tc as hdlsrc/hdlcoderFocSharing/FOC_Current_Control_tc.vhd.
### Working on hdlcoderFocSharing/FOC_Current_Control as hdlsrc/hdlcoderFocSharing/FOC_Current_Control.vhd.
### Generating package file hdlsrc/hdlcoderFocSharing/FOC_Current_Control_pkg.vhd.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2019bd_1170825_64229/publish_examples6/tp2ee3fced/hdlsrc/hdlcoderFocSharing/html/hdlcoderFocSharing_codegen_rpt.html');">hdlcoderFocSharing_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples6/tp2ee3fced/hdlsrc/hdlcoderFocSharing/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocSharing' complete with 0 errors, 0 warnings, and 2 messages.
### HDL code generation complete.

Мы можем рассмотреть сгенерированную модель и заметить, что HDL Coder реализует мультиплексирование времени в тактовой частоте с помощью знания доступного бюджета задержки из-за медленного datapath.

open_system(gmHdlDut);
set_param(gmHdlModel, 'SimulationCommand', 'update');
set_param(gmHdlDut, 'ZoomFactor', 'FitSystem');
hilite_system([gmHdlDut '/ctr_799']);
hilite_system([gmHdlDut '/ctr_7991']);
hilite_system([gmHdlDut '/Clarke_Transform/Clarke_Transform_shared']);
hilite_system([gmHdlDut '/Park_Transform/Park_Transform_shared']);
hilite_system([gmHdlDut '/Inverse_Park_Transform/Inverse_Park_Transform_shared']);

Мультиплексирующая время архитектура, также известная как односкоростную архитектуру совместного использования, описана в этом примере. Глобальный планировщик создается, чтобы включить и отключить различные области проекта с помощью, включил подсистемы. Позволять/запрещать управление реализовано с помощью ограниченного счетчика ctr_799 и ctr_7991, который рассчитывает в бюджет задержки (от 0 до 799). Разделяемые области реализованы как включенные подсистемы, которые включены согласно автоматически решительному порядку расписания. В этом проекте мы нашли 2 группы множителей, который был совместно использован 4 путями и 1 группой множителей, которая была совместно использована 2 путями. Счет множителя для проекта уменьшал с 20 до 13 без любых штрафов задержки.

Глобальная оптимизация с выравниванием

Глобальная оптимизация перекрестной подсистемы может быть применена путем усиления сглаживающей подсистему функции. С выравниванием существует больше количества ресурсов, которые могут быть совместно использованы на том же уровне иерархии. Чтобы инициировать такое совместное использование, установите или совместное использование или потоковую передачу на подсистеме верхнего уровня. Совместно использующее факторное выбранное значение должно быть верхней границей. Чтобы определить хорошее значение, использование ресурсов проекта должно анализироваться.

srcHdlModel = 'hdlcoderFocCurrentFixptHdl';
dstHdlModel = 'hdlcoderFocSharingWithFlattening';
dstHdlDut   = [dstHdlModel '/FOC_Current_Control'];
gmHdlModel  = ['gm_' dstHdlModel];
gmHdlDut    = ['gm_' dstHdlDut];

open_system(srcHdlModel);
save_system(srcHdlModel,dstHdlModel);

open_system(dstHdlDut);

hdlset_param(dstHdlModel, 'ClockRatePipelining', 'on');
hdlset_param(dstHdlModel, 'Oversampling', 800);
hdlset_param(dstHdlDut, 'FlattenHierarchy', 'on');
hdlset_param(dstHdlDut, 'DistributedPipelining', 'on');

hilite_system([dstHdlDut '/Park_Transform']);
hilite_system([dstHdlDut '/Inverse_Park_Transform']);
hilite_system([dstHdlDut '/Clarke_Transform']);
hilite_system([dstHdlDut '/Inverse_Clarke_Transform']);

Подсистема Park_Transform и подсистема Inverse_Park_Transform каждое использование 4 множителя в них, которые могут быть потенциально совместно использованы. Кроме того, подсистема Clarke_Transform и подсистема Inverse_Clarke_Transform каждое использование 2 усиления, которые могут быть потенциально совместно использованы, если они не просто power-2 усиления, который приводит к сдвигам вместо умножения. Поэтому мы можем выбрать значение верхней границы 4 для SharingFactor и сгенерировать код.

hdlset_param(dstHdlDut, 'SharingFactor', 4);
save_system(dstHdlModel);

makehdl(dstHdlDut);
### Generating HDL for 'hdlcoderFocSharingWithFlattening/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocSharingWithFlattening', { 'HDL Code Generation' } )">hdlcoderFocSharingWithFlattening</a> for HDL code generation parameters.
### Starting HDL check.
### To highlight blocks that obstruct distributed pipelining, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoderFocSharingWithFlattening/highlightDistributedPipeliningBarriers')">hdlsrc/hdlcoderFocSharingWithFlattening/highlightDistributedPipeliningBarriers.m</a>
### To clear highlighting, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoderFocSharingWithFlattening/clearhighlighting.m')">hdlsrc/hdlcoderFocSharingWithFlattening/clearhighlighting.m</a>
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoderFocSharingWithFlattening_vnl')">gm_hdlcoderFocSharingWithFlattening_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoderFocSharingWithFlattening'.
### MESSAGE: The design requires 800 times faster clock with respect to the base rate = 2e-05.
### Working on crp_temp_shared as hdlsrc/hdlcoderFocSharingWithFlattening/crp_temp_shared.vhd.
### Working on crp_temp_shared_block as hdlsrc/hdlcoderFocSharingWithFlattening/crp_temp_shared_block.vhd.
### Working on crp_temp_shared_block1 as hdlsrc/hdlcoderFocSharingWithFlattening/crp_temp_shared_block1.vhd.
### Working on crp_temp_shared_block2 as hdlsrc/hdlcoderFocSharingWithFlattening/crp_temp_shared_block2.vhd.
### Working on crp_temp_shared_block3 as hdlsrc/hdlcoderFocSharingWithFlattening/crp_temp_shared_block3.vhd.
### Working on FOC_Current_Control_tc as hdlsrc/hdlcoderFocSharingWithFlattening/FOC_Current_Control_tc.vhd.
### Working on hdlcoderFocSharingWithFlattening/FOC_Current_Control as hdlsrc/hdlcoderFocSharingWithFlattening/FOC_Current_Control.vhd.
### Generating package file hdlsrc/hdlcoderFocSharingWithFlattening/FOC_Current_Control_pkg.vhd.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2019bd_1170825_64229/publish_examples6/tp2ee3fced/hdlsrc/hdlcoderFocSharingWithFlattening/html/hdlcoderFocSharingWithFlattening_codegen_rpt.html');">hdlcoderFocSharingWithFlattening_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples6/tp2ee3fced/hdlsrc/hdlcoderFocSharingWithFlattening/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocSharingWithFlattening' complete with 0 errors, 0 warnings, and 2 messages.
### HDL code generation complete.

Мы можем рассмотреть сгенерированную модель и заметить, что HDL Coder реализует мультиплексирование времени в тактовой частоте с помощью знания доступного бюджета задержки из-за медленного datapath.

open_system(gmHdlDut);
set_param(gmHdlModel, 'SimulationCommand', 'update');
set_param(gmHdlDut, 'ZoomFactor', 'FitSystem');
hilite_system([gmHdlDut '/ctr_799']);
hilite_system([gmHdlDut '/crp_temp_shared']);
hilite_system([gmHdlDut '/crp_temp_shared1']);
hilite_system([gmHdlDut '/crp_temp_shared2']);
hilite_system([gmHdlDut '/crp_temp_shared3']);
hilite_system([gmHdlDut '/crp_temp_shared4']);

В этом проекте мы нашли пять групп множителей, которые были совместно использованы 4 путями или меньше. Эти 5 подсистем имеют crp_temp_shared как часть их имен.

Таким образом, счет множителя для проекта уменьшал с 20 до 7 без любых штрафов задержки в противоположность 13, когда проект не был сглажен.

Минимизация задержки

Как усовершенствованный маневр, возможно уменьшать выходную задержку путем удаления выхода Delay_Register и вместо этого использования опции, чтобы позволить конвейеризацию тактовой частоты выходных портов DUT.

srcHdlModel = 'hdlcoderFocSharing';
dstHdlModel = 'hdlcoderFocMinLatency';
dstHdlDut   = [dstHdlModel '/FOC_Current_Control'];
gmHdlModel  = ['gm_' dstHdlModel];
gmHdlDut    = ['gm_' dstHdlDut];

open_system(srcHdlModel);
save_system(srcHdlModel,dstHdlModel);

delete_line(dstHdlDut,'Space_Vector_Modulation/1','Delay_Register/1');
delete_line(dstHdlDut,'Delay_Register/1','Phase_Voltage/1');
delete_block([dstHdlDut,'/Delay_Register'])
add_line(dstHdlDut,'Space_Vector_Modulation/1','Phase_Voltage/1');

open_system(dstHdlDut);

Конвейеризация тактовой частоты для опции выходных портов доступна в диалоговом окне параметров конфигурации под вкладкой 'HDL Code Generation'-> 'Optimization'-> 'Pipelining': проверяйте, 'Позволяют конвейеризацию тактовой частоты' опции выходных портов DUT. Этим именем свойства командной строки этой опции является 'ClockRatePipelineOutputPorts'. Когда опция 'ClockRatePipelineOutputPorts' включена, и выходной регистр удален, сгенерированный HDL-код не ожидает полного демонстрационного шага, чтобы сгенерировать выход. Скорее это сгенерирует выход в нескольких тактах, как только данные готовы. Сгенерированный HDL-код сгенерирует выход на тактовой частоте, не ожидая следующего демонстрационного шага.

hdlset_param(dstHdlModel, 'ClockRatePipelineOutputPorts', 'on');
save_system(dstHdlModel);

makehdl(dstHdlDut);
### Generating HDL for 'hdlcoderFocMinLatency/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocMinLatency', { 'HDL Code Generation' } )">hdlcoderFocMinLatency</a> for HDL code generation parameters.
### Starting HDL check.
### Clock-rate pipelining was applied on signals connected to the DUT's output ports. The DUT output port values are therefore updated at the clock-rate. The following ports are phase-offset by the stated number of clock cycles.
### Phase of output port 0: 10 clock cycles.
### To highlight blocks that obstruct distributed pipelining, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoderFocMinLatency/highlightDistributedPipeliningBarriers')">hdlsrc/hdlcoderFocMinLatency/highlightDistributedPipeliningBarriers.m</a>
### To clear highlighting, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoderFocMinLatency/clearhighlighting.m')">hdlsrc/hdlcoderFocMinLatency/clearhighlighting.m</a>
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoderFocMinLatency_vnl')">gm_hdlcoderFocMinLatency_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoderFocMinLatency'.
### MESSAGE: The design requires 800 times faster clock with respect to the base rate = 2e-05.
### Working on Clarke_Transform_shared as hdlsrc/hdlcoderFocMinLatency/Clarke_Transform_shared.vhd.
### Working on hdlcoderFocMinLatency/FOC_Current_Control/Clarke_Transform as hdlsrc/hdlcoderFocMinLatency/Clarke_Transform.vhd.
### Working on hdlcoderFocMinLatency/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate_Output as hdlsrc/hdlcoderFocMinLatency/Saturate_Output.vhd.
### Working on hdlcoderFocMinLatency/FOC_Current_Control/DQ_Current_Control/D_Current_Control as hdlsrc/hdlcoderFocMinLatency/D_Current_Control.vhd.
### Working on hdlcoderFocMinLatency/FOC_Current_Control/DQ_Current_Control/Q_Current_Control/Saturate_Output as hdlsrc/hdlcoderFocMinLatency/Saturate_Output_block.vhd.
### Working on hdlcoderFocMinLatency/FOC_Current_Control/DQ_Current_Control/Q_Current_Control as hdlsrc/hdlcoderFocMinLatency/Q_Current_Control.vhd.
### Working on hdlcoderFocMinLatency/FOC_Current_Control/DQ_Current_Control as hdlsrc/hdlcoderFocMinLatency/DQ_Current_Control.vhd.
### Working on hdlcoderFocMinLatency/FOC_Current_Control/Inverse_Clarke_Transform as hdlsrc/hdlcoderFocMinLatency/Inverse_Clarke_Transform.vhd.
### Working on Inverse_Park_Transform_shared as hdlsrc/hdlcoderFocMinLatency/Inverse_Park_Transform_shared.vhd.
### Working on hdlcoderFocMinLatency/FOC_Current_Control/Inverse_Park_Transform as hdlsrc/hdlcoderFocMinLatency/Inverse_Park_Transform.vhd.
### Working on Park_Transform_shared as hdlsrc/hdlcoderFocMinLatency/Park_Transform_shared.vhd.
### Working on hdlcoderFocMinLatency/FOC_Current_Control/Park_Transform as hdlsrc/hdlcoderFocMinLatency/Park_Transform.vhd.
### Working on hdlcoderFocMinLatency/FOC_Current_Control/Sine_Cosine/Sine_Cosine_LUT as hdlsrc/hdlcoderFocMinLatency/Sine_Cosine_LUT.vhd.
### Working on hdlcoderFocMinLatency/FOC_Current_Control/Sine_Cosine as hdlsrc/hdlcoderFocMinLatency/Sine_Cosine.vhd.
### Working on hdlcoderFocMinLatency/FOC_Current_Control/Space_Vector_Modulation as hdlsrc/hdlcoderFocMinLatency/Space_Vector_Modulation.vhd.
### Working on Sine_Cosine_nw as hdlsrc/hdlcoderFocMinLatency/Sine_Cosine_nw.vhd.
### Working on Inverse_Clarke_Transform_nw as hdlsrc/hdlcoderFocMinLatency/Inverse_Clarke_Transform_nw.vhd.
### Working on Space_Vector_Modulation_nw as hdlsrc/hdlcoderFocMinLatency/Space_Vector_Modulation_nw.vhd.
### Working on FOC_Current_Control_tc as hdlsrc/hdlcoderFocMinLatency/FOC_Current_Control_tc.vhd.
### Working on FOC_Current_Control as hdlsrc/hdlcoderFocMinLatency/FOC_Current_Control.vhd.
### Generating package file hdlsrc/hdlcoderFocMinLatency/FOC_Current_Control_pkg.vhd.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2019bd_1170825_64229/publish_examples6/tp2ee3fced/hdlsrc/hdlcoderFocMinLatency/html/hdlcoderFocMinLatency_codegen_rpt.html');">hdlcoderFocMinLatency_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples6/tp2ee3fced/hdlsrc/hdlcoderFocMinLatency/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocMinLatency' complete with 0 errors, 0 warnings, and 2 messages.
### HDL code generation complete.

Заметьте, что 'makehdl' команда сгенерировала сообщение, Фазу '### выходного порта 0: '. Это сообщение сообщает пользователю о том, как произвести выходные параметры DUT. Количество тактов, заданных здесь, соответствует, как быстро выходные параметры DUT могут быть произведены и, в сущности, это - задержка проекта. Таким образом общая задержка проекта снижается с демонстрационного шага скорости передачи данных 20 к нескольким наносекундам.

Мы можем рассмотреть сгенерированную модель, чтобы заметить, что новая подсистема DUT создается, чей выход действует на тактовой частоте, которая составляет 25 нс.

open_system(gmHdlDut);
set_param(gmHdlModel, 'SimulationCommand', 'update');
set_param(gmHdlDut, 'ZoomFactor', 'FitSystem');

Мы должны быть осторожными при использовании этой опции, поскольку дополнительная задержка вводится в сгенерированный HDL-код, который не был в исходной имитационной модели. В выполнении этого шаг расчета выходного порта превратился в тактовую частоту. Это вводит возможное несоответствие в результатах во время потока валидации и верификации, поскольку тестовая обвязка ожидает, что проект сгенерирует выходные параметры на скорости передачи данных. Модель валидации решает эту проблему путем вставки перехода уровня субдискретизации, чтобы возвратить выход скорости передачи данных. Таким образом модель валидации все еще сравнивает выходные параметры на скорости передачи данных. Испытательный стенд HDL, однако, сравнит выходные параметры нового DUT на тактовой частоте начиная со сгенерированного HDL, выходные параметры испускаются на тактовой частоте.

Подстройка для производительности

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

  • Многоскоростные проекты: В этом примере исходная модель действует на одном уровне, который является скоростью передачи данных. Опция Сверхдискретизации задает свое отношение к тактовой частоте. Эта настройка работает лучше всего на минимизацию задержки проекта. Тактовая частота, конвейерно обрабатывающая также, работает хорошо в многоскоростных проектах путем оптимизации медленных путей, но может ввести демонстрационные задержки на контурах перехода уровня. Таким образом, для минимизации задержки, используйте односкоростное (скорость передачи данных) для целого проекта.

  • Частота часов: Вы заметите в этом проекте, что распределенная конвейеризация не конвейерно обрабатывала целый datapath. Это вызвано тем, что оптимизация осведомлена о последствиях повторной синхронизации через определенные блоки, которые могут вызвать числовое несоответствие; см. распределенную документацию конвейеризации для получения дополнительной информации. Часто, эти проблемы вычислительной целостности происходят в граничных условиях. Если пользователь уверен, что проект не поражает эти граничные условия, пользователь может включить 'Распределенный приоритетный параметр' конвейеризации. Для получения дополнительной информации смотрите режим производительности распределенной конвейеризации. В этом случае пользователь должен сделать полную валидацию, чтобы подтвердить, что проект работает правильно и устойчив ко всем условиям работы.

  • Сгладьте иерархию: можно включить иерархию, сглаживающуюся любому, максимизируют глобальную оптимизацию перекрестной подсистемы и/или улучшить эффективность конвейеризации тактовой частоты в присутствии обратной связи. В частности, когда существует обратная связь, которая пересекает контуры подсистемы, рекомендуется включить иерархию, сглаживающуюся в подсистеме высшего уровня, которая содержит обратную связь. Однако, чтобы быть эффективными, проверяйте, что всем требованиям для выравнивания удовлетворяют для более низких подсистем уровня.

  • Предоставьте достаточный бюджет: Когда общее количество примененных конвейеров тактовой частоты равно или больше, чем доступный бюджет на сверхдискретизацию, затем изучая, что удар синхронизации может быть трудным. Поэтому предоставьте достаточный бюджет или значение Сверхдискретизации, для конвейеризации тактовой частоты. Единственный недостаток слишком большого из значения сверхдискретизации - то, что счетчики, используемые контроллером синхронизации и планировщиком, могут быть больше. Область наверху является, поэтому, довольно маленькой.

Сводные данные

Конвейеризация тактовой частоты является методом, чтобы оптимизировать и конвейерно обработать медленные пути в вашем проекте. Конвейеризация тактовой частоты гарантирует, что конвейеры введены на тактовой частоте для следующих построений HDL Coder и функций:

  • Конвейерные математические операции: Несколько математических блоков реализуют мультицикл, конвейерную реализацию HDL, например, метод Ньютона-Rhapson для sqrt или recip, алгоритма Cordic для тригонометрических функций. Эти конвейеры введены на тактовой частоте, если блок работает с медленным путем.

  • Отображение с плавающей точкой: Аналогичный описанному выше, отображение библиотеки операций с плавающей точкой использует конвейеры тактовой частоты при реализации математических операций с плавающей точкой.

  • Конвейеризация оптимизации: Вся оптимизация конвейеризации включая конвейеризацию ввода/вывода, адаптивную конвейеризацию и распределенную конвейеризацию использует регистры тактовой частоты на медленных путях.

  • Разделение ресурсов и потоковая передача: мультиплексирование времени совместно использованной с ресурсом архитектуры реализовано на тактовой частоте.

Медленные пути идентифицированы как пути с помощью более медленного шага расчета Simulink или когда Сверхдискретизация параметра установлена в настройках HDL Coder. Используя конвейеризацию тактовой частоты, скорость проекта и свойства области могут быть улучшены, не ставя под угрозу общую задержку проекта.