Menu
Coddy logo textTech

Definindo os Estados

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

challenge icon

Desafio

Um controlador de semáforo é uma máquina de estados finitos que percorre diferentes estados das luzes (Vermelho, Amarelo, Verde) com intervalos de tempo específicos. Uma máquina de estados finitos (FSM) é um circuito que pode estar em um número limitado de estados. Ela muda de um estado para outro com base nas entradas ou no tempo.

Neste projeto, você construirá um controlador de semáforo para uma interseção simples. O semáforo tem três saídas:

LuzSaídaSignificado
Vermelhored = 1Parar
Amareloyellow = 1Cuidado
Verdegreen = 1Avançar

As luzes seguem este ciclo:

Green → Yellow → Red → Green → …

Sequência de temporização

EstadoDuraçãoPróximo estado
Verde30 segundosAmarelo
Amarelo10 segundosVermelho
Vermelho40 segundosVerde

Nesta lição, você definirá os estados do controlador de semáforo.

Um semáforo tem três estados possíveis:

EstadoLuzCódigo
VerdeLuz verde LIGADA2'b00
AmareloLuz amarela LIGADA2'b01
VermelhoLuz vermelha LIGADA2'b10

Complete o módulo adicionando as partes que faltam.

O que fazer:

Defina a codificação dos estados: 0=Verde, 1=Amarelo, 2=Vermelho

  1. Declare um registrador de 2 bits chamado state
  2. Declare um registrador de 6 bits chamado counter (para temporização de até 40 segundos). Ele não é usado nesta etapa: a lógica de temporização que conta com ele será apresentada mais tarde neste projeto, na etapa Temporizando as transições
  3. Adicione as atribuições das saídas dentro de um bloco always combinacional, always @(*) begin ... end, com um case (state) dentro dele. red, yellow e green são declarados como output reg, e um reg só pode ser atribuído dentro desse tipo de bloco. O @(*) significa que o bloco é executado novamente sempre que qualquer coisa que ele lê for alterada, que neste caso é state:
    • Quando o estado for 0: green = 1, yellow = 0, red = 0
    • Quando o estado for 1: green = 0, yellow = 1, red = 0
    • Quando o estado for 2: green = 0, yellow = 0, red = 1

Experimente você mesmo

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);
  // TODO: Tarefa 1 - Declarar registrador de estado (2 bits)
  
  // TODO: Tarefa 2 - Declarar registrador de contador (6 bits)
  

  // TODO: Tarefa 3 - Atribuições de saída usando case (state)
  // estado 0: green=1, yellow=0, red=0
  // estado 1: green=0, yellow=1, red=0
  // estado 2: green=0, yellow=0, red=1

endmodule

Todas as lições de Fundamentos

Pratique por conta própria: Compilador de Verilog online