Освоение условной логики в VHDL: конструкция If-Then-Elsif-Else
В предыдущем уроке мы использовали условное выражение с оператором Wait Until для запуска процесса только при совпадении двух счетчиков. Но что, если программа должна выполнять разные действия в зависимости от изменяющихся входных данных?
Конструкция If-Then-Elsif-Else позволяет ветвить логику. В зависимости от значения переменной или результата выражения программа может идти по разным путям.
Эта статья входит в серию базовых уроков VHDL.
Базовый синтаксис
Каноническая форма:
if <condition> then elsif <condition> then else end if;
Клаузы elsif и else опциональны, elsif может встречаться многократно. Условие <condition> может быть булевским литералом или выражением, вычисляющимся в true или false.
Пример: MyCounter < 10 истинно, когда MyCounter меньше десяти.
Операторы отношения
| = | равно |
| /= | не равно |
| < | меньше |
| <= | меньше или равно |
| > | больше |
| >= | больше или равно |
Логические операторы
| not a | истинно, если a ложно |
| a and b | истинно, если a и b истинны |
| a or b | истинно, если a или b истинны |
| a nand b | истинно, если a или b ложно |
| a nor b | истинно, если a и b ложны |
| a xor b | истинно, если ровно одно из a или b истинно |
| a xnor b | истинно, если a и b равны |
Упражнение
Ниже приведен полный пример VHDL, демонстрирующий работу конструкции If-Then-Elsif-Else.
Итоговый код:
entity T08_IfTb is end entity; architecture sim of T08_IfTb is signal CountUp : integer := 0; signal CountDown : integer := 10; begin process is begin CountUp <= CountUp + 1; CountDown <= CountDown - 1; wait for 10 ns; end process; process is begin if CountUp > CountDown then report "CountUp is larger"; elsif CountUp < CountDown then report "CountDown is larger"; else report "They are equal"; end if; wait on CountUp, CountDown; end process; end architecture;
Вывод консоли симулятора ModelSim:
VSIM 2> run # ** Note: CountDown is larger # Time: 0 ns Iteration: 0 Instance: /t08_iftb # ** Note: CountDown is larger # Time: 0 ns Iteration: 1 Instance: /t08_iftb # ** Note: CountDown is larger # Time: 10 ns Iteration: 1 Instance: /t08_iftb # ** Note: CountDown is larger # Time: 20 ns Iteration: 1 Instance: /t08_iftb # ** Note: CountDown is larger # Time: 30 ns Iteration: 1 Instance: /t08_iftb # ** Note: They are equal # Time: 40 ns Iteration: 1 Instance: /t08_iftb # ** Note: Countup is larger # Time: 50 ns Iteration: 1 Instance: /t08_iftb # ** Note: Countup is larger # Time: 60 ns Iteration: 1 Instance: /t08_iftb ...
Анализ
Мы инициализировали CountDown значением 10, а CountUp — 0. Оба счетчика обновляются одновременно каждые 10 нс в первом процессе. Второй процесс ждет изменений этих сигналов, поэтому он срабатывает при каждом их изменении. Блок If-Then-Elsif-Else выбирает одну из трех ветвей: CountUp > CountDown, CountUp < CountDown или CountUp = CountDown. Хотя явный else не обязателен, его включение считается лучшей практикой, гарантирующей обработку всех граничных случаев.
Трассировка консоли подтверждает, что второй процесс оценивает условие после каждого обновления, выводя соответствующее сообщение.
Вывод
- Используйте If-Then отдельно или комбинируйте с Elsif и Else для покрытия всех сценариев.
- Условия могут включать реляционные, логические и арифметические выражения.
Продолжить к следующему уроку »
VHDL
- Как молибден формирует современную промышленность: применение, преимущества и динамика поставок
- Создание списков строк в VHDL: лучшие практики и пример
- Корректное завершение симуляции VHDL-тестбенча
- Реализация PWM-контроллера в VHDL: проектирование, симуляция и FPGA-демо
- Генерация случайных чисел в VHDL: от Uniform к OSVVM
- Использование внутрипроцессных процедур для более чистого проектирования FSM на VHDL
- Использование нечистых функций в VHDL: повышение читаемости и поддерживаемости FSM
- Освоение функций VHDL: практическое руководство по эффективному дизайну
- Проектирование конечного автомата в VHDL: практический пример светофора
- Освоение техник шлифовального станка для режущих инструментов: практическое руководство