Menu
Coddy logo textTech

Temporizando as Transições

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

challenge icon

Desafio

Nesta lição, você adicionará a lógica do contador que controla por quanto tempo cada luz permanece acesa. O contador faz uma contagem regressiva de um valor predefinido até zero e, então, aciona a próxima mudança de estado.

Requisitos de temporização

EstadoDuraçãoValor do contador
Verde30 segundos30
Amarelo10 segundos10
Vermelho40 segundos40

Como o contador funciona

  1. Quando um estado começa, o contador é carregado com o valor da duração
  2. A cada pulso de clock, o contador diminui em 1
  3. Quando o contador chega a 0, é hora de mudar para o próximo estado

Sua tarefa é adicionar a lógica do contador que está faltando à máquina de estados. A entrada next da etapa anterior não é mais usada: agora o contador decide quando o estado muda, e o testbench não aciona mais next.

O que fazer:

  1. Remova input next, do cabeçalho do módulo e substitua a condição else if (next) pela lógica do contador abaixo
  2. Adicione uma declaração reg [5:0] counter (mantenha-a se você já a declarou na primeira etapa)
  3. No reset, defina counter como 0
  4. Quando counter == 0:
    • Carregue a duração do próximo estado no contador
    • Mude para o próximo estado
  5. Caso contrário, decremente o contador em 1 a cada clock

Experimente você mesmo

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);

  reg [1:0] state;
  // TODO: Declarar registrador counter (6 bits)
  

  // 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

  // Máquina de estados com temporização
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;      // Começa no Vermelho
      // TODO: Definir counter como 0
      
    end else begin
      if (counter == 0) begin
        case (state)
          0: begin
            state <= 1;
            // TODO: Carregar counter para Amarelo (10 segundos)
            
          end
          1: begin
            state <= 2;
            // TODO: Carregar counter para Vermelho (40 segundos)
            
          end
          2: begin
            state <= 0;
            // TODO: Carregar counter para Verde (30 segundos)
            
          end
        endcase
      end else begin
        // TODO: Decrementar counter em 1
        
      end
    end
  end

endmodule

Todas as lições de Fundamentos

Pratique por conta própria: Compilador de Verilog online