Распределенная конвейеризация для оптимизации тактовой частоты

В этом примере показано, как использовать распределенную оптимизацию конвейеризации и развертывания цикла в HDL Coder, чтобы оптимизировать тактовую частоту.

Введение

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

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

Проект MATLAB®

Код MATLAB, используемый в примере, является простым КИХ-фильтром. Пример также показывает испытательный стенд MATLAB, который осуществляет фильтр.

design_name = 'mlhdlc_fir';
testbench_name = 'mlhdlc_fir_tb';
  1. Проект: mlhdlc_fir

  2. Испытательный стенд: 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-кода

Чтобы сгенерировать код, необходимо создать 'hdl' объект конфигурации и определить имя испытательного стенда:

hdlcfg = coder.config('hdl');
hdlcfg.TestBenchName = 'mlhdlc_fir_tb';

Распределенная конвейеризация

Чтобы увеличить тактовую частоту, пользователь может установить много настроек канала связи ввода и вывода для любого проекта. В этом конкретном примере Входная опция конвейеризации установлена в '1', и Выходная опция конвейеризации установлена в '20'. Без любых дополнительных опций включил эти настройки, добавят входной конвейерный регистр того во всех входных портах проекта верхнего уровня и 20 выходных конвейерных регистров в каждом из выходных портов.

Если опция 'Распределяет конвейерные регистры', включен, HDL Coder пытается изменить местоположение регистров, чтобы достигнуть лучшей частоты часов.

В дополнение к перемещению конвейерных регистров ввода и вывода HDL Coder также пытается переместить регистры, смоделированные внутренне в проекте с помощью персистентных переменных или с системными объектами как dsp. Задержка.

Дополнительные возможности для улучшений становятся доступными, если вы разворачиваете циклы. 'Разворачивают Циклы' опция, разворачивает явные циклы 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');