Бесконечный цикл
Часть раздела Основы путешествия по Verilog на Coddy. Урок 61 из 90.
Цикл forever повторяет блок кода непрерывно, бесконечно. Он никогда не останавливается сам по себе.
Цикл forever выполняется бесконечно. Он полезен для создания тактовых сигналов и других непрерывных сигналов в тестовых стендах.
Синтаксис:
forever begin
// Код, который повторяется бесконечно
endПростой пример
forever begin
$display("This prints forever");
endЭто будет выводиться бесконечно и приведёт к сбою симуляции. Всегда добавляй задержку или условие остановки.
Генерация тактового сигнала (распространённое применение)
Чаще всего forever используют для генерации тактового сигнала:
initial begin
clk = 0;
forever begin
#5 clk = ~clk; // Переключать каждые 5 единиц времени
end
endЭто создаёт часы, которые работают на протяжении всей симуляции.
Бесконечный цикл с отключением
Остановить цикл forever можно с помощью оператора disable:
initial begin : clock_gen // Здесь добавлено имя
clk = 0;
forever begin
#5 clk = ~clk;
end
endinitial begin
#100;
disable clock_gen; // Теперь это работает
endБесконечный цикл и другие циклы
| Цикл | Останавливается? | Когда использовать |
|---|---|---|
for | Да (после фиксированного числа итераций) | Известное число повторений |
while | Да (когда условие ложно) | Неизвестное условие остановки |
repeat | Да (после фиксированного числа итераций) | Известное число повторений |
forever | Нет (никогда) | Непрерывные сигналы (часы) |
Важные правила
| Правило | Объяснение |
|---|---|
| Необходимо включить задержку | #10 или @(posedge clk) |
| Без задержки симуляция зависает | Бесконечный цикл без продвижения времени |
Остановите цикл с помощью disable или завершите симуляцию с помощью $finish | Иначе симуляция никогда не закончится |
| Лучше всего подходит для тестовых стендов | Не подлежит синтезу |
Задание
Что нужно сделать:
Добавь недостающий цикл forever, чтобы создать тактовый сигнал, который переключается каждые 10 единиц времени.
Попробуйте сами
module forever_challenge;
reg clk;
initial begin
clk = 0;
// TODO: Добавьте цикл forever, чтобы переключать clk каждые 10 единиц времени
end
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogАппаратное и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Операторы. Часть 1
Арифметические операторыОператор взятия остаткаОператоры сравненияПовторение — простая математикаПобитовые операторы7Присваивание и логические элементы
Непрерывное присваиваниеПрисваивание с операторамиВстроенные примитивы логических элементовЭлементы И, ИЛИ и НЕЭлементы XOR и XNORПовторение — схема на логических элементах10Принятие решений
Оператор ifif—elseПовторение — простой компараторОператор casecaseх и casezПовторение — проектирование ALU5Операторы, часть 2
Логические операторыОператоры свёрткиОператоры сдвигаОператор конкатенацииУсловный операторПовторение — задание на операторы11Циклы
Цикл forЦикл whileЦикл повторенияБесконечный циклОператор отключенияПовторение — шаблоны циклов3Система счисления
Двоичное представлениеЧисла заданной разрядностиЧисла без указания разрядностиОтрицательные числаСпециальные значения X и ZПовторение — форматы чисел6Модули
Структура модуляВходные и выходные портыДвунаправленные портыСоздание экземпляра модуляПодключение портов по имениПодключение портов по порядкуПовторение — создание модуля9Процедурные блоки
Блок AlwaysБлок InitialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеПовторение: Always и InitialПотренируйтесь самостоятельно: Онлайн-компилятор Verilog