Генерация кода от блока MATLAB function

Встречная Модель Используя блок MATLAB function

В этом примере вы создаете и конфигурируете простую модель, eml_hdl_incrementer_tut, и затем генерируете код VHDL® из модели. eml_hdl_incrementer_tut включает блок MATLAB function, который реализует простую функцию счетчика фиксированной точки, incrementer. Функция incrementer вызывается однажды в каждый демонстрационный период модели. Функция поддерживает персистентную переменную count, которая или постепенно увеличивается или повторно инициализируется к предварительно установленному значению (ctr_preset_val), в зависимости от значения, переданного в к входу ctr_preset блока MATLAB function. Функция возвращает встречное значение (counter) при выводе блока MATLAB function.

Блок MATLAB function находится в подсистеме, DUT_eML_Block. Подсистема функционирует как устройство под тестом (DUT), от которого вы генерируете HDL-код.

Модель корневого уровня управляет подсистемой и включает Отображение и В блоки Рабочей области для использования в симуляции. (Отображение и К блокам Рабочей области не генерирует HDL-код.)

Совет

Если вы не хотите создавать модель шаг за шагом или не имеете времени, можно открыть завершенную модель путем ввода имени в командной строке:

eml_hdl_incrementer

После того, как вы открываете модель, сохраняете копию ее к вашей локальной папке как eml_hdl_incrementer_tut.

Код функции Incrementer

Следующий листинг кода дает полное определение функции incrementer:

function counter = incrementer(ctr_preset, ctr_preset_val)
% The function incrementer implements a preset counter that counts
% how many times this block is called. 
%
% This example function shows how to model memory with persistent variables,
% using fimath settings suitable for HDL. It also demonstrates MATLAB
% operators and other language features that HDL Coder supports
% for code generation from Embedded MATLAB Function block.
%
% On the first call, the result 'counter' is initialized to zero.
% The result 'counter' saturates if called more than 2^14-1 times.
% If the input ctr_preset receives a nonzero value, the counter is 
% set to a preset value passed in to the ctr_preset_val input.


persistent current_count;
if isempty(current_count)
    % zero the counter on first call only
    current_count = uint32(0); 
end
           

counter = getfi(current_count);

if ctr_preset
    % set counter to preset value if input preset signal is nonzero
    counter = ctr_preset_val; 
else
    % otherwise count up
    inc = counter + getfi(1); 
    counter = getfi(inc);    
end

% store counter value for next iteration
current_count = uint32(counter);

function hdl_fi = getfi(val)

nt = numerictype(0,14,0);
fm = hdlfimath;
hdl_fi = fi(val, nt, fm);

Подготовка

Прежде чем вы начнете создавать модель в качестве примера, настроите рабочую папку для своего типового кодекса и сгенерированного кода.

Подготовка папки

  1. Запустите MATLAB®.

  2. Создайте папку под названием eml_tut, например:

    mkdir D:\work\eml_tut

    Папка eml_tut хранит модель, которую вы создаете, и также содержит подпапки и сгенерированный код. Местоположение папки не имеет значения, за исключением того, что это не должно быть в дереве MATLAB.

  3. Сделайте папку eml_tut вашей рабочей папкой, например:

    cd D:\work\eml_tut

Создание модели и конфигурирование общих образцовых настроек

В этом разделе вы создаете модель и устанавливаете некоторые параметры на значения, рекомендуемые для генерации HDL-кода команда hdlsetup.m. Команда hdlsetup использует функцию set_param, чтобы настраивать модели для генерации HDL-кода быстро и последовательно. Смотрите Настраивают Функцию hdlsetup На основе Целевого приложения для получения дополнительной информации о hdlsetup.

Устанавливать параметры модели:

  1. Создайте новую модель.

  2. Сохраните модель как eml_hdl_incrementer_tut.

  3. В подсказке команды MATLAB введите:

    hdlsetup('eml_hdl_incrementer_tut');
    
  4. Откройте диалоговое окно Configuration Parameters.

  5. Установите следующие опции Solver, которые полезны в симуляции этой модели:

    • Fixed step size: 1

    • Stop time: 5

  6. Нажмите OK, чтобы сохранить ваши изменения и закрыть диалоговое окно Configuration Parameters.

  7. Сохраните свою модель.

