Menu
Coddy logo textTech

遷移のタイミング制御

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

challenge icon

チャレンジ

このレッスンでは、各信号が点灯し続ける時間を制御するカウンターロジックを追加します。カウンターはあらかじめ設定された値からゼロまでカウントダウンし、その後、次の状態への遷移をトリガーします。

タイミング要件

状態持続時間カウンター値
Green30秒30
Yellow10秒10
Red40秒40

カウンターの仕組み

  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

基礎のすべてのレッスン