Следующий пример показывает, как использовать локальные функции в MATLAB®, так, чтобы каждое выполнение локальной функции соответствовало модулю отдельного оборудования в сгенерированном HDL-коде. Этот пример демонстрирует лучшые практики для записи локальных функций в коде MATLAB, который подходит для генерации HDL-кода.
Если ваш код MATLAB выполняет локальную функцию многократно, сгенерированный HDL-код не обязательно инстанцирует нескольких аппаратных модулей. Вместо того, чтобы инстанцировать нескольких аппаратных модулей, множественные вызовы функции обычно обновляют переменную состояния.
Если вы хотите, чтобы сгенерированный HDL-код содержал несколько аппаратных модулей, соответствующих каждому выполнению локальной функции, задайте две различных локальных функции с тем же кодом, но различные имена функций. Если вы хотите избежать дублирования кода, рассмотрите использование Системных объектов, чтобы реализовать поведение в функции и инстанцировать Системы 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;