Menu
Coddy logo textTech

遷移のタイミング制御

CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 81/90。

challenge icon

チャレンジ

このレッスンでは、各信号機が点灯する時間を制御するカウンターロジックを追加します。カウンターはあらかじめ設定された値からゼロまでカウントダウンし、次の状態変化を発生させます。

タイミングの要件

StateDurationCounter Value
Green30 seconds30
Yellow10 seconds10
Red40 seconds40

カウンターの仕組み

  1. 状態が始まると、カウンターに継続時間の値がロードされます
  2. クロックの各ティックごとに、カウンターは1ずつ減少します
  3. カウンターが0に達すると、次の状態へ移行するタイミングとなります

あなたのタスクは、ステートマシンに不足しているカウンターロジックを追加することです。

作業手順:

  1. reg [5:0] counter の宣言を追加します
  2. リセット時には、counter を0に設定します
  3. counter == 0 のとき:
    • 次の状態の継続時間をカウンターにロードします
    • 次の状態に遷移します
  4. それ以外の場合は、各クロックごとにカウンターを1ずつデクリメントします

自分で試してみよう

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

  reg [1:0] state;
  // TODO: カウンタレジスタを宣言する(6ビット)
  

  // 出力の代入
  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

  // タイミング付きステートマシン
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;      // 赤から開始
      // TODO: カウンタを0にセット
      
    end else begin
      if (counter == 0) begin
        case (state)
          0: begin
            state <= 1;
            // TODO: 黄用にカウンタをロード(10秒)
            
          end
          1: begin
            state <= 2;
            // TODO: 赤用にカウンタをロード(40秒)
            
          end
          2: begin
            state <= 0;
            // TODO: 緑用にカウンタをロード(30秒)
            
          end
        endcase
      end else begin
        // TODO: カウンタを1減らす
        
      end
    end
  end

endmodule

基礎のすべてのレッスン