Добавление блока MATLAB function к модели

  1. Откройте Simulink® Library Browser. Затем выберите библиотеку Simulink / User-Defined Functions.

  2. Выберите блок MATLAB function из окна библиотеки и добавьте его в модель.

  3. Измените метку блока от MATLAB Function до eml_inc_block.

  4. Сохраните модель.

  5. Закройте браузер библиотеки Simulink.

Установите опции фиксированной точки для блока MATLAB function

В этом разделе описывается настроить спецификацию fimath и другие опции фиксированной точки, которые рекомендуются для эффективной генерации HDL-кода от блока MATLAB function. Рекомендуемые настройки:

  • Свойство ProductMode спецификации fimath: 'FullPrecision'

  • Свойство SumMode спецификации fimath: 'FullPrecision'

  • Опция Treat these inherited signal types as fi objects: Fixed-point (Это - настройка по умолчанию.)

Сконфигурируйте опции можно следующим образом:

  1. Откройте модель eml_hdl_incrementer_tut, которую вы создали в Добавлении блока MATLAB function к Модели.

  2. Дважды кликните блок MATLAB function, чтобы открыть его для редактирования. Редактор блока MATLAB function появляется.

  3. Нажмите Edit Data. Диалоговое окно Ports и Data Manager открывается, отображая спецификацию fimath по умолчанию и другие свойства для блока MATLAB function.

  4. Выберите Specify Other. Выбор этой опции включает поле ввода текста MATLAB Function block fimath.

  5. Функция hdlfimath является утилитой, которая задает спецификацию FIMATH, которая оптимизирована для генерации HDL-кода. Замените спецификацию MATLAB Function block fimath по умолчанию на вызов hdlfimath можно следующим образом:

    hdlfimath;
  6. Нажмите Apply. Свойства блока MATLAB function должны теперь появиться как показано в следующей фигуре.

  7. Закройте порты и менеджер данных.

  8. Сохраните модель.

Программирование блока MATLAB function

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

  1. Откройте модель eml_hdl_incrementer_tut, которую вы создали в Добавлении блока MATLAB function к Модели.

  2. Дважды кликните блок MATLAB function, чтобы открыть его для редактирования.

  3. В Редакторе блока MATLAB function удалите код по умолчанию.

  4. Скопируйте полное определение функции incrementer с листинга, данного в Коде Функции Incrementer, и вставьте его в редактор.

  5. Сохраните модель. Выполнение так обновляют окно модели, перерисовка блока MATLAB function.

    Изменение функционального заголовка блока MATLAB function вносит следующие изменения в значок блока:

    • Имя функции посреди блока изменяется на incrementer.

    • Аргументы ctr_preset и ctr_preset_val появляются как входные порты к блоку.

    • Возвращаемое значение counter появляется как выходной порт от блока.

  6. Измените размер блока, чтобы сделать метки порта более четкими.

  7. Сохраните модель снова.

Построение и соединение подсистемы DUT_eML_Block

Этот раздел принимает, что вы завершили Программирование блока MATLAB function, не сталкиваясь с ошибкой. В этом разделе вы создаете подсистему, содержащую функциональный блок incrementer, чтобы использоваться в качестве устройства под тестом (DUT), от которого можно сгенерировать HDL-код. Вы затем устанавливаете типы данных порта и соединяете порты подсистемы с моделью.

Построение подсистемы DUT_eML_Block

Создайте подсистему, содержащую функциональный блок incrementer можно следующим образом:

  1. Кликните по функциональному блоку incrementer.

  2. Выберите Diagram> Subsystem & Model Reference> Create Subsystem from Selection.

    Подсистема, маркировал Subsystem, создается в окне модели.

  3. Измените метку Subsystem на DUT_eML_Block.

