状態の定義
CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 79/90。
チャレンジ
信号機コントローラーは、特定の時間間隔で異なる信号状態(赤、黄、青)を順番に切り替える有限状態機械です。有限状態機械(FSM)とは、限られた数の状態のうちの1つになることができる回路です。入力または時間に基づいて、ある状態から別の状態へ変化します。
このプロジェクトでは、単純な交差点用の信号機コントローラーを構築します。信号機には3つの出力があります。
| 信号 | 出力 | 意味 |
|---|---|---|
| 赤 | red = 1 | 停止 |
| 黄 | yellow = 1 | 注意 |
| 青 | green = 1 | 進行 |
信号は次の順序で切り替わります。
Green → Yellow → Red → Green → …
タイミングシーケンス
| 状態 | 継続時間 | 次の状態 |
|---|---|---|
| Green | 30秒 | Yellow |
| Yellow | 10秒 | Red |
| Red | 40秒 | Green |
このレッスンでは、信号機コントローラーの状態を定義します。
信号機には3つの可能な状態があります。
| 状態 | 信号 | コード |
|---|---|---|
| Green | 青信号 ON | 2'b00 |
| Yellow | 黄信号 ON | 2'b01 |
| Red | 赤信号 ON | 2'b10 |
不足している部分を追加してモジュールを完成させてください。
行うこと:
状態エンコーディングを定義する:0=Green、1=Yellow、2=Red
-
stateという名前の2ビットレジスタを宣言する counterという名前の6ビットレジスタを宣言する(最大40秒のタイミング用)。このステップでは使用しません。これを使ってカウントするタイミングロジックは、このプロジェクトの後の「遷移のタイミング設定」ステップで追加します- 組み合わせ always ブロック内に出力割り当てを追加し、その中に
case (state)を記述する。red、yellow、greenはoutput regとして宣言されており、regはこのようなブロック内でのみ割り当てることができます。@(*)は、このブロックが読み取る値が変化するたびにブロックが再実行されることを意味します。ここでは、読み取られる値はstateです。- state が 0 の場合:
green = 1、yellow = 0、red = 0 - state が 1 の場合:
green = 0、yellow = 1、red = 0 - state が 2 の場合:
green = 0、yellow = 0、red = 1
- state が 0 の場合:
自分で試してみよう
module traffic_light (
input clk,
input reset,
output reg red,
output reg yellow,
output reg green
);
// TODO: タスク 1 - 状態レジスタを宣言する(2ビット)
// TODO: タスク 2 - カウンタレジスタを宣言する(6ビット)
// TODO: タスク 3 - case (state) を使用した出力の代入
// 状態 0: green=1, yellow=0, red=0
// 状態 1: green=0, yellow=1, red=0
// 状態 2: green=0, yellow=0, red=1
endmodule基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