В этом примере показано, как сбалансировать задержки определенных частей проекта, не балансируя задержки на целом проекте.
Можно использовать опцию 'BalanceDelays', чтобы сбалансировать дополнительные задержки, введенные HDL Coder™ для определенных реализаций блока и оптимизации. Эта опция уровня модели управляет задержкой, балансирующейся для целой модели. Однако для определенных проектов, можно хотеть сбалансировать задержки только некоторых частей проекта. Например, в проекте, содержащем информационный канал и путь к управлению, балансировка задержки должна быть применена только на информационном канале проекта, i.e., пути, требующие синхронизации данных. В этом примере показано, как использовать уровень подсистемы, опция '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 являются коэффициентами к КИХ-фильтру и не должны синхронизироваться друг с другом или с обработанными данными. Превращение балансировки с задержкой выключения на управляющей логике поэтому сохраняет ресурсы. Для того, чтобы достигнуть этого, уровень модели, опцией 'BalanceDelays' должен быть 'off' и уровень подсистемы, опции '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');