Как использовать функцию в VHDL
Функции — это подпрограммы на VHDL, которые можно использовать для реализации часто используемых алгоритмов. Функция принимает ноль или более входных значений и всегда возвращает значение. В дополнение к возвращаемому значению функция отличается от процедуры тем, что она не может содержать операторы ожидания. Это означает, что функции всегда потребляют нулевое время моделирования.
Если вы знакомы с функциями или методами из других языков программирования, вам должно быть легко понять функции VHDL. В VHDL мы не можем опускать возвращаемое значение или возвращать void, функция всегда должна что-то возвращать, а возвращаемое значение должно чему-то присваиваться.
Эта запись в блоге является частью серии учебных пособий по основам VHDL.
В VHDL есть два типа функций:чистые и нечистый функции. То, что функция является чистой, означает, что ей не разрешается изменять или читать какой-либо внешний сигнал. Мы можем быть уверены, что когда мы вызываем чистую функцию с определенными аргументами, она всегда будет возвращать одно и то же значение. Мы говорим, что функция не имеет никаких побочных эффектов. .
Синтаксис объявления функции в VHDL:
06
Ключевое слово pure/impure является необязательным, хотя по умолчанию оно будет чистым, если ключевое слово опущено. Все параметры рассматриваются как константы внутри функции. Таким образом, их нельзя изменить. Значения по умолчанию являются необязательными, и функция всегда должна заканчиваться на 05
. заявление.
У функций есть собственная декларативная область между 13
и 26
ключевые слова. Константы, сигналы или переменные, объявленные здесь, действительны только внутри самой функции, и они не сохранят свои значения при последующих вызовах функции.
Упражнение
В этом уроке мы сосредоточимся на чистой функции, нечистые функции будут рассмотрены в одном из следующих уроков этой серии.
В предыдущем уроке мы создали модуль контроллера светофора с помощью конечного автомата (FSM). Мы скопировали и вставили многие строки, содержащие расчеты таймера из одного состояния в другое, лишь слегка изменив одну константу.
Узнайте, как можно упростить код конечного автомата с помощью функции:
Окончательный код функции testbench :
15пре>Окончательный код для модуля светофора :
23Форма волны после ввода
38
команда в консоли ModelSim:
Форма волны с курсорами, добавленными при переходах к
44
и обратно. состояние:
Анализ
Мы заменили вычисления таймера из предыдущего урока
54
с вызовом нового62
функция, которую мы создали:79
.На первом скриншоте формы волны видно, что функция модуля не изменилась. Использование функций для повторяющихся задач — хорошая практика проектирования. Особенно, если вы можете заменить расчеты более читаемыми строками, содержащими такие термины, как
84
. и99
.Еще одним преимуществом использования функций является то, что мы можем изменить реализацию всех таймеров сразу, вместо того, чтобы делать это построчно. Например, если бы мы написали
101
в114
функции, все таймеры проработали бы на один такт слишком долго. Затем мы могли бы изменить это значение на120
. в134
функция, и все таймеры будут зафиксированы сразу.Если мы посмотрим на последний снимок экрана сигнала, то увидим, почему нам нужно вычесть 1 из значения таймера, возвращаемого из
141
. функция. Этот сигнал проверяет продолжительность152
состояние, оно должно длиться ровно пять секунд. Когда167
сигнал меняется на174
,184
значение равно 0, и оно изменяется только после следующего такта. Итак, если бы мы насчитали до 500 тактов,193
состояние на самом деле длилось бы 501 цикл. Если наш тестовый стенд работает на частоте 100 Гц, 500 тактовых циклов составляют ровно пять секунд.
Вывод
- Функции могут принимать ноль или более параметров, но они всегда возвращают значение
- Функции не могут содержать
206
заявления - Чистые функции не могут иметь побочных эффектов, а нечистые — могут.
Перейти к следующему руководству »
VHDL
- Как мы используем молибден?
- Как создать список строк в VHDL
- Как остановить симуляцию в тестовом стенде VHDL
- Как создать ШИМ-контроллер на VHDL
- Как генерировать случайные числа в VHDL
- Как использовать процедуру в процессе в VHDL
- Как использовать нечистую функцию в VHDL
- Функция realloc() в библиотеке C:как использовать? Синтаксис и пример
- Функция free() в библиотеке C:как использовать? Учитесь на примере
- Как использовать шлифовальный станок