This chapter covers sequential circuits that operate without a clock signal — changes in state are triggered directly by input changes rather than clock edges. The fundamental mode of operation is introduced, where only one input may change at a time and the circuit must reach a stable state before the next change. Analysis involves flow tables (the asynchronous equivalent of state tables) with stable and unstable states. Synthesis follows a procedure: primitive flow table → merged flow table → state assignment → next-state and output equations. State reduction techniques for asynchronous circuits are presented. Critical races and state assignment problems are addressed, including one-hot encoding as a race-free alternative. The chapter thoroughly covers hazards: static hazards (1-hazards and 0-hazards), dynamic hazards, and their elimination through redundant terms. A complete vending machine controller example ties all concepts together.
本章介紹不依靠時脈訊號運作的非同步循序電路 (asynchronous sequential circuit)——狀態的改變由輸入訊號直接觸發,而不是由時脈邊緣引發。首先介紹基本模式 (fundamental mode):每次只允許一個輸入改變,且電路必須在下一次輸入變化前先抵達穩定狀態。分析以流程表 (flow table)進行——它是狀態表 (state table) 的非同步對應物,含有穩定狀態與不穩定狀態。合成則依循固定流程:原始流程表 → 合併流程表 → 狀態指派 → 推導下一狀態與輸出方程式。本章亦說明非同步電路的狀態縮減技巧。臨界競爭 (critical race) 與狀態指派問題也被詳細討論,並介紹 one-hot 編碼作為避免競爭的替代方案。書中徹底剖析冒險 (hazards):靜態 1 冒險 (static 1-hazard)、靜態 0 冒險 (static 0-hazard)、動態冒險 (dynamic hazard),以及如何透過添加冗餘項加以消除。最後以一個完整的販賣機控制器範例貫穿所有概念。
Setup. Figure 9.32 is a primitive flow table with 11 rows labeled $A, B, C, D, E, F, G, H, J, K, L$ (the letter $I$ is skipped to avoid confusion with the digit 1) — one stable state per row — driven by inputs $w_2 w_1$. Outputs are 0 or 1 per row.
Reproduced Figure 9.32 (bold = stable state in that row, "—" = don't-care):
| State | $w_2 w_1$=00 | =01 | =10 | =11 | $z$ |
|---|---|---|---|---|---|
| A | A | F | C | — | 0 |
| B | A | B | — | H | 1 |
| C | G | — | C | D | 0 |
| D | — | F | — | D | 1 |
| E | G | — | E | D | 1 |
| F | — | F | — | H | 0 |
| G | G | B | J | — | 0 |
| H | — | L | E | H | 1 |
| J | G | — | J | — | 0 |
| K | — | B | E | K | 1 |
| L | A | L | — | K | 1 |
The reduction proceeds in two distinct stages: (i) partitioning to find equivalent states that can be renamed without affecting don't-cares, then (ii) a merger diagram to combine compatible states even when they aren't strictly equivalent.
Stage 1 — Partitioning procedure
Stage 2 — Merger diagram (compatibility, not equivalence)
Two rows are compatible (mergeable) if their specified next-state entries don't conflict — don't-cares can absorb any value, and same-stable-state pairs always agree. Build a graph where each row is a vertex and each compatible pair is an edge. Find a clique cover (a set of cliques whose union is all rows); each clique becomes one merged row.
For Figure 9.33 the merger diagram suggests:
Successive reductions with one such cover give 12 → 10 → 6 → ... rows. The final answer depends on which compatible-pair groupings you pick (this is generally NP-hard for arbitrary flow tables, but small instances are tractable).
Why two stages?
Doing partitioning first preserves maximum flexibility for the merger stage, often producing a smaller final state count than running merger alone.
Practical workflow: for hand work, start with the partition (deterministic — no choices), then sketch the merger diagram and try a couple of clique covers. The minimum-state table is the merger's clique cover with fewest cliques.