Генерация тактового сигнала
Часть раздела Основы путешествия по 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 полных циклов), затем останавливается.
Задание
Добавьте недостающий код для генерации тактового сигнала, который переключается каждые 4 единицы времени (период = 8 единиц времени).
Что нужно сделать:
- Инициализируйте
clkзначением 0 в момент времени 0, используя блокinitial - Используйте блок
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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
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