Освоение циклов While в VHDL: динамическое управление итерациями
Продолжая изучение циклов for, этот урок погружается в цикл while — мощную конструкцию, позволяющую управлять итерациями на основе динамических условий, а не заранее заданного диапазона.
Цикл while выполняет свое тело многократно, пока указанное условие остается true. Это делает его идеальным для сценариев, где количество итераций зависит от данных во время выполнения или сложной логики.
Этот пост входит в серию базовых уроков VHDL.
Синтаксис
while <condition> loop -- тело цикла end loop;
Условие <condition> должно вычисляться в булевское значение. Оно может быть простым сравнением или более сложным выражением. Условие проверяется перед каждой итерацией, гарантируя, что цикл продолжается только пока оно истинно.
Примеры условий
i < 10— истинно, покаiменьше 10.i /= 10— истинно, покаiне равно 10.i >= 0 and i < 2**8— истинно для значений от 0 до 255.
Операторы отношения
| = | равно |
| /= | не равно |
| < | меньше |
| <= | меньше или равно |
| > | больше |
| >= | больше или равно |
Логические операторы
| 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 равны |
Упражнение
Посмотрите видеоурок ниже, чтобы увидеть, как переменная управляет циклом while на практике:
Пример кода
entity T05_WhileLoopTb is end entity; architecture sim of T05_WhileLoopTb is begin process is variable i : integer := 0; begin while i < 10 loop report "i=" & integer'image(i); i := i + 2; end loop; wait; end process; end architecture;
Вывод симулятора
VSIM 2> run # ** Note: i=0 # Time: 0 ns Iteration: 0 Instance: /t05_whilelooptb # ** Note: i=2 # Time: 0 ns Iteration: 0 Instance: /t05_whilelooptb # ** Note: i=4 # Time: 0 ns Iteration: 0 Instance: /t05_whilelooptb # ** Note: i=6 # Time: 0 ns Iteration: 0 Instance: /t05_whilelooptb # ** Note: i=8 # Time: 0 ns Iteration: 0 Instance: /t05_whilelooptb
Анализ
Мы инициализируем i значением 0 и используем i < 10 как условие цикла. Поскольку цикл увеличивает i на 2 каждый проход, последнее выведенное значение — 8. На следующем проходе условие становится ложным (10 не меньше 10), и цикл завершается. Последующий wait; приостанавливает процесс бесконечно, что является распространенным паттерном для тестбенчей.

Ключевые выводы
- Цикл
whileвыполняется, пока его условие остаетсяtrue. - Условие оценивается перед каждой итерацией.
- Переменные могут быть объявлены внутри процесса и обновляться внутри цикла.
Пройдите Базовый тест VHDL — часть 1 или перейдите к следующему уроку.
VHDL
- Как молибден формирует современную промышленность: применение, преимущества и динамика поставок
- Создание списков строк в VHDL: лучшие практики и пример
- Корректное завершение симуляции VHDL-тестбенча
- Реализация PWM-контроллера в VHDL: проектирование, симуляция и FPGA-демо
- Генерация случайных чисел в VHDL: от Uniform к OSVVM
- Использование внутрипроцессных процедур для более чистого проектирования FSM на VHDL
- Использование нечистых функций в VHDL: повышение читаемости и поддерживаемости FSM
- Освоение функций VHDL: практическое руководство по эффективному дизайну
- Проектирование конечного автомата в VHDL: практический пример светофора
- Освоение техник шлифовального станка для режущих инструментов: практическое руководство