В этом примере показано, как использовать персистентные переменные и Системные объекты к состоянию модели, и задержки 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.
Давайте бросим беглый взгляд на реализацию алгоритма Sobel.
Исследуйте проект, чтобы видеть, как задержки и буферы линии моделируются с помощью:
Персистентные переменные: 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™ только поддерживает метод 'шага' и не поддерживает 'выход' и 'обновляет' методы.
С поддержкой только метода шага задержки не могут использоваться в моделировании путей к обратной связи. Например, следующая часть кода MATLAB не может поддерживаться с помощью dsp. Задержите Системный объект.
%#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 для более полного примера при создании и заполнении проектов HDL Coder MATLAB.
Запустите Советника по вопросам Рабочего процесса и щелкните правой кнопкой по шагу 'Code Generation'. Выберите опцию, 'Запущенную к выбранной задаче', чтобы запустить все шаги с начала через генерацию HDL-кода.
Исследуйте сгенерированный HDL-код путем нажатия на гиперссылки в окне Code Generation Log.
Теперь создайте новый проект для проекта системного объекта:
coder -hdlcoder -new mlhdlc_sysobj_sobel
Добавьте файл 'mlhdlc_sysobj_sobel.m' в проект как функция MATLAB и 'mlhdlc_sysobj_sobel_tb.m' как Испытательный стенд MATLAB.
Повторите шаги генерации кода и исследуйте сгенерированную фиксированную точку MATLAB и HDL-код.
Можно смоделировать целочисленную задержку с помощью dsp. Объект задержки путем установки свойства 'Length' быть больше 1. Эти объекты задержки будут сопоставлены со сдвиговыми регистрами в сгенерированном коде.
Если опция оптимизации 'Сопоставляет персистентные переменные типа массив с RAM', включен, Системные объекты задержки будут сопоставлены с блоком RAM при следующих условиях:
Свойство 'InitialConditions' dsp. Задержка обнуляется.
Тип данных задержки входа не с плавающей точкой.
RAMSize (DelayLength * InputWordLength) больше или равен 'Порогу Отображения RAM'.
Запустите следующие команды, чтобы очистить временную папку проекта.
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');