В этом примере показано, как использовать стойкие переменные и системные объекты для моделирования состояния и задержек в проекте 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'.
При поддержке только метода step задержки не могут использоваться в моделировании путей обратной связи. Например, следующая часть кода 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 Coder см. в разделе «Начало работы с MATLAB в HDL».
Запустите Workflow Advisor и щелкните правой кнопкой мыши шаг 'Генерация Кода'. Выберите опцию «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. Эти объекты задержки будут преобразованы в регистры сдвига в сгенерированном коде.
Если опция оптимизации 'Сопоставить переменные стойкого массива с ОЗУ' включена, Системные объекты задержки будут сопоставлены с блоками ОЗУ при следующих условиях:
Свойство 'InitialConditions' dsp. Задержка устанавливается в нуль.
Задержка входа не с плавающей точкой.
RAMSize (DelayLength * InputWordLength) больше или равен порогу отображения ОЗУ.
Выполните следующие команды, чтобы очистить временную папку проекта.
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');