Menu
Coddy logo textTech

Logique de la machine à états

Fait partie de la section Fondamentaux du Journey Verilog de Coddy. Leçon 80 sur 90.

challenge icon

Défi

Dans cette leçon, vous allez ajouter la logique de transition d’état au contrôleur de feu de signalisation. La machine à états détermine quand passer d’un état au suivant.

La logique de la machine à états contrôle quand et comment le feu de signalisation change d’état.

séquence des états

Vert → Jaune → Rouge → Vert → …

Votre tâche consiste à ajouter la logique de la machine à états au module.

Dans cette étape, un nouveau signal d’entrée, next, déclenche chaque changement ; le compteur de temporisation sera abordé à l’étape suivante. Conservez tout ce que vous avez écrit à l’étape précédente (le registre state, la déclaration inutilisée de counter et le bloc de sortie always @(*)).

À faire :

  1. Ajoutez un port d’entrée de 1 bit appelé next à l’en-tête du module, après reset : input next,. Le banc de test génère une impulsion sur ce signal pour demander l’état suivant
  2. Ajoutez un bloc always @(posedge clk or posedge reset)
  3. Lors de la réinitialisation, définissez state sur Rouge (2)
  4. Lorsque next vaut 1, passez à l’état suivant :
    • Si l’état est Vert (0) : passez à Jaune
    • Si l’état est Jaune (1) : passez à Rouge
    • Si l’état est Rouge (2) : passez à Vert

Essayez vous-même

module traffic_light (
  input clk,
  input reset,
  input next,           // Déclencheur pour changer d'état
  output reg red,
  output reg yellow,
  output reg green
);

  reg [1:0] state;

  // 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

  // TODO: Ajouter la logique de la machine à états (sans timing)
  // always @(posedge clk or posedge reset) begin
  //   if (reset) begin
  //     state <= 2;
  //   end else if (next) begin
  //     case (state)
  //       0: state <= 1;
  //       1: state <= 2;
  //       2: state <= 0;
  //     endcase
  //   end
  // end

endmodule

Toutes les leçons de Fondamentaux

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