Что такое задержки
Часть раздела Основы путешествия по Verilog на Coddy — урок 67 из 90.
В Verilog задержки управляют тем, когда выполняется оператор или когда изменяется сигнал. Они используются для моделирования временно́го поведения реального оборудования.
Зачем нужны задержки
В реальном оборудовании требуется время для прохождения сигналов через провода и вентили. Задержки позволяют моделировать такое временное поведение.
- В симуляции без задержек всё происходит в момент времени 0
- Задержки позволяют распределять события во времени
- Они помогают тестировать чувствительные к таймингам схемы, такие как тактовые сигналы и конечные автоматы
Типы задержек
| Тип задержки | Назначение |
|---|---|
| Задержки вентилей | Задержка прохождения через логические вентили |
| Задержки присваивания | Задержка при присваивании значений |
| Директива timescale | Устанавливает единицы времени для моделирования |
Базовый синтаксис
Задержка записывается с помощью символа #, за которым следует число:
#10 clk = ~clk; // Ждать 10 единиц времени, затем переключить clock
#5 a = b; // Ждать 5 единиц времени, затем присвоить a = bЧисло после # — это количество time units для ожидания.
Простой пример
initial begin
a = 0;
#10 a = 1; // После 10 единиц времени a становится 1
#5 a = 0; // После ещё 5 единиц времени a становится 0
endТайминг:
- Time 0:
a = 0 - Time 10:
a = 1 - Time 15:
a = 0
Задержки в блоках Always
always #5 clk = ~clk; // Переключать тактовый сигнал каждые 5 единиц времениЭто создает непрерывный тактовый сигнал (предполагая, что clk был сначала инициализирован в 0 в блоке initial — иначе ~x остается x).
Важные правила
| Правило | Объяснение |
|---|---|
Символ # | Обозначает задержку |
Число после # | Сколько единиц времени ждать |
| Задержки суммируются | #10 затем #20 ожидает в сумме 30 |
| Не синтезируется | Задержки предназначены только для моделирования |
Задание
Что нужно сделать:
Добавьте недостающие задержки, чтобы этот код выводил сообщения в моменты времени 0, 10, 25 и 40.
Попробуйте сами
module delay_challenge;
initial begin
$display("Time %0t: Start", $time);
// TODO: Добавить задержку, чтобы достичь времени 10
$display("Time %0t: After first delay", $time);
// TODO: Добавить задержку, чтобы достичь времени 25
$display("Time %0t: After second delay", $time);
// TODO: Добавить задержку, чтобы достичь времени 40
$display("Time %0t: End", $time);
$finish;
end
endmodule
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU13Тайминг и задержки
Что такое задержкиЗадержки вентилейЗадержки в присваиванияхДиректива TimescaleГенерация тактового сигналаИтоги — управление таймингом5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial