Menu
Coddy logo textTech

Что такое задержки

Часть раздела Основы путешествия по Verilog на Coddy — урок 67 из 90.

В Verilog задержки управляют тем, когда выполняется оператор или когда изменяется сигнал. Они используются для моделирования временных характеристик реального оборудования.

Зачем нужны задержки

Реальному оборудованию требуется время для прохождения сигналов через провода и логические вентили. Задержки позволяют имитировать такое временное поведение.

  • В симуляции без задержек всё происходит в момент времени 0
  • Задержки позволяют распределять события во времени
  • Они помогают тестировать чувствительные к таймингам схемы, такие как тактовые генераторы и конечные автоматы

Типы задержек

Тип задержкиНазначение
Задержки вентилейЗадержка прохождения через логические вентили
Задержки присваиванияЗадержка при присваивании значений
Директива TimescaleУстанавливает единицы времени для симуляции

Базовый синтаксис

Задержка записывается с помощью символа #, за которым следует число:

#10 clk = ~clk;   // Подождать 10 единиц времени, затем инвертировать тактовый сигнал
#5 a = b;         // Подождать 5 единиц времени, затем выполнить присваивание a = b

Число после # — это количество единиц времени ожидания.

Простой пример

initial begin
  a = 0;
  #10 a = 1;   // Спустя 10 единиц времени, a становится равным 1
  #5 a = 0;    // Спустя еще 5 единиц времени, a становится равным 0
end

Время:

  • Время 0: a = 0
  • Время 10: a = 1
  • Время 15: a = 0

Задержки в блоках always

always #5 clk = ~clk;   // Переключение сигнала тактовой частоты каждые 5 единиц времени

Это создает непрерывный тактовый сигнал.

Важные правила

ПравилоОбъяснение
Символ #Обозначает задержку
Число после #Сколько единиц времени ждать
Задержки суммируются#10, затем #20 — ожидание в сумме 30
Не синтезируетсяЗадержки предназначены только для симуляции
challenge icon

Задание

Что нужно сделать:

Добавьте недостающие задержки, чтобы этот код выводил сообщения в моменты времени 0, 10, 25 и 40.

Шпаргалка

В Verilog задержки используют #, за которым следуют единицы времени, чтобы управлять моментом выполнения инструкций:

#10 a = 1;   // Подождать 10 единиц времени, затем выполнить присваивание

Задержки являются накопительными — каждая задержка добавляется к текущему времени:

initial begin
  a = 0;      // Время 0
  #10 a = 1;  // Время 10
  #5  a = 0;  // Время 15
end

Используйте в блоках always для генерации тактовых сигналов:

always #5 clk = ~clk;  // Переключение каждые 5 единиц

Примечание: Задержки предназначены только для симуляции — они не синтезируемы.

Попробуйте сами

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

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы