Menu
Coddy logo textTech

Lógica da Máquina de Estados

Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 80 de 90.

challenge icon

Desafio

Nesta lição, você adicionará a lógica de transição de estados ao controlador do semáforo. A máquina de estados determina quando passar de um estado para o próximo.

A lógica da máquina de estados controla quando e como o semáforo muda de estado.

Sequência de estados

Verde → Amarelo → Vermelho → Verde → …

Sua tarefa é adicionar a lógica da máquina de estados ao módulo.

Nesta etapa, um novo sinal de entrada, next, aciona cada mudança; o contador de tempo será incluído na próxima etapa. Mantenha tudo o que você escreveu na etapa anterior (o registrador state, a declaração não utilizada de counter e o bloco de saída always @(*)).

O que fazer:

  1. Adicione uma porta de entrada de 1 bit chamada next ao cabeçalho do módulo, depois de reset: input next,. O testbench gera um pulso nesse sinal para solicitar o próximo estado
  2. Adicione um bloco always @(posedge clk or posedge reset)
  3. No reset, defina state como Vermelho (2)
  4. Quando next for 1, passe para o próximo estado:
    • Se o estado for Verde (0): mude para Amarelo
    • Se o estado for Amarelo (1): mude para Vermelho
    • Se o estado for Vermelho (2): mude para Verde

Experimente você mesmo

module traffic_light (
  input clk,
  input reset,
  input next,           // Gatilho para mudar o estado
  output reg red,
  output reg yellow,
  output reg green
);

  reg [1:0] state;

  // Atribuições de saída
  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: Adicionar lógica da máquina de estados (sem temporização)
  // 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

Todas as lições de Fundamentos

Pratique por conta própria: Compilador de Verilog online