Menu
Coddy logo textTech

Генерация тактового сигнала

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

Тактовый сигнал — это сигнал, который непрерывно переключается между 0 и 1 через равные промежутки времени. Тактовые сигналы необходимы для последовательностной логики, такой как триггеры и счетчики.

Зачем генерировать тактовый сигнал

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

Методы генерации тактового сигнала

МетодОписание
always с задержкой #Наиболее распространенный метод
Цикл foreverАльтернативный метод
Цикл repeatДля фиксированного количества циклов

Способ 1: Блок always с задержкой

reg clk;

initial begin
  clk = 0;
end

always #5 clk = ~clk;
  • clk = 0 в момент времени 0
  • Каждые 5 единиц времени clk переключается
  • Период = 10 единиц времени
  • Частота = 1/10 = 0.1 в единицу времени

Способ 2: Цикл Forever

reg clk;

initial begin
  clk = 0;
  forever begin
    #5 clk = ~clk;
  end
end

Тот же результат, что и при использовании метода always.

Метод 3: Повторение для фиксированного количества циклов

reg clk;

initial begin
  clk = 0;
  repeat (10) begin
    #5 clk = ~clk;
  end
end

Генерирует ровно 10 фронтов тактового сигнала (5 полных циклов), затем останавливается.

challenge icon

Задание

Добавьте недостающий код для генерации тактового сигнала, который переключается каждые 4 единицы времени (период = 8 единиц времени).

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

  1. Инициализируйте clk значением 0 в момент времени 0, используя блок initial
  2. Используйте блок always с задержкой для переключения clk каждые 4 единицы времени

Шпаргалка

Тактовый сигнал переключается между 0 и 1 через регулярные интервалы. Период = 2 × задержка.

Способ 1: Блок always (наиболее распространенный)

reg clk;

initial begin
  clk = 0;
end

always #5 clk = ~clk; // Период = 10

Способ 2: Цикл forever

initial begin
  clk = 0;
  forever #5 clk = ~clk;
end

Способ 3: Repeat (фиксированное количество фронтов)

initial begin
  clk = 0;
  repeat(10) #5 clk = ~clk; // 10 фронтов = 5 циклов
end

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

module clock_challenge;
  reg clk;
  
  // TODO: Шаг 1 — Добавьте блок initial, чтобы установить clk = 0
  
  
  // TODO: Шаг 2 — Добавьте блок always для переключения clk каждые 4 единицы времени
  

  initial begin
    $monitor("Time %0t: clk = %b", $time, clk);
    #20;
    $display("Clock generated for 20 time units");
    $finish;
  end
endmodule
quiz iconПроверьте себя

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

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