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 表示一個時脈週期。
訊號波形匯流排值
邊緣2345E0 → E1 → E2 → E3
start10.1
work_done0.10
state 後2.34BUSY → DONE → IDLE
busy 後1.0.
done 後0.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獨熱碼(one-hot)表示多個位元中恰有一個為 1。若也允許全部為 0,則另稱為 one-hot-or-zero。 詳細內容 編碼,與 Moore/Mealy 分類是不同決策。

自己試試看

DONE 狀態收到一週期 start=1,上述 FSM 會立刻開始新工作嗎?若要允許連續工作,應修改什麼?

查看解說

上述表格為 DONE→IDLE,因此不接受該請求。可改成 DONE 且 start 時轉 BUSY,或設計保留請求的協定,再依新規格驗證 done 寬度與請求接受時點。

此選擇適用於本瀏覽器,隨時可從頁尾變更。