exponenta event banner

Создание кода из функционального блока MATLAB

Модель счетчика с использованием функционального блока MATLAB

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

Функциональный блок MATLAB находится в подсистеме, 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

    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. Задайте следующие опции решателя, которые полезны при моделировании этой модели.

    • Фиксированный размер шага: 1

    • Время остановки: 5

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

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

Добавление функционального блока MATLAB в модель

  1. Откройте браузер библиотеки Simulink ®. Затем выберите библиотеку Simulink/Пользовательские функции.

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

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

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

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

Настройка опций фиксированной точки для функционального блока MATLAB

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

  • ProductMode имущества fimath спецификация: 'FullPrecision'

  • SumMode имущества fimath спецификация: 'FullPrecision'

  • Рассматривайте эти унаследованные типы сигналов как опцию fi objects: Fixed-point (Это параметр по умолчанию.)

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

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

  2. Дважды щелкните блок MATLAB Function, чтобы открыть его для редактирования. Появится редактор функциональных блоков MATLAB.

  3. Щелкните Изменить данные (Edit Data). Откроется диалоговое окно Ports and Data Manager, в котором отображается значение по умолчанию. fimath спецификация и другие свойства для функционального блока MATLAB.

  4. Выберите «Указать другое». При выборе этой опции активируется поле ввода текста «MATLAB Function block».

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

    hdlfimath;
  6. Нажмите кнопку «Применить». Теперь должны появиться свойства функционального блока MATLAB, как показано на следующем рисунке.

  7. Закройте диспетчер портов и данных.

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

Программирование функционального блока MATLAB

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

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

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

  3. В редакторе функциональных блоков MATLAB удалите код по умолчанию.

  4. Копировать завершенное incrementer определение функции из списка, приведенного в разделе Инкрементный код функции, и вставьте его в редактор.

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

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

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

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

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

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

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

Построение и подключение подсистемы DUT_eML_Block

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

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

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

  1. Щелкните значок incrementer функциональный блок.

  2. На вкладке «Моделирование» панели инструментов Simulink выберите «Создать подсистему».

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

  3. Изменить Subsystem метка для DUT_eML_Block.

Установка типов данных порта для функционального блока MATLAB

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

  2. Дважды щелкните значок incrementer для открытия редактора функциональных блоков MATLAB.

  3. В редакторе нажмите Изменить данные, чтобы открыть Диспетчер портов и данных.

  4. Выберите ctr_preset в списке портов слева. Нажмите кнопку > > для отображения помощника по типам данных. Установить режим для этого порта вBuilt in. Задайте для типа данных значение boolean. Нажмите кнопку < <, чтобы закрыть мастер типов данных. Нажмите кнопку «Применить».

  5. Выберите ctr_preset_val в списке портов слева. Нажмите кнопку > > для отображения помощника по типам данных. Установить режим для этого порта вFixed point. Установить для подписи значение Unsigned. Установите длину Word равной 14. Нажмите кнопку < <, чтобы закрыть мастер типов данных. Нажмите кнопку «Применить».

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

  7. Закройте диалоговое окно «Ports and Data Manager» и редактор функциональных блоков MATLAB.

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

Подключение портов подсистемы к модели

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

  1. Из библиотеки «Источники» добавьте в модель блок «Константа». Установите значение блока Constant равным 1, а тип данных Output - равным boolean. Изменение метки блока на Preset.

  2. Сделайте копию Preset Постоянный блок. Задайте значение 0 и измените метку блока на Increment.

  3. Из библиотеки маршрутизации сигналов добавьте в модель блок ручного переключения. Изменить его метку на Control. Подключите его выход к In1 порт шлюза DUT_eML_Block подсистема.

  4. Подключите Preset Постоянный блок к верхнему входу Control блок переключения. Подключите Increment Постоянный блок на нижнем входе Control блок переключения.

  5. Добавьте в модель третий блок константы. Установите для константы значение 15, а для типа данных Output - значение Inherit via back propagation. Изменение метки блока на Preset Value.

  6. Подключите Preset Value Постоянный блок к In2 порт шлюза DUT_eML_Block подсистема.

  7. Из библиотеки «Раковины» добавьте в модель блок «Отображение». Подключите его к Out1 порт шлюза DUT_eML_Block подсистема.

  8. Из библиотеки «Раковины» добавьте в модель блок «В рабочее пространство». Маршрутизация выходного сигнала от DUT_eML_Block к блоку «В рабочую область».

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

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

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

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

  2. Дважды щелкните по функциональному блоку MATLAB incrementer чтобы открыть его для редактирования.

  3. В редакторе функциональных блоков MATLAB выберите Build Model > Build для компиляции и построения кода функционального блока MATLAB.

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

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

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

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

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

  1. На вкладке «Отладка» панели инструментов Simulink в разделе «Информационные наложения» > «Порты» выберите «Базовые типы данных».

  2. Нажмите клавиши Ctrl + D для компиляции и обновления модели. Это вызывает перестроение кода. После компиляции модели блок-схема обновляется для отображения типов данных порта.

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

Моделирование модели eml_hdl_incrementer_tut

Начать моделирование. При необходимости код перестраивается перед началом моделирования.

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

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

Создание кода HDL

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

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

Выберите DUT_eML_Block подсистема формирования кода:

  1. Откройте диалоговое окно Параметры конфигурации (Configuration Parameters) и щелкните панель Создание кода HDL (HDL Code Generation).

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

  3. Нажмите кнопку «Применить».

Создание кода VHDL

В диалоговом окне «Параметры конфигурации» параметры генерации кода HDL верхнего уровня должны быть установлены следующим образом:

  • Поле Generate HDL for определяет eml_hdl_incrementer_tut/DUT_eML_Block подсистема формирования кода.

  • Поле Язык определяет (по умолчанию) создание кода VHDL.

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

Перед созданием кода выберите пункт Текущая папка (Current Folder) в меню Компоновка (Layout) в окне команды MATLAB (MATLAB Command Window). Откроется браузер «Текущая папка», который позволит легко получить доступ к рабочей папке и файлам, созданным в ней.

Для создания кода:

  1. Нажмите кнопку «Создать».

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

  2. По мере формирования кода кодер отображает сообщения о ходе выполнения. Процесс должен завершаться следующим сообщением:

    ### HDL Code Generation Complete.
    

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

  3. Значок папки для hdlsrc Теперь папка отображается в браузере текущей папки. Для просмотра созданных файлов кода и сценариев дважды щелкните значок hdlsrc значок папки.

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

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

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

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

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

    • DUT_eML_Block_compile.do: Сценарий компиляции Mentor 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 значки файлов в браузере текущей папки.

См. также

Связанные темы