Altifigence Academy

28 / 37 · 概念

状態機械:状態・遷移・出力を分ける

仕様表から FSM を書き、Moore・Mealy 出力、不正状態、要求の扱いを比較します。

状態は過去入力の必要な情報だけを要約します

現在の入力だけで出力が決まらないとき、記憶する状態を定義します。全履歴を保存する代わりに、将来の動作を決めるために必要な違いだけを区別します。

Sk+1=F(Sk,Xk)S_{k+1}=F(S_k,X_k)

処理の開始と完了を管理する制御器を考えます。IDLE は要求待ち、BUSY は処理中、DONE は一サイクルの完了表示です。

現在状態条件次状態busydone
IDLEstart=0IDLE00
IDLEstart=1BUSY00
BUSYwork_done=0BUSY10
BUSYwork_done=1DONE10
DONE常にIDLE01

busy と done は現在状態の出力です。例えば BUSY で完了を観測したエッジ後、DONE になり done=1 になります。この定義は Moore 出力です。

下の各列は立上りエッジ立上りエッジ クロックが 0 から 1 に変わる瞬間です。CLK=1 の区間全体を指すレベルとは区別します。 詳しく見るの記録です。入力はエッジ直前、「更新後」の状態は更新直後です。並びはサンプル順で、物理的な伝搬遅延伝搬遅延 入力が変わってから、出力が正しい値に安定するまでの時間です。論理式の等価性と時間特性は別の性質です。 詳しく見るではありません。初期 IDLE から、work_done を受けたエッジ後に DONE となり、done=1 になります。DONE の次は start に関係なく IDLE です。

Moore 出力は現在状態に従う
波形データを表示
波形データ:各文字は一つの区間、ドットは前の状態の保持、p はクロック 1 周期を表します。
信号波形バスの値
エッジ2345E0 → E1 → E2 → E3
start10.1
work_done0.10
更新後 state2.34BUSY → DONE → IDLE
更新後 busy1.0.
更新後 done0.10

遷移と記憶を分けた RTL

SystemVerilog
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 の幅と要求受付時点を新仕様に合わせて検証します。

選択はこのブラウザに適用されます。フッターからいつでも変更できます。