Генерация кода из блока MATLAB Function

Модель счетчика Использование блока MATLAB Function

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

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

Модель корневого уровня управляет подсистемой и включает блоки Display и To Workspace для использования в симуляции. (Блоки Рабочей области « Отображения» и «До» не генерируют HDL-код.)

Совет

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

eml_hdl_incrementer

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

Код функции инкрементера

Следующее описание кода дает полное 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

    The 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. Откройте диалоговое окно Параметры конфигурации.

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

    • Fixed step size: 1

    • Stop time: 5

  6. Нажмите кнопку OK, чтобы сохранить изменения и закрыть диалоговое окно Параметры конфигурации.

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

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

  1. Откройте Simulink® Браузер библиотек. Затем выберите библиотеку 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 and 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 определение функции из списка, приведенного в коде функции инкрементера, и вставьте его в редактор.

  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 Block Editor.

  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 and 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 добавьте блок Manual 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. Из библиотеки Раковины добавьте в модель блок Display. Соедините его с Out1 порт DUT_eML_Block подсистема.

  8. Из библиотеки Раковины добавьте в модель блок 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 switch, изменение Preset Value константа и изменение общего времени симуляции. Можно также захотеть изучить переменную рабочей области simout, который связан с блоком To Workspace.

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

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

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

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

  1. Откройте диалоговое окно Параметры конфигурации и щелкните на панели HDL Code Generation.

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

  3. Нажмите Apply.

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

В диалоговом окне Параметров конфигурации опции 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: Менторская графика® ModelSim® скрипт компиляции (vcom команда) для компиляции кода VHDL в двух .vhd файлы.

    • DUT_eML_Block_synplify.tcl: Синхронизация® скрипт синтеза.

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

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

См. также

Похожие темы