ステートマシンのロジック
CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 80/90。
チャレンジ
このレッスンでは、信号機コントローラーに状態遷移ロジックを追加します。状態機械は、ある状態から次の状態へ移行するタイミングを決定します。
状態機械のロジックは、信号機がいつ、どのように状態を変更するかを制御します。
状態のシーケンス
緑 → 黄色 → 赤 → 緑 → …
あなたのタスクは、状態機械のロジックをモジュールに追加することです。
このステップでは、新しい入力信号 next が各変更をトリガーします。タイミングカウンターは次のステップで追加します。前のステップで記述したもの(state レジスター、未使用の counter 宣言、出力用の always @(*) ブロック)はすべて残してください。
実行すること:
- モジュールヘッダーの
resetの後に、nextという名前の1ビット入力ポートを追加します:input next,。テストベンチは次の状態を要求するために、この信号をパルス出力します always @(posedge clk or posedge reset)ブロックを追加します- リセット時に、
stateを赤 (2) に設定します nextが1のとき、次の状態に移行します:- 状態が緑 (0) の場合: 黄色に変更
- 状態が黄色 (1) の場合: 赤に変更
- 状態が赤 (2) の場合: 緑に変更
自分で試してみよう
module traffic_light (
input clk,
input reset,
input next, // 状態を変更するトリガー
output reg red,
output reg yellow,
output reg green
);
reg [1:0] state;
// 出力の割り当て
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: ステートマシンのロジックを追加(タイミングなし)
// 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基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