В этом примере показано, как использовать распределенную оптимизацию конвейеризации и развертывания цикла в HDL Coder, чтобы оптимизировать тактовую частоту.
Распределенная конвейеризация является оптимизацией всего проекта, поддержанной HDL Coder для улучшения тактовой частоты. Когда вы включаете, 'Распределяют Конвейерную опцию' Регистров в 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
Чтобы выполнить преобразование фиксированной точки, вам нужен 'fixpt' объект конфигурации.
Создайте 'fixpt' объект конфигурации и задайте свое имя испытательного стенда:
close all; fixptcfg = coder.config('fixpt'); fixptcfg.TestBenchName = 'mlhdlc_fir_tb';
Чтобы сгенерировать код, необходимо создать 'hdl' объект конфигурации и определить имя испытательного стенда:
hdlcfg = coder.config('hdl'); hdlcfg.TestBenchName = 'mlhdlc_fir_tb';
Чтобы увеличить тактовую частоту, пользователь может установить много настроек канала связи ввода и вывода для любого проекта. В этом конкретном примере Входная опция конвейеризации установлена в '1', и Выходная опция конвейеризации установлена в '20'. Без любых дополнительных опций включил эти настройки, добавят входной конвейерный регистр того во всех входных портах проекта верхнего уровня и 20 выходных конвейерных регистров в каждом из выходных портов.
Если опция 'Распределяет конвейерные регистры', включен, HDL Coder пытается изменить местоположение регистров, чтобы достигнуть лучшей тактовой частоты.
В дополнение к перемещению конвейерных регистров ввода и вывода HDL Coder также пытается переместить регистры, смоделированные внутренне в проекте с помощью персистентных переменных или с системными объектами как dsp.Delay.
Дополнительные возможности для улучшений становятся доступными, если вы разворачиваете циклы. 'Разворачивают Циклы' опция, разворачивает явные циклы for в коде MATLAB в дополнение к неявным циклам for, которые выведены для векторных и операций над матрицей. 'Разверните Циклы', необходимо для этого примера, чтобы сделать распределенную конвейеризацию.
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');