Menu
Coddy logo textTech

Timing The Transitions

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

challenge icon

チャレンジ

このレッスンでは、各ライトが点灯し続ける時間を制御するcounter logicを追加します。counterはあらかじめ設定された値から0までカウントダウンし、その後、次の状態への変更をトリガーします。

タイミング要件

State期間Counter Value
Green30 秒30
Yellow10 秒10
Red40 秒40

counter の動作

  1. 状態が開始すると、counterに期間の値が読み込まれます
  2. 各クロックティックで、counterは1減少します
  3. counterが0に達したら、次の状態に変更するタイミングです

あなたの課題は、ステートマシンに不足しているcounter logicを追加することです。

行うこと:

  1. reg [5:0] counterの宣言を追加します
  2. リセット時に、counterを0に設定します
  3. counter == 0の場合:
    • 次の状態の期間をcounterに読み込みます
    • 次の状態に変更します
  4. それ以外の場合は、各クロックでcounterを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

基礎のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