Menu
Coddy logo textTech

Логика конечного автомата

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

challenge icon

Задание

В этом уроке вы добавите логику переходов состояний в контроллер светофора. Конечный автомат определяет, когда переходить из одного состояния в следующее.

Логика конечного автомата управляет тем, когда и как светофор меняет состояния.

Последовательность состояний

Зелёный → Жёлтый → Красный → Зелёный → …

Ваша задача — добавить логику конечного автомата в модуль.

На этом шаге новый входной сигнал next запускает каждое изменение; счётчик времени появится на следующем шаге. Сохраните всё, что вы написали на предыдущем шаге (регистр state, объявление неиспользуемого counter и блок вывода always @(*)).

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

  1. Добавьте порт 1-битного входного сигнала с именем next в заголовок модуля после reset: input next,. Тестовое окружение подаёт на него импульс, чтобы запросить переход в следующее состояние
  2. Добавьте блок always @(posedge clk or posedge reset)
  3. При сбросе установите state в Красный (2)
  4. Когда next равен 1, перейдите в следующее состояние:
    • Если состояние — Зелёный (0): измените его на Жёлтый
    • Если состояние — Жёлтый (1): измените его на Красный
    • Если состояние — Красный (2): измените его на Зелёный

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

module traffic_light (
  input clk,
  input reset,
  input next,           // Триггер для изменения состояния
  output reg red,
  output reg yellow,
  output reg green
);

  reg [1:0] state;

  // Присвоения выходов
  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

  // TODO: Добавить логику машины состояний (без тайминга)
  // always @(posedge clk or posedge reset) begin
  //   if (reset) begin
  //     state <= 2;
  //   end else if (next) begin
  //     case (state)
  //       0: state <= 1;
  //       1: state <= 2;
  //       2: state <= 0;
  //     endcase
  //   end
  // end

endmodule

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

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