Temporisation des transitions
Fait partie de la section Fondamentaux du Journey Verilog de Coddy — leçon 81 sur 90.
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
| État | Durée | Valeur du compteur |
|---|---|---|
| Green | 30 secondes | 30 |
| Yellow | 10 secondes | 10 |
| Red | 40 secondes | 40 |
Fonctionnement du compteur
- Lorsqu'un état commence, le compteur est chargé avec la valeur de durée
- À chaque impulsion d'horloge, le compteur diminue de 1
- 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 :
- Ajoutez une déclaration
reg [5:0] counter - Lors de la réinitialisation (reset), réglez
counterà 0 - Lorsque
counter == 0:- Chargez la durée de l'état suivant dans le compteur
- Passez à l'état suivant
- 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
endmoduleToutes les leçons de Fondamentaux
1Introduction
Qu'est-ce que VerilogHardware vs SoftwareNiveaux d'abstraction de conceptionVotre premier moduleCommentaires4Opérateurs - Partie 1
Opérateurs arithmétiquesOpérateur moduloOpérateurs de comparaisonRécapitulatif - Mathématiques simplesOpérateurs bit à bit7Assignation et portes logiques
Assignation continueAssignation avec opérateursPrimitives de portes intégréesPortes AND OR NOTPortes XOR XNORRécapitulatif - Circuit à portes logiques10Prise de décision
Instruction IfIf - ElseRécapitulatif - Comparateur simpleInstruction CaseCasex et CasezRécapitulatif - Conception d'ALU2Types de données
Type WireType RegEntiers et RéelsVecteursTableauxParamètresRécapitulatif - Déclarer des signaux5Opérateurs - Partie 2
Opérateurs logiquesOpérateurs de réductionOpérateurs de décalageOpérateur de concaténationOpérateur conditionnelRécapitulatif - Défi sur les opérateurs11Boucles
Boucle ForBoucle WhileBoucle RépéterBoucle InfinieInstruction DisableRécapitulatif - Modèles de boucles3Système de numération
Représentation binaireNombres avec tailleNombres sans tailleNombres négatifsValeurs spéciales X et ZRécapitulatif - Formats de nombres6Modules
Structure d'un modulePorts d'entrée et de sortiePorts InoutInstanciation de moduleMappage de ports par nomMappage de ports par ordreRécapitulatif - Créer un module9Blocs procéduraux
Bloc AlwaysBloc InitialListe de sensibilitéAffectation bloquanteAffectation non bloquanteRécapitulatif - Always vs Initial12Projet Multiplexeur
Conception d'un Mux 2 vers 1Conception d'un Mux 4 vers 115Contrôleur de feux de circulation
Définition des étatsLogique de la machine à états