В этом примере показано, как сбалансировать задержки в определенных частях проекта, не балансируя задержки на целом проекте.
Можно использовать опцию 'BalanceDelays', чтобы сбалансировать дополнительные задержки, введенные HDL- Coder™ для определенных реализаций и оптимизации блоков. Эта опция уровня модели управляет балансировкой задержки для всей модели. Однако для некоторых проектов может потребоваться сбалансировать задержки только в некоторых частях проекта. Для примера в проекте, содержащем путь данных и путь управления, балансировка задержки должна применяться только к пути данных проекта, т.е. путям, требующим синхронизации данных. В этом примере показано, как использовать опцию уровня подсистемы 'BalanceDelays', обеспечивает мелкодисперсное управление тем, как HDL Coder балансирует задержки в отдельных подсистемах.
Мы используем два примера, чтобы продемонстрировать использование этой функции уровня подсистемы:
hdlcoder_localdelaybalancing.slx показывает, как отключить балансировку задержки на пользовательских путях управления.
hdlcoder_localdelaybalancing_sharing.slx показывает, как пользователь может применить HDL оптимизацию, такую как совместное использование ресурсов при наличии сложных путей управления, которые требуют тщательно ограниченной балансировки задержки.
Пример модели, «hdlcoder_localdelaybalancing.slx,» имеет две подсистемы под hdlcoder_localdelaybalancing/Subsystem: param_control и symmetric_fir, содержащие логику управления и путь данных, соответственно.
bdclose('all'); open_system('hdlcoder_localdelaybalancing'); open_system('hdlcoder_localdelaybalancing/Subsystem');
Каждая подсистема имеет один блок, который имеет один выходной регистр конвейера для достижения хороших результатов синхронизации.
hdldispblkparams('hdlcoder_localdelaybalancing/Subsystem/param_control/And'); hdldispblkparams('hdlcoder_localdelaybalancing/Subsystem/symmetric_fir/Add');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% HDL Block Parameters ('hdlcoder_localdelaybalancing/Subsystem/param_control/And') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Implementation Architecture : default Implementation Parameters OutputPipeline : 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% HDL Block Parameters ('hdlcoder_localdelaybalancing/Subsystem/symmetric_fir/Add') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Implementation Architecture : Linear Implementation Parameters OutputPipeline : 1
Когда для глобальной опции уровня модели 'BalanceDelays' задано значение ' on ', то балансировка задержки вставляет соответствующие задержки как на пути управления, так и на пути данных, как показано в модели валидации.
hdlset_param('hdlcoder_localdelaybalancing', 'BalanceDelays', 'on'); hdlset_param('hdlcoder_localdelaybalancing', 'GenerateValidationModel', 'on'); makehdl('hdlcoder_localdelaybalancing/Subsystem'); load_system('gm_hdlcoder_localdelaybalancing_vnl'); set_param('gm_hdlcoder_localdelaybalancing_vnl', 'SimulationCommand', 'update'); open_system('gm_hdlcoder_localdelaybalancing_vnl/Subsystem/param_control');
### Generating HDL for 'hdlcoder_localdelaybalancing/Subsystem'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_localdelaybalancing', { 'HDL Code Generation' } )">hdlcoder_localdelaybalancing</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoder_localdelaybalancing'. ### Begin compilation of the model 'hdlcoder_localdelaybalancing'... ### Applying HDL optimizations on the model 'hdlcoder_localdelaybalancing'... ### The code generation and optimization options you have chosen have introduced additional pipeline delays. ### The delay balancing feature has automatically inserted matching delays for compensation. ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 1: 1 cycles. ### Output port 2: 1 cycles. ### Output port 3: 1 cycles. ### Begin model generation. ### Model generation complete. ### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_localdelaybalancing_vnl')">gm_hdlcoder_localdelaybalancing_vnl</a>. ### Validation model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_localdelaybalancing'. ### Working on hdlcoder_localdelaybalancing/Subsystem/param_control/params as hdlsrc/hdlcoder_localdelaybalancing/params.vhd. ### Working on hdlcoder_localdelaybalancing/Subsystem/param_control as hdlsrc/hdlcoder_localdelaybalancing/param_control.vhd. ### Working on hdlcoder_localdelaybalancing/Subsystem/symmetric_fir as hdlsrc/hdlcoder_localdelaybalancing/symmetric_fir.vhd. ### Working on hdlcoder_localdelaybalancing/Subsystem as hdlsrc/hdlcoder_localdelaybalancing/Subsystem.vhd. ### Code Generation for 'hdlcoder_localdelaybalancing' completed. ### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples3/tpff0237be/hdlsrc/hdlcoder_localdelaybalancing/Subsystem_report.html ### HDL check for 'hdlcoder_localdelaybalancing' complete with 0 errors, 0 warnings, and 0 messages. ### HDL code generation complete.
В этом примере проекта, только путь данных, symmetric_fir, требует синхронизации данных. Выходы от param_control являются коэффициентами к конечная импульсная характеристика и не должны синхронизироваться друг с другом или с обработанными данными. Поэтому отключение балансировки задержки на логике управления экономит ресурсы. Для порядка этого должна быть ' off ' опция 'BalanceDelays' уровня модели, и опции 'BalanceDelays' уровня подсистемы должны быть соответственно установлены на пути данных и пути управления.
hdlset_param('hdlcoder_localdelaybalancing', 'BalanceDelays', 'off'); hdlset_param('hdlcoder_localdelaybalancing/Subsystem/param_control', 'BalanceDelays', 'off'); hdlset_param('hdlcoder_localdelaybalancing/Subsystem/symmetric_fir', 'BalanceDelays', 'on');
Теперь, когда HDL-код сгенерирован, балансировка задержки активна только в подсистеме пути данных и не вставляет никаких задержек в подсистему пути управления.
bdclose('gm_hdlcoder_localdelaybalancing_vnl'); makehdl('hdlcoder_localdelaybalancing/Subsystem'); load_system('gm_hdlcoder_localdelaybalancing_vnl'); set_param('gm_hdlcoder_localdelaybalancing_vnl', 'SimulationCommand', 'update'); open_system('gm_hdlcoder_localdelaybalancing_vnl/Subsystem/param_control');
### Generating HDL for 'hdlcoder_localdelaybalancing/Subsystem'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_localdelaybalancing', { 'HDL Code Generation' } )">hdlcoder_localdelaybalancing</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoder_localdelaybalancing'. ### Begin compilation of the model 'hdlcoder_localdelaybalancing'... ### Applying HDL optimizations on the model 'hdlcoder_localdelaybalancing'... ### Begin model generation. ### Model generation complete. ### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_localdelaybalancing_vnl')">gm_hdlcoder_localdelaybalancing_vnl</a>. ### Validation model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_localdelaybalancing'. ### Working on hdlcoder_localdelaybalancing/Subsystem/param_control/params as hdlsrc/hdlcoder_localdelaybalancing/params.vhd. ### Working on hdlcoder_localdelaybalancing/Subsystem/param_control as hdlsrc/hdlcoder_localdelaybalancing/param_control.vhd. ### Working on hdlcoder_localdelaybalancing/Subsystem/symmetric_fir as hdlsrc/hdlcoder_localdelaybalancing/symmetric_fir.vhd. ### Working on hdlcoder_localdelaybalancing/Subsystem as hdlsrc/hdlcoder_localdelaybalancing/Subsystem.vhd. ### Code Generation for 'hdlcoder_localdelaybalancing' completed. ### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples3/tpff0237be/hdlsrc/hdlcoder_localdelaybalancing/Subsystem_report.html ### HDL check for 'hdlcoder_localdelaybalancing' complete with 0 errors, 2 warnings, and 0 messages. ### HDL code generation complete.
Заметьте, что симуляция модели валидации теперь показывает несоответствия, потому что модель валидации не компенсирует задержки, вставляемые оптимизациями или реализациями блоков.
Оптимизация совместного использования ресурсов экономит использование областей в окончательной реализации HDL за счет введения цикла задержки для каждой группы совместного доступа. Эта дополнительная задержка обычно сбалансирована во время балансировки задержки, так что цифры и функциональность алгоритма сохраняются. Одно из ограничений совместного использования ресурсов заключается в том, что оно не может быть применено к подсистеме в цикле обратной связи. Таким образом, если для подсистемы в цикле задан совместный доступ к ресурсам, то оптимизация будет неудачной. Наблюдать это можно в hdlcoder_localdelaybalancing_sharing.slx, где hdlcoder_localdelaybalancing_sharing/Subsystem/Subsystem находится в цикле обратной связи.
bdclose('all'); load_system('hdlcoder_localdelaybalancing_sharing'); open_system('hdlcoder_localdelaybalancing_sharing/Subsystem');
Однако в этом проекте вы можете знать, что цикл обратной связи редко используется, поскольку сигнал управления заставляет блок switch, 'hdlcoder _ localdelaybalancing _ sharing/Subsystem/Subsystem/Switch', выбирать верхний вход, прямой путь, большую часть времени. Это понимание пользователя подразумевает, что хорошо продолжить совместное использование ресурсов в этой подсистеме и игнорировать цикл обратной связи в родительской подсистеме. В таких случаях, если вы хотите игнорировать циклы обратной связи во время балансировки задержки, необходимо выключить балансировку задержки в подсистеме, содержащей цикл обратной связи. Это позволяет HDL Coder(TM) игнорировать цикл обратной связи и продолжить совместное использование ресурсов.
hdlset_param('hdlcoder_localdelaybalancing_sharing', 'BalanceDelays', 'off'); hdlset_param('hdlcoder_localdelaybalancing_sharing/Subsystem', 'BalanceDelays', 'off'); hdlset_param('hdlcoder_localdelaybalancing_sharing/Subsystem/Subsystem', 'BalanceDelays', 'on'); makehdl('hdlcoder_localdelaybalancing_sharing/Subsystem'); load_system('gm_hdlcoder_localdelaybalancing_sharing'); set_param('gm_hdlcoder_localdelaybalancing_sharing_vnl', 'SimulationCommand', 'update');
### Generating HDL for 'hdlcoder_localdelaybalancing_sharing/Subsystem'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_localdelaybalancing_sharing', { 'HDL Code Generation' } )">hdlcoder_localdelaybalancing_sharing</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoder_localdelaybalancing_sharing'. ### Begin compilation of the model 'hdlcoder_localdelaybalancing_sharing'... ### Applying HDL optimizations on the model 'hdlcoder_localdelaybalancing_sharing'... ### Begin model generation. ### Model generation complete. ### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_localdelaybalancing_sharing_vnl')">gm_hdlcoder_localdelaybalancing_sharing_vnl</a>. ### Validation model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_localdelaybalancing_sharing'. ### MESSAGE: The design requires 2 times faster clock with respect to the base rate = 0.1. ### Working on hdlcoder_localdelaybalancing_sharing/Subsystem/Subsystem as hdlsrc/hdlcoder_localdelaybalancing_sharing/Subsystem_block.vhd. ### Working on Subsystem_tc as hdlsrc/hdlcoder_localdelaybalancing_sharing/Subsystem_tc.vhd. ### Working on hdlcoder_localdelaybalancing_sharing/Subsystem as hdlsrc/hdlcoder_localdelaybalancing_sharing/Subsystem.vhd. ### Generating package file hdlsrc/hdlcoder_localdelaybalancing_sharing/Subsystem_pkg.vhd. ### Code Generation for 'hdlcoder_localdelaybalancing_sharing' completed. ### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples3/tpff0237be/hdlsrc/hdlcoder_localdelaybalancing_sharing/Subsystem_report.html ### HDL check for 'hdlcoder_localdelaybalancing_sharing' complete with 0 errors, 2 warnings, and 1 messages. ### HDL code generation complete.
Заметьте, что не только совместное использование преуспевает во внутренней подсистеме, но и локальная задержка балансировки также преуспевает в этой подсистеме, вставляя соответствующие задержки на входах в сумматор.
open_system('gm_hdlcoder_localdelaybalancing_sharing_vnl/Subsystem/Subsystem');