Сопоставление матриц с блоками RAM для уменьшения площади

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

Введение

Одной из привлекательных функций записи кода MATLAB является простота создания, доступа, изменения и манипулирования матрицами в MATLAB.

При обработке такого кода MATLAB HDL Coder сопоставляет эти матрицы с проводами или регистрами в HDL. Например, локальные переменные временной матрицы сопоставлены с проводами, в то время как переменные стойкой матрицы сопоставлены с регистрами.

Последнее, как правило, является неэффективным отображением, когда размер матрицы велик, поскольку количество доступных регистровых ресурсов ограничено. Это также усложняет синтез, размещение и маршрутизацию.

Современные FPGA имеют блоковые ОЗУ, которые спроектированы так, чтобы иметь большие матрицы. HDL Coder использует преимущества этой функции и автоматически отображает матрицы, чтобы заблокировать ОЗУ, чтобы улучшить эффективность области. Для некоторых проектов отображение этих устойчивых матриц с ОЗУ является обязательным, если проект должен быть реализован. Современные инструменты синтеза могут не иметь возможности синтезировать проекты, когда большие матрицы отображаются в регистры, в то время как размер задачи является более управляемым, когда те же самые матрицы отображены в ОЗУ.

MATLAB- Проекта

design_name = 'mlhdlc_sobel';
testbench_name = 'mlhdlc_sobel_tb';

Создайте новую папку и скопируйте соответствующие файлы

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

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_sobel'];

% create a temporary folder and copy the MATLAB files
cd(tempdir);
[~, ~, ~] = rmdir(mlhdlc_temp_dir, 's');
mkdir(mlhdlc_temp_dir);
cd(mlhdlc_temp_dir);

% copy the design files to the temporary directory
copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir);
copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir);

Моделируйте проект

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

mlhdlc_sobel_tb

Создайте новый HDL Coder™ проект

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

coder -hdlcoder -new mlhdlc_ram

Затем добавьте файл 'mlhdlc _ sobel.m' к проекту в качестве функции MATLAB и 'mlhdlc _ sobel _ tb.m' в качестве испытательного стенда MATLAB.

Более полное руководство по созданию и заполнению проектов MATLAB HDL Coder см. в разделе «Начало работы с MATLAB в HDL».

Включите оптимизацию отображения оперативной памяти

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

Флажок 'Map persistent array variables to RAMs' должен быть включен, чтобы сопоставить persistent variables, чтобы заблокировать RAM в сгенерированном коде.

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

В Workflow Advisor щелкните правой кнопкой мыши шаг 'Генерация Кода'. Выберите опцию «Run to selected task», чтобы выполнить все шаги от начала до генерации HDL-кода.

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

Исследуйте сообщения в окне журнала, чтобы увидеть файлы оперативной памяти, сгенерированные вместе с проектом.

Появляется предупреждающее сообщение для каждой переменной стойкой матрицы, не сопоставленной с ОЗУ.

Исследуйте отчет о ресурсах

Взгляните на сгенерированный отчет о ресурсах, в котором указывается количество выводимых ОЗУ, перейдя по ссылке 'Resource Utilization report...' в окне сгенерированного кода.

Дополнительные примечания по отображению ОЗУ

  • Постоянные матрицы переменной должны быть в безусловных областях, то есть вне любого кода if-else, случая switch или for-loop.

  • Функции MATLAB могут иметь любое количество матриц оперативной памяти.

  • Все матричные переменные в MATLAB, которые объявлены постоянными и соответствуют пороговым критериям, сопоставляются с ОЗУ.

  • Предупреждение отображается, когда постоянная матрица не сопоставляется с ОЗУ.

  • Зависящие от чтения циклы записи данных не допускаются: вы не можете вычислить данные записи как функцию от данных, считанных из матрицы.

  • Стойкие матрицы не могут быть скопированы как единое целое или доступны как подматрица: доступ к матрице (чтение/запись) разрешен только для отдельных элементов матрицы.

  • Сопоставление устойчивых матриц с ненулевыми начальными значениями с ОЗУ не поддерживается.

Очистка сгенерированных файлов

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

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_sobel'];
clear mex;
cd (mlhdlc_demo_dir);
rmdir(mlhdlc_temp_dir, 's');