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

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

Давайте бросим беглый взгляд на реализацию алгоритма Sobel.

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

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

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

Теперь исследуйте упрощенное внедрение того же алгоритма с помощью Системных объектов в 'mlhdlc_sysobj_sobel'.

Когда используется в рамках ограничений генерации HDL-кода, dsp.Delay object s всегда сопоставляет с регистрами. Для персистентных переменных, которые будут выведены как регистры, необходимо быть осторожными, чтобы считать переменную прежде, чем записать в него, чтобы сопоставить его с регистром.

Проект 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™ только поддерживает метод 'шага' и не поддерживает 'выход' и 'обновляет' методы.

С поддержкой только метода шага задержки не могут использоваться в моделировании путей к обратной связи. Например, следующая часть кода MATLAB не может поддерживаться с помощью dsp.Delay Системного объекта.

%#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 для более полного примера при создании и заполнении проектов HDL Coder MATLAB.

Запустите преобразование фиксированной точки и генерацию HDL-кода

Запустите Советника по вопросам Рабочего процесса и щелкните правой кнопкой по шагу '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.Delay object путем установки свойства 'Length' быть больше 1. Эти объекты задержки будут сопоставлены со сдвиговыми регистрами в сгенерированном коде.

Если опция оптимизации 'Сопоставляет персистентные переменные типа массив с RAM', включен, Системные объекты задержки будут сопоставлены с блоком RAM при следующих условиях:

  • Свойство 'InitialConditions' dsp.Delay обнуляется.

  • Тип данных задержки входа не с плавающей точкой.

  • 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');