Menu
Coddy logo textTech

Timing The 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 depuis 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 la 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 manquante du compteur à la machine à états.

À faire :

  1. Ajouter une déclaration reg [5:0] counter
  2. Lors de la réinitialisation, définir counter sur 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 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 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 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

Entraînez-vous par vous-même : Compilateur Verilog en ligne