Menu
Coddy logo textTech

Temporisation des transitions

Fait partie de la section Fondamentaux du Journey Verilog de Coddy — leçon 81 sur 90.

challenge icon

Défi

Dans cette leçon, vous allez ajouter la logique du compteur (counter logic) qui contrôle combien de temps chaque feu reste allumé. Le compteur décompte à partir d'une valeur prédéfinie jusqu'à zéro, puis déclenche le changement d'état suivant.

Exigences de temporisation

StateDuréeValeur du compteur
Green30 secondes30
Yellow10 secondes10
Red40 secondes40

Fonctionnement du compteur

  1. Lorsqu'un état commence, le compteur est chargé avec la valeur de durée
  2. À chaque coup d'horloge, le compteur diminue de 1
  3. Lorsque le compteur atteint 0, il est temps de passer à l'état suivant

Votre tâche consiste à ajouter la logique de compteur manquante à la machine d'état.

Ce qu'il faut faire :

  1. Ajouter une déclaration reg [5:0] counter
  2. Lors d'un reset, réinitialiser counter à 0
  3. Lorsque counter == 0 :
    • Charger la durée de l'état suivant dans le compteur
    • Passer à l'état suivant
  4. Sinon, décrémenter le compteur de 1 à chaque coup d'horloge

Essayez vous-même

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

  reg [1:0] state;
  // TODO: Déclarer le registre compteur (6 bits)
  

  // Affectations des sorties
  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

  // Machine à états avec temporisation
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;      // Démarrer au Rouge
      // TODO: Mettre le compteur à 0
      
    end else begin
      if (counter == 0) begin
        case (state)
          0: begin
            state <= 1;
            // TODO: Charger le compteur pour Yellow (10 seconds)
            
          end
          1: begin
            state <= 2;
            // TODO: Charger le compteur pour Red (40 seconds)
            
          end
          2: begin
            state <= 0;
            // TODO: Charger le compteur pour Green (30 seconds)
            
          end
        endcase
      end else begin
        // TODO: Décrémenter le compteur de 1
        
      end
    end
  end

endmodule

Toutes les leçons de Fondamentaux