exponenta event banner

Конвейерная обработка тактовой частоты

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

Введение

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

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

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

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

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

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

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

  • Определение разности скоростей: Сигнальные пути в Simulink заканчиваются медленными путями в HDL по двум основным причинам. Во-первых, тракт сигнала работает во время выборки, которое медленнее, чем время базовой выборки модели. Во-вторых, базовое время выборки Simulink может соответствовать скорости передачи данных вместо тактовой скорости. Например, базовое время выборки в hdlcoderFocCurrentFixptHdl модель составляет 20$\mu$ сек. Конечная реализация FPGA контроллера может быть рассчитана на 40 МГц (или 25 нс).

open_system('hdlcoderFocCurrentFixptHdl')

Проблема, связанная с установкой времени выборки модели на 25 нс, заключается в том, что она резко снижает производительность моделирования Simulink. Чтобы обойти это, HDL Coder предоставляет настройку, называемую коэффициентом избыточной дискретизации, который определяет, насколько быстрее тактовая частота FPGA работает по отношению к базовому времени выборки Simulink. Таким образом, в этом случае требуется 800x избыточная выборка.

  • Настройка оптимизации для подсистем: Для конструкций с фиксированной точкой конвейерная обработка тактовой частоты применяется к подсистеме только в том случае, если кодеру требуется вставить конвейерную обработку. Опциями кодера HDL, которые приводят к внедрению конвейерной обработки, являются распределенная конвейерная обработка, совместное использование, потоковая передача, конвейерная обработка входных/выходных данных, конвейерная обработка выходных данных с ограничениями, адаптивная конвейерная обработка и любые реализации блоков, которые вводят многоцикловые реализации, включая реализации с плавающей запятой (для получения более подробной информации см. документацию по отдельным блокам, чтобы понять влияние их свойств 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.
### Running HDL checks on the model 'hdlcoderFocClockRatePipelining'.
### Begin compilation of the model 'hdlcoderFocClockRatePipelining'...
### Applying HDL optimizations on the model 'hdlcoderFocClockRatePipelining'...
### Begin model generation.
### Model generation complete.
### 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.
### Code Generation for 'hdlcoderFocClockRatePipelining' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/hdlsrc/hdlcoderFocClockRatePipelining/html/hdlcoderFocClockRatePipelining_codegen_rpt.html');">hdlcoderFocClockRatePipelining_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/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.

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

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

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

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

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 коэффициента усиления, которые могут быть потенциально общими, если они не являются просто коэффициентами усиления мощности 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.
### Running HDL checks on the model 'hdlcoderFocSharing'.
### Begin compilation of the model 'hdlcoderFocSharing'...
### Applying HDL optimizations on the model 'hdlcoderFocSharing'...
### Begin model generation.
### Model generation complete.
### 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 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 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 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 hdlcoderFocSharing/FOC_Current_Control/Space_Vector_Modulation as hdlsrc/hdlcoderFocSharing/Space_Vector_Modulation.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.
### Code Generation for 'hdlcoderFocSharing' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/hdlsrc/hdlcoderFocSharing/html/hdlcoderFocSharing_codegen_rpt.html');">hdlcoderFocSharing_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/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 реализует мультиплексирование времени в тактовой частоте, используя информацию о доступном бюджете задержек из-за медленного распространения данных.

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 коэффициента усиления, которые могут быть потенциально общими, если они не являются просто коэффициентами усиления мощности 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.
### Running HDL checks on the model 'hdlcoderFocSharingWithFlattening'.
### Begin compilation of the model 'hdlcoderFocSharingWithFlattening'...
### Applying HDL optimizations on the model 'hdlcoderFocSharingWithFlattening'...
### Begin model generation.
### Model generation complete.
### 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.
### Code Generation for 'hdlcoderFocSharingWithFlattening' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/hdlsrc/hdlcoderFocSharingWithFlattening/html/hdlcoderFocSharingWithFlattening_codegen_rpt.html');">hdlcoderFocSharingWithFlattening_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/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 реализует мультиплексирование времени в тактовой частоте, используя информацию о доступном бюджете задержек из-за медленного распространения данных.

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» - > «Оптимизация» - > вкладка «Конвейер»: установите флажок «Разрешить конвейер тактовой частоты для выходных портов 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.
### Running HDL checks on the model 'hdlcoderFocMinLatency'.
### Begin compilation of the model 'hdlcoderFocMinLatency'...
### Applying HDL optimizations on the model 'hdlcoderFocMinLatency'...
### 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 1: 11 clock cycles.
### Begin model generation.
### Model generation complete.
### 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 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.
### Code Generation for 'hdlcoderFocMinLatency' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/hdlsrc/hdlcoderFocMinLatency/html/hdlcoderFocMinLatency_codegen_rpt.html');">hdlcoderFocMinLatency_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/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 и, по существу, это задержка конструкции. Таким образом, общая задержка конструкции снижается от шага выборки со скоростью передачи данных$\mu s$ 20 до нескольких наносекунд.

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

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

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

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

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

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

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

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

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

Резюме

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

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

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

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

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

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