В этом примере вы создаете и конфигурируете простую модель, 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
функциональное определение:
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);
Прежде чем вы начнете создавать модель в качестве примера, настроите рабочую папку для своего типового кодекса и сгенерированного кода.
Запустите MATLAB®.
Создайте папку под названием eml_tut
, например:
mkdir D:\work\eml_tut
eml_tut
папка хранит модель, которую вы создаете, и также содержит подпапки и сгенерированный код. Местоположение папки не имеет значения, за исключением того, что это не должно быть в дереве MATLAB.
Сделайте eml_tut
папка ваша рабочая папка, например:
cd D:\work\eml_tut
В этом разделе вы создаете модель и устанавливаете некоторые параметры на значения, рекомендуемые для генерации HDL-кода hdlsetup
команда. hdlsetup
команда использует set_param
функционируйте, чтобы настраивать модели для генерации HDL-кода быстро и последовательно. Смотрите Настраивают Функцию hdlsetup На основе Целевого приложения для получения дополнительной информации о hdlsetup
.
Устанавливать параметры модели:
Создайте новую модель.
Сохраните модель как eml_hdl_incrementer_tut
.
В командной строке MATLAB введите:
hdlsetup('eml_hdl_incrementer_tut');
Откройте диалоговое окно Configuration Parameters.
Установите следующие опции Solver, которые полезны в симуляции этой модели:
Fixed step size: 1
Stop time: 5
Нажмите OK, чтобы сохранить ваши изменения и закрыть диалоговое окно Configuration Parameters.
Сохраните свою модель.
Откройте Simulink® Library Browser. Затем выберите библиотеку Simulink / User-Defined Functions.
Выберите блок MATLAB Function из окна библиотеки и добавьте его в модель.
Измените метку блока от MATLAB Function
к eml_inc_block
.
Сохраните модель.
Закройте браузер библиотеки Simulink.
В этом разделе описывается настроить fimath
спецификация и другие опции фиксированной точки, которые рекомендуются для эффективной генерации HDL-кода от блока MATLAB Function. Рекомендуемые настройки:
ProductMode
свойство fimath
спецификация: 'FullPrecision'
SumMode
свойство fimath
спецификация: 'FullPrecision'
Опция Treat these inherited signal types as fi objects: Fixed-point
(Это - настройка по умолчанию.)
Сконфигурируйте опции можно следующим образом:
Откройте eml_hdl_incrementer_tut
модель, которую вы создали в Добавлении блока MATLAB function к Модели.
Дважды кликните блок MATLAB Function, чтобы открыть его для редактирования. Редактор Блока MATLAB Function появляется.
Нажмите Edit Data. Диалоговое окно Ports и Data Manager открывается, отображая fimath
по умолчанию спецификация и другие свойства для блока MATLAB Function.
Выберите Specify Other. Выбирание этой опции включает поле ввода текста MATLAB Function block fimath.
hdlfimath
функция является утилитой, которая задает спецификацию FIMATH, которая оптимизирована для генерации HDL-кода. Замените спецификацию MATLAB Function block fimath по умолчанию на вызов hdlfimath
можно следующим образом:
hdlfimath;
Нажмите Apply. Свойства блока MATLAB Function должны теперь появиться как показано в следующем рисунке.
Закройте порты и менеджер данных.
Сохраните модель.
Следующий шаг, добавляет код к блоку MATLAB Function, чтобы задать incrementer
функция, и затем использует диагностику, чтобы проверить ошибки.
Откройте eml_hdl_incrementer_tut
модель, которую вы создали в Добавлении блока MATLAB function к Модели.
Дважды кликните блок MATLAB Function, чтобы открыть его для редактирования.
В Редакторе Блока MATLAB Function удалите код по умолчанию.
Скопируйте полный incrementer
функциональное определение из листинга, данного в Коде Функции Incrementer и вставке это в редактор.
Сохраните модель. Выполнение так обновляют окно модели, перерисовка блока MATLAB Function.
Изменение функционального заголовка блока MATLAB Function вносит следующие изменения в значок блока:
Имя функции посреди блока превращается в incrementer
.
Аргументы ctr_preset
и ctr_preset_val
появитесь как входные порты с блоком.
Возвращаемое значение counter
появляется как выходной порт от блока.
Измените размер блока, чтобы сделать метки порта более четкими.
Сохраните модель снова.
Этот раздел принимает, что вы завершили Программирование блока MATLAB function, не сталкиваясь с ошибкой. В этом разделе вы создаете подсистему, содержащую incrementer
функциональный блок, чтобы использоваться в качестве устройства под тестом (DUT), от которого можно сгенерировать HDL-код. Вы затем устанавливаете типы данных порта и соединяете порты подсистемы с моделью.
Создайте подсистему, содержащую incrementer
функциональный блок можно следующим образом:
Нажмите incrementer
функциональный блок.
Выберите Diagram> Subsystem & Model Reference> Create Subsystem from Selection.
Подсистема, пометил Subsystem
, создается в окне модели.
Измените Subsystem
пометьте к DUT_eML_Block
.
Дважды кликните подсистему, чтобы просмотреть ее внутреннюю часть. Как показано в следующем рисунке подсистема содержит incrementer
функциональный блок, с соединенными портами ввода и вывода.
Дважды кликните incrementer
функциональный блок, чтобы открыть Редактор Блока MATLAB Function.
В редакторе нажмите Edit Data, чтобы открыть Порты и Менеджер данных.
Выберите ctr_preset
запись в списке портов слева. Нажмите кнопку, помеченную>>, чтобы отобразить Ассистент Типа данных. Установите Mode для этого порта к Built in
. Установите Data type на boolean
. Нажмите кнопку, помеченную <<, чтобы закрыть Ассистент Типа данных. Нажмите Apply.
Выберите ctr_preset_val
запись в списке портов слева. Нажмите кнопку, помеченную>>, чтобы отобразить Ассистент Типа данных. Установите Mode для этого порта к Fixed point
. Установите Signedness на Unsigned
. Установите Word length на 14. Нажмите кнопку, помеченную <<, чтобы закрыть Ассистент Типа данных. Нажмите Apply.
Выберите counter
запись в списке портов слева. Нажмите кнопку, помеченную>>, чтобы отобразить Ассистент Типа данных. Проверьте, что Mode для этого порта установлен в Inherit: Same as Simulink
. Нажмите кнопку, помеченную <<, чтобы закрыть Ассистент Типа данных. Нажмите Apply.
Закройте диалоговое окно Ports и Data Manager и Редактор Блока MATLAB Function.
Сохраните модель и закройте DUT_eML_Block
подсистема.
Затем соедините порты DUT_eML_Block
подсистема к модели можно следующим образом:
От библиотеки Sources добавьте блок Constant в модель. Установите значение блока Constant к 1 и Output data type к boolean
. Измените метку блока в Preset
.
Сделайте копию Preset
Постоянный блок. Установите его значение к 0 и измените его метку блока в Increment
.
От библиотеки Signal Routing добавьте Ручной блок switch в модель. Измените его метку в Control
. Соедините его выход с In1
порт DUT_eML_Block
подсистема.
Соедините Preset
Блок Constant к верхнему входу Control
блок switch. Соедините Increment
Блок Constant к более низкому входу Control
блок switch.
Добавьте третий блок Constant в модель. Установите значение Constant к 15 и Output data type к Inherit via back propagation
. Измените метку блока в Preset Value
.
Соедините Preset Value
Блок Constant к In2
порт DUT_eML_Block
подсистема.
От библиотеки Sinks добавьте блок Display в модель. Соедините его с Out1
порт DUT_eML_Block
подсистема.
От библиотеки Sinks добавьте блок To Workspace в модель. Направьте выходной сигнал DUT_eML_Block
подсистема с блоком To Workspace.
Сохраните модель.
Используйте встроенную диагностику блоков MATLAB Function, чтобы протестировать на синтаксические ошибки:
Откройте eml_hdl_incrementer_tut
модель.
Дважды кликните блок MATLAB Function incrementer
открыть его для редактирования.
В Редакторе Блока MATLAB Function выберите Build Model> Build, чтобы скомпилировать и создать блочный код MATLAB Function.
Процесс сборки отображает некоторые сообщения о ходе выполнения. Эти сообщения включают некоторые предупреждения, потому что порты блока MATLAB Function еще не соединяются с сигналами. Можно проигнорировать эти предупреждения.
Процесс сборки создает S-функцию для использования в симуляции. Процесс сборки включает генерацию кода С для S-функции. Сообщения генерации кода, которые вы видите во время процесса сборки, относятся к генерации кода С, не генерации HDL-кода.
Когда сборка завершает, не сталкиваясь с ошибкой, окно сообщения кажется указывающим, что парсинг был успешен. Если ошибки найдены, менеджер Диагностики перечисляет их. См. документацию блока MATLAB Function для получения информации об отладке ошибок сборки блока MATLAB Function.
В этом разделе вы включаете отображение типов данных порта и затем компилируете модель. Компиляция модели проверяет структуру модели и настройки, и обновляет отображение модели.
Выберите Display> Signals & Ports> Port Data Types.
Выберите Simulation> Update Diagram (или нажмите Ctrl+D) скомпилировать модель. Это инициировало восстанавливание кода. После компиляций модели блок-схема обновляется, чтобы показать типы данных порта.
Сохраните модель.
Запустите симуляцию. При необходимости код восстанавливает, прежде чем симуляция запускается.
После того, как симуляция завершается, блок Display показывает значение окончательного результата, возвращенное incrementer
функциональный блок. Например, учитывая Start time 0, Stop time 5, и нулевое значение в ctr_preset
порт, симуляция возвращает значение 6:
Вы можете хотеть экспериментировать с результатами переключения Control
переключитесь, изменив Preset Value
постоянный, и изменение общего времени симуляции. Вы можете также хотеть исследовать переменную simout
рабочей области, который связан с блоком To Workspace.
В этом разделе вы выбираете DUT_eML_Block
подсистема для генерации HDL-кода, опций генерации абсолютного кода набора, и затем генерирует код VHDL для подсистемы.
Выберите DUT_eML_Block
подсистема для генерации кода:
Откройте диалоговое окно Configuration Parameters и кликните по панели HDL Code Generation.
Выберите eml_hdl_incrementer_tut/DUT_eML_Block
из списка Generate HDL for.
Нажмите Apply.
В диалоговом окне Configuration Parameters опции HDL Code Generation верхнего уровня должны теперь быть установлены можно следующим образом:
Поле Generate HDL for задает eml_hdl_incrementer_tut/DUT_eML_Block
подсистема для генерации кода.
Поле Language задает (по умолчанию) генерацию кода VHDL.
Поле Folder указывает (по умолчанию), что целевая папка генерации кода является подпапкой вашей рабочей папки, названной hdlsrc
.
Прежде, чем сгенерировать код, выберите Current Folder из меню Layout в Окне Команды MATLAB. Это отображает Браузер текущей папки, который позволяет вам легко получить доступ к своей рабочей папке и файлам, которые сгенерированы в нем.
Сгенерировать код:
Нажмите кнопку Generate.
HDL Coder™ компилирует модель прежде, чем сгенерировать код. В зависимости от параметров отображения модели (таких как типы данных порта), внешний вид изменения силы модели после генерации кода.
В то время как генерация кода продолжает, кодер отображает сообщения о ходе выполнения. Процесс должен вместе с сообщением как следующее:
### HDL Code Generation Complete.
Имена сгенерированных файлов VHDL в сообщениях о ходе выполнения связываются гиперссылками. После того, как генерация кода завершается, можно кликнуть по этим гиперссылкам, чтобы просмотреть файлы в редакторе MATLAB.
Значок папки для hdlsrc
папка теперь отображается в Браузере текущей папки. Чтобы просмотреть сгенерированный код и файлы скрипта, дважды кликните hdlsrc
значок папки.
Заметьте, что были сгенерированы два файла 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
: Отображение файла. Эти карты файлов отчета сгенерировали сущности (или модули) к подсистемам, которые сгенерировали их (см., что Код Трассировки Использует Файл Отображения).
Чтобы просмотреть сгенерированный код VHDL в редакторе MATLAB, дважды кликните DUT_eML_Block.vhd
или eml_inc_blk.vhd
значки файла в Браузере текущей папки.
Проверяйте на настройки блока MATLAB function