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 qui contrôle la durée pendant laquelle chaque feu reste allumé. Le compteur effectue un compte à rebours à partir d'une valeur prédéfinie jusqu'à zéro, puis déclenche le changement d'état suivant.

Exigences de temporisation

ÉtatDuré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 impulsion 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. Ajoutez une déclaration reg [5:0] counter
  2. Lors de la réinitialisation (reset), réglez counter à 0
  3. Lorsque counter == 0 :
    • Chargez la durée de l'état suivant dans le compteur
    • Passez à l'état suivant
  4. Sinon, décrémentez le compteur de 1 à chaque cycle 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 du 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;      // Commencer 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 Jaune (10 secondes)
            
          end
          1: begin
            state <= 2;
            // TODO: Charger le compteur pour Rouge (40 secondes)
            
          end
          2: begin
            state <= 0;
            // TODO: Charger le compteur pour Vert (30 secondes)
            
          end
        endcase
      end else begin
        // TODO: Décrémenter le compteur de 1
        
      end
    end
  end

endmodule

Toutes les leçons de Fondamentaux