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 quanto tempo cada luz permanece acesa. O contador faz uma contagem regressiva de um valor predefinido até zero e, em seguida, dispara 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 tique do 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 falta à máquina de estados.

O que fazer:

  1. Adicione uma declaração reg [5:0] counter
  2. No reset, defina counter como 0
  3. Quando counter == 0:
    • Carregue a duração do próximo estado no contador
    • Mude para o próximo estado
  4. 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 do contador (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;      // Iniciar no Vermelho
      // TODO: Definir contador para 0
      
    end else begin
      if (counter == 0) begin
        case (state)
          0: begin
            state <= 1;
            // TODO: Carregar contador para Amarelo (10 segundos)
            
          end
          1: begin
            state <= 2;
            // TODO: Carregar contador para Vermelho (40 segundos)
            
          end
          2: begin
            state <= 0;
            // TODO: Carregar contador para Verde (30 segundos)
            
          end
        endcase
      end else begin
        // TODO: Decrementar contador em 1
        
      end
    end
  end

endmodule

Todas as lições de Fundamentos