В этом примере показано, как использовать распределенную конвейерную и контурную оптимизацию в HDL Coder, чтобы оптимизировать тактовую частоту.
Распределённая конвейеризация является оптимизацией всего проекта, поддерживаемой HDL Coder для улучшения тактовой частоты. Когда вы включаете опцию 'Distribute Pipeline Registers' в HDL Coder, кодер перераспределяет вход и выход регистры конвейера функции верхнего уровня вместе с другими регистрами в проекте в порядок, чтобы минимизировать комбинаторную логику между регистрами и, таким образом, максимизировать тактовую частоту чипа, синтезированного из сгенерированного HDL-кода.
Рассмотрим следующий пример проекта конечной импульсной характеристики. Комбинаторная логика от входа или регистра до выхода или другого регистра содержит сумму продуктов. Циклом размотка и распределенная конвейерная обработка перемещает регистры выхода на проект уровне, чтобы уменьшить количество комбинаторной логики, таким образом увеличивая тактовую частоту.
Код MATLAB, используемый в примере, является простым конечная импульсная характеристика. Пример также показывает испытательный стенд MATLAB, который упражняет фильтр.
design_name = 'mlhdlc_fir'; testbench_name = 'mlhdlc_fir_tb';
Проект: mlhdlc_fir
Испытательный стенд: mlhdlc_fir_tb
Выполните следующие строки кода, чтобы скопировать необходимые файлы примера во временную папку.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_fir']; % create a temporary folder and copy the MATLAB files cd(tempdir); [~, ~, ~] = rmdir(mlhdlc_temp_dir, 's'); mkdir(mlhdlc_temp_dir); cd(mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir);
Симулируйте проект с помощью тестбенча до генерации кода, чтобы убедиться, что нет ошибок времени выполнения.
mlhdlc_fir_tb
Чтобы выполнить преобразование с фиксированной точкой, вам нужен объект config 'fixpt'.
Создайте объект config 'fixpt' и укажите имя испытательного стенда:
close all; fixptcfg = coder.config('fixpt'); fixptcfg.TestBenchName = 'mlhdlc_fir_tb';
Чтобы сгенерировать код, необходимо создать объект config 'hdl' и задать имя испытательного стенда:
hdlcfg = coder.config('hdl'); hdlcfg.TestBenchName = 'mlhdlc_fir_tb';
Чтобы увеличить тактовую частоту, пользователь может задать ряд входа и выходных этапов трубопровода для любого проекта. В этом конкретном примере опция Input pipelining устанавливается на '1', а опция Output pipelining устанавливается на '20'. Без каких-либо дополнительных опций, включенных эти настройки, вход один регистр трубопровода во всех портах входа проекта верхнего уровня и 20 выходы регистров трубопровода в каждом из портов выхода.
Если включена опция 'Distribute pipeline registers', HDL Coder пытается изменить положение регистров, чтобы достичь лучшей тактовой частоты.
В сложение с перемещением входа и выхода регистров конвейера HDL Coder также пытается переместить регистры, смоделированные внутри проекта, используя постоянные переменные или с такими системными объектами, как dsp. Задержка.
Дополнительные возможности для улучшений становятся доступными, если вы разворачиваете циклы. Опция 'Unroll Loops' разворачивает явные циклы for-loops в коде MATLAB в дополнение к неявным циклам for-loops, которые выводятся для векторных и матричных операций. 'Unroll Циклов' необходим для того, чтобы этот пример делал распределенные конвейеризации.
hdlcfg.InputPipeline = 1;
hdlcfg.OutputPipeline = 20;
hdlcfg.DistributedPipelining = true;
hdlcfg.LoopOptimization = 'UnrollLoops';
Если на вашей машине установлен ISE, запустите шаг логического синтеза
hdlcfg.SynthesizeGeneratedCode = true; codegen -float2fixed fixptcfg -config hdlcfg mlhdlc_fir
Просмотр отчета о результатах
edit codegen/mlhdlc_fir/hdlsrc/ise_prj/mlhdlc_fir_fixpt_syn_results.txt
В отчете о синтезе обратите внимание на тактовую частоту, сообщаемую инструментом синтеза. Когда вы синтезируете дизайн с циклом включенными опциями развертывания и распределённой конвейеризации, вы видите значительное увеличение тактовой частоты с конвейеризацией опциями включенными.
Выполните следующие команды, чтобы очистить временную папку проекта.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_fir']; clear mex; cd (mlhdlc_demo_dir); rmdir(mlhdlc_temp_dir, 's');