В следующем примере показано, как использовать локальные функции в MATLAB ®, чтобы каждое выполнение локальной функции соответствовало отдельному аппаратному модулю в сгенерированном коде HDL .
В этом примере демонстрируются рекомендации по написанию локальных функций в коде MATLAB, пригодном для создания кода HDL.
Если код MATLAB выполняет локальную функцию несколько раз, созданный код HDL не обязательно создает экземпляр нескольких аппаратных модулей. Вместо создания экземпляра нескольких аппаратных модулей несколько вызовов функции обычно обновляют переменную состояния.
Если необходимо, чтобы сгенерированный код HDL содержал несколько аппаратных модулей, соответствующих каждому выполнению локальной функции, укажите две различные локальные функции с одним и тем же кодом, но разными именами функций. Если вы хотите избежать дублирования кода, попробуйте использовать объекты System для реализации поведения в функции и создать экземпляр System object™ несколько раз.
Если требуется указать отдельный файл HDL для каждой локальной функции в коде MATLAB, на вкладке Дополнительно (Advisor) в разделе Создание кода HDL (HDL Code Generation) выберите Генерировать код экземпляра для функций (Generate instantable 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;