В этом примере показано, как использовать постоянные переменные и системные объекты для моделирования состояния и задержек в конструкции MATLAB ® для генерации кода HDL.
Использование системных объектов для моделирования задержки приводит к сжатому сгенерированному коду.
В MATLAB множественные вызовы функции, имеющей постоянные переменные, не приводят к множественным задержкам. Вместо этого состояние в функции обновляется несколько раз.
% In order to reuse code implemented in a function with states, % you need to duplicate functions multiple times to create multiple % instances of the algorithm with delay.
Рассмотрим реализацию алгоритма Собеля.
Изучите конструкцию, чтобы увидеть, как моделируются задержки и линейные буферы с помощью:
Постоянные переменные: mlhdlc_sobel
Системные объекты: mlhdlc_sysobj_sobel
Обратите внимание, что функция filterdelay дублируется различными именами функций в коде mlhdlc _ sobel для создания экземпляра нескольких версий алгоритма в MATLAB для генерации кода HDL.
Реализация линии задержки сложнее при использовании постоянных переменных MATLAB.
Теперь изучите упрощенную реализацию того же алгоритма с использованием системных объектов в «mlhdlc _ sysobj _ sobel».
При использовании в рамках ограничений генерации кода HDL dsp. Объекты задержки всегда отображаются в регистры. Чтобы постоянные переменные выводились как регистры, необходимо внимательно прочитать переменную перед ее записью, чтобы сопоставить ее с регистром.
demo_files = {...
'mlhdlc_sysobj_sobel', ...
'mlhdlc_sysobj_sobel_tb', ...
'mlhdlc_sobel', ...
'mlhdlc_sobel_tb'
};
Выполните следующие строки кода, чтобы скопировать необходимые файлы примеров во временную папку.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_delay_modeling']; % create a temporary folder and copy the MATLAB files cd(tempdir); [~, ~, ~] = rmdir(mlhdlc_temp_dir, 's'); mkdir(mlhdlc_temp_dir); cd(mlhdlc_temp_dir); for ii=1:numel(demo_files) copyfile(fullfile(mlhdlc_demo_dir, [demo_files{ii},'.m*']), mlhdlc_temp_dir); end
Для предопределенных системных объектов HDL Coder™ поддерживает только метод step и не поддерживает методы output и update.
При поддержке только пошагового метода задержки не могут использоваться при моделировании путей обратной связи. Например, следующая часть кода MATLAB не может поддерживаться с помощью dsp. Задержать объект System.
%#codegen function y = accumulate(u) persistent p; if isempty(p) p = 0; end y = p; p = p + u;
Для создания нового проекта введите следующую команду:
coder -hdlcoder -new mlhdlc_sobel
Затем добавьте файл «mlhdlc _ sobel.m» в проект в качестве функции MATLAB и «mlhdlc _ sobel _ tb.m» в качестве испытательного стенда MATLAB.
Более подробное руководство по созданию и заполнению проектов кодера MATLAB HDL см. в разделе Начало работы с MATLAB в Workflow-процессе HDL.
Запустите помощник по рабочим процессам и щелкните правой кнопкой мыши шаг «Создание кода». Выберите опцию «Run to selected task» для выполнения всех шагов от начала до создания кода HDL.
Проверьте созданный код HDL, щелкнув гиперссылки в окне Журнал генерации кода.
Теперь создайте новый проект для проекта системного объекта:
coder -hdlcoder -new mlhdlc_sysobj_sobel
Добавьте файл «mlhdlc _ sysobj _ sobel.m» в проект в качестве функции MATLAB и «mlhdlc _ sysobj _ sobel _ tb.m» в качестве испытательного стенда MATLAB.
Повторите шаги создания кода и проверьте сгенерированный код MATLAB и HDL с фиксированной точкой.
Можно моделировать целочисленную задержку с помощью dsp. Задержать объект, установив значение свойства Length больше 1. Эти объекты задержки будут отображены в регистры сдвига в сгенерированном коде.
Если опция оптимизации «Сопоставить переменные постоянного массива с RAM» включена, системные объекты задержки будут сопоставлены с блоками RAM при следующих условиях:
Свойство InitityConditions dsp. Задержка устанавливается равной нулю.
Тип входных данных задержки не является плавающей точкой.
Значение RAMSize (DelayLength * InputWordLength) больше или равно значению «RAM Mapping Threshold».
Выполните следующие команды для очистки временной папки проекта.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_delay_modeling']; clear mex; cd (mlhdlc_demo_dir); rmdir(mlhdlc_temp_dir, 's');