Menu
Coddy logo textTech

Определение состояний

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

challenge icon

Задание

Контроллер светофора — это конечный автомат, который циклически переключается между различными состояниями светофора (красный, жёлтый, зелёный) через определённые интервалы времени. Конечный автомат (FSM) — это схема, которая может находиться в одном из ограниченного числа состояний. Он переходит из одного состояния в другое на основе входных сигналов или времени.

В этом проекте вы создадите контроллер светофора для простого перекрёстка. У светофора есть три выхода:

СигналВыходЗначение
Красныйred = 1Стоп
Жёлтыйyellow = 1Внимание
Зелёныйgreen = 1Ехать

Сигналы переключаются в таком порядке:

Green → Yellow → Red → Green → …

Последовательность по времени

СостояниеДлительностьСледующее состояние
Зелёный30 секундЖёлтый
Жёлтый10 секундКрасный
Красный40 секундЗелёный

В этом уроке вы определите состояния для контроллера светофора.

У светофора есть три возможных состояния:

СостояниеСигналКод
ЗелёныйЗелёный сигнал включён2'b00
ЖёлтыйЖёлтый сигнал включён2'b01
КрасныйКрасный сигнал включён2'b10

Завершите модуль, добавив недостающие части.

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

Определите кодирование состояний: 0=Зелёный, 1=Жёлтый, 2=Красный

  1. Объявите 2-битовый регистр с именем state
  2. Объявите 6-битовый регистр с именем counter (для отсчёта времени до 40 секунд). На этом шаге он не используется: логика отсчёта времени с его помощью появится позже в этом проекте, на шаге «Отсчёт времени переходов»
  3. Добавьте присваивания выходам внутри комбинационного блока always, always @(*) begin ... end, с конструкцией case (state) внутри него. red, yellow и green объявлены как output reg, а присваивать значение reg можно только внутри такого блока. @(*) означает, что блок запускается снова всякий раз, когда изменяется любое значение, которое он считывает; в данном случае это state:
    • Когда state равен 0: green = 1, yellow = 0, red = 0
    • Когда state равен 1: green = 0, yellow = 1, red = 0
    • Когда state равен 2: green = 0, yellow = 0, red = 1

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

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);
  // TODO: Задача 1 - Объявить регистр состояния (2 бита)
  
  // TODO: Задача 2 - Объявить регистр счётчика (6 бит)
  

  // TODO: Задача 3 - Присвоения выходов с использованием case (state)
  // состояние 0: green=1, yellow=0, red=0
  // состояние 1: green=0, yellow=1, red=0
  // состояние 2: green=0, yellow=0, red=1

endmodule

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

Потренируйтесь самостоятельно: Онлайн-компилятор Verilog