В этом примере показов, как использовать оптимизацию отображения ОЗУ в HDL Coder™, чтобы сопоставить постоянные матричные переменные с блокировкой ОЗУ в оборудовании.
Одной из привлекательных функций записи кода MATLAB является простота создания, доступа, изменения и манипулирования матрицами в MATLAB.
При обработке такого кода MATLAB HDL Coder сопоставляет эти матрицы с проводами или регистрами в HDL. Например, локальные переменные временной матрицы сопоставлены с проводами, в то время как переменные стойкой матрицы сопоставлены с регистрами.
Последнее, как правило, является неэффективным отображением, когда размер матрицы велик, поскольку количество доступных регистровых ресурсов ограничено. Это также усложняет синтез, размещение и маршрутизацию.
Современные FPGA имеют блоковые ОЗУ, которые спроектированы так, чтобы иметь большие матрицы. HDL Coder использует преимущества этой функции и автоматически отображает матрицы, чтобы заблокировать ОЗУ, чтобы улучшить эффективность области. Для некоторых проектов отображение этих устойчивых матриц с ОЗУ является обязательным, если проект должен быть реализован. Современные инструменты синтеза могут не иметь возможности синтезировать проекты, когда большие матрицы отображаются в регистры, в то время как размер задачи является более управляемым, когда те же самые матрицы отображены в ОЗУ.
design_name = 'mlhdlc_sobel'; testbench_name = 'mlhdlc_sobel_tb';
MATLAB Проекта: mlhdlc_sobel
Тестирование MATLAB: mlhdlc_sobel_tb
Входное изображение: stop_sign
Выполните следующие строки кода, чтобы скопировать файлы примера во временную папку.
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
Выполните следующую команду, чтобы создать новый проект.
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 в сгенерированном коде.
В 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');