Генерация кода от блока 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 команда. 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. На вкладке Modeling Панели инструментов Simulink выберите Create Subsystem.

    Подсистема, пометил 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 Постоянный блок. Установите его значение к 0 и измените его метку блока в Increment.

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

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

  5. Добавьте третий блок Constant в модель. Установите значение 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. Во вкладке Debug Панели инструментов Simulink, на разделе Information Overlays> Ports, выбирают Base data types.

  2. Нажмите 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 значки файла в Браузере текущей папки.

Смотрите также

Похожие темы