Сгенерируйте аппаратные экземпляры для локальных функций

Локальные функции MATLAB

Следующий пример показывает, как использовать локальные функции в MATLAB®, так, чтобы каждое выполнение локальной функции соответствовало модулю отдельного оборудования в сгенерированном HDL-коде. Этот пример демонстрирует лучшые практики для записи локальных функций в коде MATLAB, который подходит для генерации HDL-кода.

  • Если ваш код MATLAB выполняет локальную функцию многократно, сгенерированный HDL-код не обязательно инстанцирует нескольких аппаратных модулей. Вместо того, чтобы инстанцировать нескольких аппаратных модулей, множественные вызовы функции обычно обновляют переменную состояния.

  • Если вы хотите, чтобы сгенерированный HDL-код содержал несколько аппаратных модулей, соответствующих каждому выполнению локальной функции, задайте две различных локальных функции с тем же кодом, но различные имена функций. Если вы хотите избежать дублирования кода, рассмотрите использование Системных объектов, чтобы реализовать поведение в функции и инстанцировать Системы object™ многократно.

  • Если вы хотите указать, что отдельный файл HDL для каждой локальной функции в коде MATLAB, в Советнике по вопросам Рабочего процесса, на вкладке Advanced в разделе HDL Code Generation, выбирает Generate instantiable code for functions .

Код MATLAB для 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;