Моделируйте состояние с постоянными переменными и системными объектами

В этом примере показано, как использовать стойкие переменные и системные объекты для моделирования состояния и задержек в проекте 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.

Исследуйте код MATLAB

Рассмотрим быстро реализацию алгоритма Собеля.

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

Заметьте, что функция 'filterdelay' дублируется другими именами функции в коде 'mlhdlc _ sobel', чтобы создать экземпляры нескольких версий алгоритма в MATLAB для генерации HDL-кода.

Реализация линии задержки сложнее, когда это делается с использованием постоянных переменных MATLAB.

Теперь рассмотрим упрощенную реализацию того же алгоритма, используя Системные объекты в 'mlhdlc _ sysobj _ sobel'.

При использовании в пределах ограничений генерации HDL-кода, dsp. Объекты задержки всегда сопоставляются с регистрами. Чтобы статические переменные были выведены как регистры, вы должны быть осторожны, чтобы считать переменную, прежде чем записывать в нее, чтобы сопоставить ее с регистром.

Файлы MATLAB Проекта

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;

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

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

coder -hdlcoder -new mlhdlc_sobel

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

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

Запуск преобразования с фиксированной точкой и генерации 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');