Learning Objectives
- 說明回授為什麼能讓電路記住一個位元,以及奇數個反相器繞一圈為什麼會振盪
- 接出 SR 栓鎖,說明開機未知與 S=R=1 的問題
- 區分栓鎖的透明期間與正反器的邊緣觸發,用兩個栓鎖接出主從式 D 正反器
- 說明建立時間、保持時間與重設各自解決什麼問題
放開按鈕之後,燈為什麼還亮著
電梯按鈕按一下就放開,燈卻會一直亮到電梯抵達。前面幾課接過的電路都做不到這件事:輸出只看「現在」的輸入,開關放開,輸出就變回去。這種電路叫組合電路(combinational circuit)。
要記住東西,輸出必須繞回來影響自己的輸入,這叫回授(feedback)。最簡單的回授是兩個 NOT 頭尾相接:
Q -> NOT -> Q′ -> NOT -> Q
假設 Q=1,經過第一個 NOT 得到 Q′=0,再經過第二個 NOT 又得到 Q=1,電路自己撐住這個值。假設 Q=0 也一樣成立。同一個電路有兩個穩定狀態,正好可以存一個位元。
能存一個位元的電子電路比電腦還早:William Eccles 與 F. W. Jordan 在 1918 年為真空管版本的電路申請專利,當時是給無線電用的。
用窮舉找出穩定狀態
下面讓一個值繞著一圈反相器走一次,看回來時有沒有變。注意 n=2 和 n=3 的結果差在哪裡。
加上把手:SR 栓鎖
上面兩個 NOT 的迴路有個問題:沒有地方可以把值寫進去。在模擬器裡,這個迴路的兩條線都是未知(x),因為模擬器不知道它落在哪一邊;真實電路開機時會被微小的雜訊推向其中一邊,但你事先不知道是哪一邊。
解法是把 NOT 換成 NOR。NOR 的另一隻腳是 0 的時候,(0 + A)′ = A′,它就是一個 NOT;另一隻腳是 1 的時候,輸出被強迫成 0。多出來的那隻腳就是把手:
| S | R | Q 的結果 | 叫做 |
|---|---|---|---|
| 1 | 0 | 變成 1 | 設定(set) |
| 0 | 1 | 變成 0 | 重設(reset) |
| 0 | 0 | 維持原來的值 | 保持 |
| 1 | 1 | Q 和 Q′ 都是 0 | 不該這樣用 |
這個電路叫 SR 栓鎖(SR latch)。接法:上面的 NOR 輸入是 R 和 Q′,輸出是 Q;下面的 NOR 輸入是 S 和 Q,輸出是 Q′。圖上的 Qn 就是 Q′。
模擬器的顏色與延遲。 綠色是 1、灰色是 0、紅色是未知(x)。每個閘的延遲是整數個單位,不是真實的奈秒;這是簡化的模型,沒有電壓與雜訊。
S 和 R 同時放開會怎樣
S 和 R 都是 1 之後,一個一個放開,結果很明確:比較晚放開的那一邊贏。模擬裡 S 先放,留下 R,得到 Q=0;R 先放,留下 S,得到 Q=1。
如果同時放開呢?你可以在上面的電路自己試:把下面 NOR 原本接 S 的那隻腳改接到 R 開關,這樣一個開關同時控制兩邊。切到 1 再切回 0,模擬器會判定「振盪」:兩個 NOR 同時變 1、又同時變 0,每一個延遲單位翻一次,停不下來。
這是因為模擬裡兩個閘的延遲完全相等。真實的閘不可能完全相等,總有一邊快一點,所以會落到某一邊,但你不知道是哪一邊。在模擬裡把上面的 NOR 延遲改成 2 個單位,結果是 Q=0;改成下面的 NOR 是 2 個單位,結果是 Q=1:比較快的那個閘先把輸出變成 1,反過來把另一邊壓成 0。
結果取決於誰快一點,這種情況叫做競爭(race)。設計時要避開的不是某個值,而是這種結果由微小時間差決定的情況。
奇數個反相器:環形振盪器
剛才的窮舉說奇數個反相器繞一圈沒有穩定狀態。值繞回來總是相反,電路只好一直改:這就是環形振盪器(ring oscillator),不需要外加訊號就會產生方波。
週期可以直接推算:訊號繞一圈會翻一次值,繞兩圈才回到原值,所以週期是「閘的數量 × 每個閘的延遲 × 2」。
但是只把 NOT 接成一圈,在模擬器裡什麼也不會發生。未知的反相還是未知,x 一直繞下去。所以環裡要放一個可以控制的閘:用 NAND 取代其中一個 NOT,另一隻腳叫 E。E=0 時 NAND 輸出固定是 1,全部的線都有確定的值;E 變 1 時它就是一個 NOT,環開始轉。這一步叫初始化,真實電路同樣需要。
D 栓鎖的透明期間,與主從式正反器
SR 栓鎖要操作兩條線,而且要避開 S=R=1。實務上多半只想說「把這個值存起來」。D 栓鎖(D latch)只有資料 D 與致能 E:
- E=1:Q 跟著 D 走,叫透明(transparent)
- E=0:Q 維持最後的值
它可以用 SR 栓鎖前面加兩個 AND 和一個 NOT 做出來(S=D·E、R=D′·E)。下面的練習用另一種更短的接法:多工器選回自己。MUX2 的 S=E,D1 接資料,D0 接自己的輸出;E=0 時選到自己,就記住了。
透明有什麼問題?想像 Q 經過一個反相器接回 D,希望每次 E 打開時翻一次。E=1 的期間,Q 翻了 D 就跟著翻,D 翻了 Q 又跟著翻,一路翻到 E 關閉為止。用閘接出這個電路在模擬器跑一次,結果是振盪(一個週期 8 個單位),翻了多少次全看 E 開多久。
正反器(flip-flop)的解法是讓輸出只在時脈變化的那一瞬間改變。最經典的做法是把兩個栓鎖串起來,致能相反,叫主從式(master-slave):
| 時脈 | 主栓鎖 | 從栓鎖 | 結果 |
|---|---|---|---|
| 0 | 透明,跟著 D | 關閉,Q 不動 | 輸入改變不影響輸出 |
| 上升的瞬間 | 關閉,留住這時的 D | 打開 | Q 變成上升前一刻的 D |
| 1 | 關閉 | 透明,但主栓鎖不動 | 輸入改變不影響輸出 |
任何時刻總有一個栓鎖是關的,所以資料不可能一路穿過去。這就是上升緣觸發(rising-edge triggered)。模擬器的 dff 元件做的就是這件事,把內部包起來。
開機時正反器的內容同樣是未知,而且 Q′ 接回 D 的時候,未知反相還是未知,按多少次時脈都不會自己變好。所以要有重設(reset):R=1 時不管時脈,直接把 Q 變成 0。
上升緣前後,資料要穩定多久
「只在上升緣取樣」聽起來是一個瞬間,但真實的正反器需要一小段時間才能把值抓穩。所以規格書會給兩個數字:
- 建立時間(setup time):上升緣之前,D 至少要穩定多久
- 保持時間(hold time):上升緣之後,D 至少還要維持多久
資料如果剛好在這段時間內改變,正反器可能進入介穩態(metastability):輸出暫時停在 0 和 1 之間,要過一段不確定的時間才落到其中一邊,而且你無法預知落到哪一邊。
這個模擬器不模擬介穩態,也沒有建立與保持時間。它在上升緣直接讀 D 的值,訊號也只有 0、1、x。所以你在這裡看不到這個問題,但它是真實晶片跨時脈傳資料時最常要處理的事情之一:輸入按鈕、感測器這類和時脈無關的訊號,隨時可能剛好踩在上升緣附近。
組合電路的延遲也和這件事有關:上升緣之後,資料要穿過組合電路,趕在下一個上升緣之前(再扣掉建立時間)到達,這就是時脈週期有下限的原因。
確認一下
SR 栓鎖目前 Q=1。S 和 R 都是 0。這時把 R 切到 1 再切回 0,Q 是多少?
一個 NAND 加 6 個 NOT 接成環(共 7 個閘),每個閘延遲 1 單位,E 初始化之後變 1,週期是幾個單位?
為什麼把 Q′ 接回 D 做「每次翻一下」,用 D 栓鎖不行、用 D 正反器可以?
再想一下
主從式正反器如果把主栓鎖前面的 NOT 拿掉(兩個栓鎖的致能都接 CLK),會發生什麼事?
一個 D 正反器開機之後 D 接 1,沒有接重設,按一次時脈,Q 是多少?
按鈕訊號和時脈完全無關,直接接到 D 正反器的 D。真實晶片可能遇到什麼問題?這個模擬器看得到嗎?
重點整理
- 回授讓電路有記憶:偶數個反相繞一圈有兩個穩定狀態,奇數個會振盪。
- SR 栓鎖可以設定、重設、保持;開機是未知,S=R=1 之後的結果取決於誰晚放開。
- D 栓鎖在致能打開時透明,輸入變動會穿到輸出。
- D 正反器只在上升緣取樣,用兩個致能相反的栓鎖就能做出來。
- 開機狀態未知,要靠重設或第一次取樣才有值。建立與保持時間是真實電路的限制,這個模擬器不模擬。
一個正反器存一個位元。下一課把很多個正反器接同一個時脈,存數字、數數、移位。