Синхронизация переходов
Часть раздела Основы путешествия по Verilog на Coddy. Урок 81 из 90.
Задание
В этом уроке вы добавите логику счётчика, которая управляет длительностью свечения каждого сигнала. Счётчик отсчитывает от заданного значения до нуля, а затем инициирует переход в следующее состояние.
Требования к таймингам
| Состояние | Длительность | Значение счётчика |
|---|---|---|
| Зелёный | 30 секунд | 30 |
| Жёлтый | 10 секунд | 10 |
| Красный | 40 секунд | 40 |
Как работает счётчик
- Когда начинается состояние, счётчик загружается значением длительности
- При каждом такте часов счётчик уменьшается на 1
- Когда счётчик достигает 0, наступает время перейти в следующее состояние
Ваша задача — добавить отсутствующую логику счётчика в автомат состояний. Вход next из предыдущего шага больше не используется: теперь счётчик определяет, когда изменяется состояние, а тестовый стенд больше не управляет next.
Что нужно сделать:
- Удалите
input next,из заголовка модуля и замените условиеelse if (next)приведённой ниже логикой счётчика - Добавьте объявление
reg [5:0] counter(оставьте его, если вы уже объявили его на первом шаге) - При сбросе установите
counterв 0 - Когда
counter == 0:- Загрузите длительность следующего состояния в счётчик
- Перейдите в следующее состояние
- В противном случае уменьшайте счётчик на 1 при каждом такте часов
Попробуйте сами
module traffic_light (
input clk,
input reset,
output reg red,
output reg yellow,
output reg green
);
reg [1:0] state;
// TODO: Объявить регистр счётчика (6 бит)
// Присвоения выходов
always @(*) begin
case (state)
0: begin green = 1; yellow = 0; red = 0; end
1: begin green = 0; yellow = 1; red = 0; end
2: begin green = 0; yellow = 0; red = 1; end
default: begin green = 0; yellow = 0; red = 1; end
endcase
end
// Конечный автомат с таймингом
always @(posedge clk or posedge reset) begin
if (reset) begin
state <= 2; // Начать с Red
// TODO: Установить счётчик в 0
end else begin
if (counter == 0) begin
case (state)
0: begin
state <= 1;
// TODO: Загрузить счётчик для Yellow (10 секунд)
end
1: begin
state <= 2;
// TODO: Загрузить счётчик для Red (40 секунд)
end
2: begin
state <= 0;
// TODO: Загрузить счётчик для Green (30 секунд)
end
endcase
end else begin
// TODO: Уменьшить счётчик на 1
end
end
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 и Initial12Проект мультиплексора
Проектирование мультиплексора 2 к 1Проектирование мультиплексора 4 к 115Контроллер светофора
Определение состоянийЛогика конечного автоматаПотренируйтесь самостоятельно: Онлайн-компилятор Verilog