Menu
Coddy logo textTech

Синхронизация переходов

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

challenge icon

Задание

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

Требования к таймингам

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

Как работает счётчик

  1. Когда начинается состояние, счётчик загружается значением длительности
  2. При каждом такте часов счётчик уменьшается на 1
  3. Когда счётчик достигает 0, наступает время перейти в следующее состояние

Ваша задача — добавить отсутствующую логику счётчика в автомат состояний. Вход next из предыдущего шага больше не используется: теперь счётчик определяет, когда изменяется состояние, а тестовый стенд больше не управляет next.

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

  1. Удалите input next, из заголовка модуля и замените условие else if (next) приведённой ниже логикой счётчика
  2. Добавьте объявление reg [5:0] counter (оставьте его, если вы уже объявили его на первом шаге)
  3. При сбросе установите counter в 0
  4. Когда counter == 0:
    • Загрузите длительность следующего состояния в счётчик
    • Перейдите в следующее состояние
  5. В противном случае уменьшайте счётчик на 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

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

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