Следующий пример показывает, как использовать локальные функции в MATLAB®, так, чтобы каждое выполнение локальной функции соответствовало модулю отдельного оборудования в сгенерированном HDL-коде. Этот пример демонстрирует лучшые практики для записи локальных функций в коде MATLAB, который подходит для генерации HDL-кода.
Если ваш код MATLAB выполняет локальную функцию многократно, сгенерированный HDL-код не обязательно инстанцирует нескольких аппаратных модулей. Вместо того, чтобы инстанцировать нескольких аппаратных модулей, множественные вызовы функции обычно обновляют переменную состояния.
Если вы хотите, чтобы сгенерированный HDL-код содержал несколько аппаратных модулей, соответствующих каждому выполнению локальной функции, задайте две различных локальных функции с тем же кодом, но различные имена функций. Если вы хотите избежать дублирования кода, рассмотрите использование System objects, чтобы реализовать поведение в функции и инстанцировать Системы object™ многократно.
Если вы хотите указать, что отдельный файл HDL для каждой локальной функции в коде MATLAB, в Советнике по вопросам Рабочего процесса, на вкладке Advanced в разделе HDL Code Generation, выбирает Generate instantiable code for functions .
mlhdlc_two_counters.mЭта функция создает два счетчика и добавляет выход этих счетчиков. Чтобы создать два счетчика, существует две локальных функции с идентичным кодом, counter и counter2. Основной метод вызывает каждую из этих локальных функций однажды. Если функция должна была вызвать counter функционируйте дважды, модули отдельного оборудования для счетчиков не были бы сгенерированы в HDL-коде.
%#codegen
function total_count = mlhdlc_two_counters(a,b)
%This function contains two different local functions with identical
%counters and calls each counter once.
total_count1=counter(a);
total_count2=counter2(b);
total_count=total_count1+total_count2;
function count = counter(enable_ctr)
%four bit synchronous up counter
%persistent variable for the state
persistent count_val;
if isempty(count_val)
count_val = 0;
end
%counting up
if enable_ctr
count_val=count_val+1;
end
%limit from four bits
if count_val>15
count_val=0;
end
count=count_val;
function count = counter2(enable_ctr)
%four bit synchronous up counter
%persistent variable for the state
persistent count_val;
if isempty(count_val)
count_val = 0;
end
%counting up
if enable_ctr
count_val=count_val+1;
end
%limit from four bits
if count_val>15
count_val=0;
end
count=count_val;