28 / 37 · 概念
状態機械:状態・遷移・出力を分ける
仕様表から FSM を書き、Moore・Mealy 出力、不正状態、要求の扱いを比較します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
状態は過去入力の必要な情報だけを要約します
現在の入力だけで出力が決まらないとき、記憶する状態を定義します。全履歴を保存する代わりに、将来の動作を決めるために必要な違いだけを区別します。
処理の開始と完了を管理する制御器を考えます。IDLE は要求待ち、BUSY は処理中、DONE は一サイクルの完了表示です。
| 現在状態 | 条件 | 次状態 | busy | done |
|---|---|---|---|---|
| IDLE | start=0 | IDLE | 0 | 0 |
| IDLE | start=1 | BUSY | 0 | 0 |
| BUSY | work_done=0 | BUSY | 1 | 0 |
| BUSY | work_done=1 | DONE | 1 | 0 |
| DONE | 常に | IDLE | 0 | 1 |
busy と done は現在状態の出力です。例えば BUSY で完了を観測したエッジ後、DONE になり done=1 になります。この定義は Moore 出力です。
下の各列は立上りエッジ立上りエッジ クロックが 0 から 1 に変わる瞬間です。CLK=1 の区間全体を指すレベルとは区別します。 詳しく見るの記録です。入力はエッジ直前、「更新後」の状態は更新直後です。並びはサンプル順で、物理的な伝搬遅延伝搬遅延 入力が変わってから、出力が正しい値に安定するまでの時間です。論理式の等価性と時間特性は別の性質です。 詳しく見るではありません。初期 IDLE から、work_done を受けたエッジ後に DONE となり、done=1 になります。DONE の次は start に関係なく IDLE です。
波形データを表示
| 信号 | 波形 | バスの値 |
|---|---|---|
| エッジ | 2345 | E0 → E1 → E2 → E3 |
| start | 10.1 | |
| work_done | 0.10 | |
| 更新後 state | 2.34 | BUSY → DONE → IDLE |
| 更新後 busy | 1.0. | |
| 更新後 done | 0.10 |
遷移と記憶を分けた RTL
typedef enum logic [1:0] {IDLE, BUSY, DONE} state_t;
state_t state, next_state;
always_comb begin
next_state = state;
case (state)
IDLE: if (start) next_state = BUSY;
BUSY: if (work_done) next_state = DONE;
DONE: next_state = IDLE;
default: next_state = IDLE;
endcase
end
always_ff @(posedge clk)
if (rst) state <= IDLE;
else state <= next_state;
assign busy = (state == BUSY);
assign done = (state == DONE);これは制御構造を説明する SystemVerilog 例です。接続する処理器の work_done 生成と入力同期化は別に実装する必要があります。
仕様から抜けやすい問い
この回路は BUSY と DONE で start を無視します。完了と同時に新要求を受けるなら、まず遷移表を変えます。Mealy 出力は状態と現在入力を使って素早く反応できますが、組合せ出力のタイミングとグリッチも検討します。状態符号化を binary にするか one-hotワンホット 複数ビットのうち、ちょうど一つだけが 1 の表現です。全ビット 0 も許す条件は one-hot-or-zero と区別します。 詳しく見る にするかは、Moore/Mealy の分類とは別の決定です。
自分で考えてみましょう
DONE 状態で start=1 が一サイクル入りました。この FSM は直ちに次の処理を始めますか。連続処理を許すには何を変えますか。
解説を見る
表では DONE→IDLE なので、その要求を受けません。DONE で start なら BUSY へ行くよう変えるか、要求を保持するプロトコルを設計します。done の幅と要求受付時点を新仕様に合わせて検証します。