Потоковая передача цикла, чтобы уменьшать область

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

Введение

Цикл for MATLAB® генерирует цикл FOR_GENERATE в VHDL. Такие циклы всегда пространственно разворачиваются для выполнения в оборудовании. Другими словами, тело цикла программного обеспечения реплицируется так же много раз в оборудовании как количество итераций цикла. Это приводит к неэффективному использованию области.

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

Проект 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

Создание нового проекта из командной строки

Чтобы создать новый проект, введите следующую команду:

coder -hdlcoder -new fir_project

Затем, добавьте файл 'mlhdlc_fir.m' в проект как функция MATLAB и 'mlhdlc_fir_tb.m' как Испытательный стенд MATLAB.

Запустите советника по вопросам рабочего процесса.

Можно обратиться к Началу работы с MATLAB к примеру по Рабочему процессу HDL для более полного примера при создании и заполнении проектов HDL Coder MATLAB.

Включите потоковую передачу цикла

Оптимизация потоковой передачи цикла в HDL Coder преобразовывает циклы программного обеспечения (или записанный явным образом использование оператора цикла for или выведенные циклы от матричных/векторных операторов) к благоприятным для области аппаратным циклам.

Запустите преобразование фиксированной точки и генерацию HDL-кода

Щелкните правой кнопкой по шагу 'Code Generation'. Выберите опцию, 'Запущенную к выбранной задаче', чтобы запустить все шаги с начала через генерацию HDL-кода.

Исследуйте сгенерированный код

Когда вы синтезируете проект с оптимизацией потоковой передачи цикла, вы видите сокращение ресурсов области в отчете ресурса. Попытайтесь генерировать HDL-код с и без оптимизации.

Отчет ресурса без оптимизации потоковой передачи цикла:

Отчет ресурса с включенной оптимизацией потоковой передачи цикла:

Известные ограничения

Циклы будут переданы потоком, только если они - регулярные вложенные циклы. Регулярная структура вложенного цикла задана как та где:

  • Ни один из циклов на любом уровне вложения не появляется в условной области потока, т.е. никакой цикл не может быть встроен в если еще или области переключателя еще.

  • Индексные переменные цикла монотонно увеличиваются.

  • Общее количество итераций циклической структуры является ненулевым.

  • Нет никаких компенсационных циклов на том же уровне вложенной иерархии.

Очистите Сгенерированные Файлы

Запустите следующие команды, чтобы очистить временную папку проекта.

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');