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

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

Введение

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

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

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

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

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

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

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

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

open_system('hdlcoderFocCurrentFixptHdl')

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

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

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

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

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 Coder переизбирает архитектуру общих ресурсов для мультиплексирования во времени, как показано на Совместное Использование For Area Optimization. Однако, если в медленном 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 усиления, которые могут быть потенциально совместными, если они не являются просто усилениями мощности 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 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 усиления, которые могут быть потенциально совместными, если они не являются просто усилениями мощности 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 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': проверьте опцию 'Allow clock-rate pipelining of DUT outport ports'. Это имя свойства командной строки для этой опции является 'ClockRatePipelineOutputPorts'. Когда опция 'ClockRatePipelineOutportPorts' включена и выходной регистр удален, сгенерированный 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 могут быть дискретизированы, и, по сути, это задержка проекта. Таким образом, общая задержка проекта уменьшается с шага выборки со скоростью данных 20$\mu s$ до нескольких наносекунд.

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

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

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

Подстройка для эффективности

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

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

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

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

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

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

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

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

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

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

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

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