Установка типов данных порта для блока MATLAB function

  1. Дважды кликните подсистему, чтобы просмотреть ее внутреннюю часть. Как показано в следующей фигуре, подсистема содержит функциональный блок incrementer с соединенными портами ввода и вывода.

  2. Дважды кликните функциональный блок incrementer, чтобы открыть Редактор блока MATLAB function.

  3. В редакторе нажмите Edit Data, чтобы открыть Порты и Менеджер данных.

  4. Выберите запись ctr_preset в списке портов слева. Нажмите кнопку, маркированную>>, чтобы отобразить Ассистент Типа данных. Установите Mode для этого порта к Built in. Установите Data type на boolean. Нажмите кнопку, маркированную <<, чтобы закрыть Ассистент Типа данных. Нажмите Apply.

  5. Выберите запись ctr_preset_val в списке портов слева. Нажмите кнопку, маркированную>>, чтобы отобразить Ассистент Типа данных. Установите Mode для этого порта к Fixed point. Установите Signedness на Unsigned. Установите Word length на 14. Нажмите кнопку, маркированную <<, чтобы закрыть Ассистент Типа данных. Нажмите Apply.

  6. Выберите запись counter в списке портов слева. Нажмите кнопку, маркированную>>, чтобы отобразить Ассистент Типа данных. Проверьте, что Mode для этого порта установлен в Inherit: Same as Simulink. Нажмите кнопку, маркированную <<, чтобы закрыть Ассистент Типа данных. Нажмите Apply.

  7. Закройте диалоговое окно Ports и Data Manager и Редактор блока MATLAB function.

  8. Сохраните модель и закройте подсистему DUT_eML_Block.

Соединение портов подсистемы к модели

Затем, соедините порты подсистемы DUT_eML_Block к модели можно следующим образом:

  1. От библиотеки Sources добавьте блок Constant в модель. Установите значение блока Constant к 1 и Output data type к boolean. Измените метку блока на Preset.

  2. Сделайте копию блока Preset Constant. Установите его значение к 0 и измените его метку блока на Increment.

  3. От библиотеки Signal Routing добавьте Ручной блок switch в модель. Измените его метку на Control. Соедините его вывод с портом In1 подсистемы DUT_eML_Block.

  4. Соедините блок Preset Constant с верхним входом блока switch Control. Соедините блок Increment Constant с более низким входом блока switch Control.

  5. Добавьте третий блок Constant в модель. Установите значение Константы к 15 и Output data type к Inherit via back propagation. Измените метку блока на Preset Value.

  6. Соедините блок Preset Value Constant с портом In2 подсистемы DUT_eML_Block.

  7. От библиотеки Sinks добавьте блок Display в модель. Соедините его с портом Out1 подсистемы DUT_eML_Block.

  8. От библиотеки Sinks добавьте блок To Workspace в модель. Направьте выходной сигнал от подсистемы DUT_eML_Block до блока To Workspace.

  9. Сохраните модель.

Проверение на наличие ошибок функции

Используйте встроенную диагностику блоков MATLAB function, чтобы протестировать на синтаксические ошибки:

  1. Откройте модель eml_hdl_incrementer_tut.

  2. Дважды кликните блок MATLAB function incrementer, чтобы открыть его для редактирования.

  3. В Редакторе блока MATLAB function выберите Build Model> Build, чтобы скомпилировать и создать код блока MATLAB function.

Процесс сборки отображает некоторые сообщения о ходе выполнения. Эти сообщения включают некоторые предупреждения, потому что порты блока MATLAB function еще не соединяются с сигналами. Можно проигнорировать эти предупреждения.

Процесс сборки создает S-функцию для использования в симуляции. Процесс сборки включает генерацию кода С для S-функции. Сообщения генерации кода, которые вы видите во время процесса сборки, относятся к генерации кода С, не генерации HDL-кода.

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

Компиляция модели и отображение типов данных порта

В этом разделе вы включаете отображение типов данных порта и затем компилируете модель. Образцовая компиляция проверяет образцовую структуру и настройки, и обновляет образцовое отображение.

  1. Выберите Display> Signals & Ports> Port Data Types.

  2. Выберите Simulation> Update Diagram (или нажмите Ctrl+D) скомпилировать модель. Это инициировало восстанавливание кода. После образцовых компиляций блок-схема обновляет, чтобы показать типы данных порта.

  3. Сохраните модель.

Симуляция eml_hdl_incrementer_tut Модели

Запустите симуляцию. При необходимости код восстанавливает, прежде чем симуляция запускается.

