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獨熱碼(one-hot)表示多個位元中恰有一個為 1。若也允許全部為 0,則另稱為 one-hot-or-zero。 詳細內容 編碼,與 Moore/Mealy 分類是不同決策。
自己試試看
DONE 狀態收到一週期 start=1,上述 FSM 會立刻開始新工作嗎?若要允許連續工作,應修改什麼?
查看解說
上述表格為 DONE→IDLE,因此不接受該請求。可改成 DONE 且 start 時轉 BUSY,或設計保留請求的協定,再依新規格驗證 done 寬度與請求接受時點。