После того, как симуляция завершается, блок Display показывает значение окончательного результата, возвращенное функциональным блоком incrementer. Например, учитывая Start time 0, Stop time 5, и нулевое значение в порте ctr_preset, симуляция возвращает значение 6:

Вы можете хотеть экспериментировать с результатами переключения переключателя Control, изменения постоянного Preset Value, и изменения общего времени симуляции. Вы можете также хотеть исследовать переменную simout рабочей области, которая связана с блоком To Workspace.

Генерация HDL-кода

В этом разделе вы выбираете подсистему DUT_eML_Block для генерации HDL-кода, устанавливаете опции генерации абсолютного кода, и затем генерируете код VHDL для подсистемы.

Выбор подсистемы для генерации кода

Выберите подсистему DUT_eML_Block для генерации кода:

  1. Откройте диалоговое окно Configuration Parameters и кликните по панели HDL Code Generation.

  2. Выберите eml_hdl_incrementer_tut/DUT_eML_Block из списка Generate HDL for.

  3. Нажмите Apply.

Генерация кода VHDL

В диалоговом окне Configuration Parameters опции HDL Code Generation верхнего уровня должны теперь быть установлены можно следующим образом:

  • Поле Generate HDL for задает подсистему eml_hdl_incrementer_tut/DUT_eML_Block для генерации кода.

  • Поле Language задает (по умолчанию) генерацию кода VHDL.

  • Поле Folder указывает (по умолчанию), что целевая папка генерации кода является подпапкой вашей рабочей папки, названной hdlsrc.

Прежде, чем сгенерировать код, выберите Current Folder из меню Layout в Окне Команды MATLAB. Это отображает Браузер текущей папки, который позволяет вам легко получить доступ к своей рабочей папке и файлам, которые сгенерированы в нем.

Сгенерировать код:

  1. Нажмите кнопку Generate.

    HDL Coder™ компилирует модель прежде, чем сгенерировать код. В зависимости от образцовых параметров экрана (таких как типы данных порта), внешний вид образцового изменения силы после генерации кода.

  2. В то время как генерация кода продолжает, кодер отображает сообщения о ходе выполнения. Процесс должен вместе с сообщением как следующее:

    ### HDL Code Generation Complete.
    

    Имена сгенерированных файлов VHDL в сообщениях о ходе выполнения связываются гиперссылками. После того, как генерация кода завершается, можно кликнуть по этим гиперссылкам, чтобы просмотреть файлы в редакторе MATLAB.

  3. Значок папки для папки hdlsrc теперь видим в Браузере текущей папки. Чтобы просмотреть сгенерированный код и файлы скрипта, дважды кликните значок папки hdlsrc.

  4. Заметьте, что были сгенерированы два файла VHDL. Структура HDL-кода, сгенерированного для блоков MATLAB function, подобна структуре кода, сгенерированного для графиков Stateflow® и Цифровых блоков Фильтра. Файлы VHDL, которые были сгенерированы в папке hdlsrc:

    • eml_inc_blk.vhd: код VHDL. Этот файл содержит сущность и код архитектуры, реализующий фактические вычисления, сгенерированные для блока MATLAB function.

    • DUT_eML_Block.vhd: код VHDL. Этот файл содержит определение сущности и архитектуру RTL, которые обеспечивают интерфейс черного квадрата к коду, сгенерированному в eml_inc_blk.vhd.

    Структура этих файлов кода походит на структуру модели, в которой подсистема DUT_eML_Block обеспечивает интерфейс между корневой моделью и функцией incrementer в блоке MATLAB function.

    Другие файлы, сгенерированные в папке hdlsrc:

    • DUT_eML_Block_compile.do: Наставник скрипт компиляции Graphics® ModelSim® (команда vcom), чтобы скомпилировать код VHDL в двух файлах .vhd.

    • DUT_eML_Block_synplify.tcl: скрипт синтеза Synplify®.

    • DUT_eML_Block_map.txt: Отображение файла. Эти карты файлов отчета сгенерировали сущности (или модули) к подсистемам, которые сгенерировали их (см., что Код Трассировки Использует Файл Отображения).

  5. Чтобы просмотреть сгенерированный код VHDL в редакторе MATLAB, дважды кликните DUT_eML_Block.vhd или значки файла eml_inc_blk.vhd в Браузере текущей папки.