# 邏輯設計筆記序向篇 : Latch (電栓) 與 Flip-Flop (正反器)
# 邏輯設計筆記序向篇 : Register (暫存器)
計數器可分為同步與非同步計數器, 簡單的同步計數器可用移位暫存器來做, 例如環形計數器 (ring counter) 與詹森計數器 (Johnson counter), 但較複雜的例如任意順序之同步計數器就需要用有限狀態機來設計 (其實移位暫存器與計數器都是有限狀態機). 非同步計數器又稱漣波計數器, 直觀容易使用無須特別設計, 但其操作頻率較低.
在標準 TTL IC 中也有很多計數器 IC, 較常用的有下列 6 個 :
1. 移位計數器 (shift counter) :
上一篇文章所介紹的暫存器其實就可以拿來當計數器使用, 稱為移位計數器, 只要將最後一級正反器的輸出 Q 或 /Q 回授到第一級的輸入即可, 有下列兩種 :
- 環形計數器 (ring counter) : 從 Q 回授
- 詹森計數器 (Johnson counter) : 從 /Q 回授
首先來看環形計數器 (ring counter), 這是將移位暫存器最後一級正反器 (LSB) 的 Q 輸出而得, 但是第一級正反器必須預設 (preset) 為 1, 其餘重設 (reset) 為 0, 用 D 與 JK 正反器來做的話電路圖如下 :
注意 JK 正反器的接法, 是 Q-J 與 /Q-K 互接, 最後一級 Q3 與 /Q3 回授至第一級 J3 與 K3. 範例波形圖如下 :
在 CLK0 時 /INIT=0 將 Q3Q2Q1Q0 預設為 0001, 然後從 CLK1 開始移位暫存器操作, 即 Q0=1 會持續往右移到 Q3 又回到 Q0 來, 形成一個計數值為 1, 2, 4, 8, 1, 2, 4, 8 .... 的環, 故稱為環狀計數器. 由上面的狀態轉變 1-2-4-8 可知環狀計數器並非二元計數器 (binary counter).
從上面波形圖可知, 不論是 Q0, Q1, Q2, Q3 每一個輸出之頻率都是 CLK 的 1/4, 責任週期 (duty cycle) 也都是 1/4=25%. 所以 n-bit 的環形計數器事實上是一個除以 n 的除頻器 (frequency divider).
我們可以透過安排不同的初始狀態設計不同之環狀計數器, 例如下面的 ring counter 會在 /INIT=0 時將暫存器預設為 Q0Q1Q2Q3=1010, 次狀態變成 0101, 然後便在此兩狀態之間變換 :
此移位計數器的每個輸出都是 CLK 頻率的一半, 是一個 duty cycle 為 50% 的 1/2 除頻器 (divide-by-2 divider).
在前一篇探討暫存器時曾介紹 74165 這顆 8-bit PISO 移位暫存器, 參考 :
# http://www.nteinc.com/specs/7400to7499/pdf/nte74LS165.pdf
我們可以利用 74165 製作一個 8-bit 環狀計數器, 使用的方式不是透過 /PRE 與 /CLR 去預設正反器之狀態, 而是透過並列載入方式, 接線圖如下 :
上圖中暫存器的最後一個輸出 QH (串列輸出) 被接到串列輸入 SERIAL IN, 並列輸入預設值 ABCDEFGH=10000000 (A 接 high 其餘接 low) 會在 /LOAD=0 時被載入暫存器內, 當 /LOAD 變成 1 後暫存器開始隨 CLK 右移, 當 1 移到串列輸出 QH 時又被回授到 SERIAL IN, 從而形成一個環狀計數器. 輸出 QH 與 /QH 的頻率是 CLK 的 1/8, 因為這是一個 divide-by-8 的除頻器.
若要製作 4-bit 移位計數器可以使用 4-bit 的 SISO/SIPO/PISO/PIPO 四合一右移移位暫存器 74195, 參考 :
# http://www.nteinc.com/specs/7400to7499/pdf/nte74LS195A.pdf
接線圖如下 :
上圖中暫存器最右輸出被接到串列輸入 J 與 /K, 依據 74165 功能表 J 與 /K 接在一起相當於 D 正反器, 這樣便形成一個 ring counter 了. 並列輸入 ABCD 中, A 接 1, 其餘接 0, 使得當 /LOAD=0 時, CLK 的上升緣會將 ABCD=1000 載入暫存器中, 並在 /LOAD=1 後持續右移.
由上面範例可知, 利用具有 PISO/SISO 功能之暫存器在初始時載入預設之任何狀態, 透過最右串列輸出回授至串列輸入就可以製作其他循環狀態的 ring counter. 例如若將上面的 74195 的 ABCD 預設為 1100 則暫存器的狀態變化將變成 1100(12)-0110 (6)-0011(3)-1001(9)-1100(12) ... 接線圖與波形圖如下 :
可見每一個輸出都是 1/4 的除頻器 (divide-by-4).
接下來看另一個移位計數器 Johnson counter, 它是從暫存器最右邊的反相輸出 /Q 回授的, 以 4-bit Johnson counter 為例, 其 D 與 JK 正反器之電路圖如下所示 :
注意 JK 正反器是前後 Q=J 與 /Q=K 互接, 但最右邊的正反器回授至最左邊正反器輸入時卻是 /Q=J 與 Q=K (反接), 波形圖如下 :
可見 Johnson counter 的每一個輸出 Q 其頻率是 CLK 的 1/2n, 對 4-bit 計數器來說就是 1/8 的除頻器 (divide-by-8). 與環狀計數器不同的是, Johnson 計數器的 duty cycle 都是 50%. 由上面的狀態轉變 1-3-7-15-14-12-8-0 可知 Johnson 計數器並非二元計數器 (binary counter).
標準 TTL IC 74195 可用來製作 4-bit 的 Johnson 計數器 (1/8), 接線圖如下 :
此電路圖將暫存器最右邊的反相輸出 /QD 接到串列輸入 J 與 /K 形成 Johnson 計數器, 依據 74195功能表 J=/K=1 時最左邊正反器相當於 D 正反器, 而四個並列輸入都接 0, 故初始化時 /CLEAR=0 會在 CLK 的上升緣將 ABCD=0000 載入暫存器中, 而在後續的 CLK 上升緣將 /QD=1 移入 QA 中形成 1000-1100-1110-1111-0111-0011-0001-0000-1000 ... 的狀態循環, 因此這是一個除以 8 的除頻器 (divide-by-8).
標準 TTL IC 74165 可用來製作 8-bit 的 Johnson 計數器 (1/16), 接線圖如下 :
上圖中最重要的部分是將暫存器最右邊的反相輸出 /QH 接到串列輸入 SERIAL IN, 並列輸入 A~H 全部接到 0 即可, 這樣就形成 Johnson 計數器了. 初始化時讓 /LOAD=0, 這樣 A~H=00000000 會被載入暫存器中, 使得 /QH=1, 後續的 CLK 會持續將此 1 於暫存器中移位, 形成一個 1/16 的除頻器 (divide-by-16).
2. 漣波計數器 (ripple counter) :
漣波計數器屬於非同步計數器, 由數個 T 正反器前後串接而成, 但是外部時鐘信號只用來驅動第一個正反器, 其餘的正反器時脈是由前一級的 Q (上數 count up) 或 /Q (下數 count down) 驅動.
由於 T 正反器有用 D 或 JK 正反器來實現, 一個 3-bit 的 ripple counter 電路結構如下圖所示 :
可見外部時脈僅接到第一級正反器的 CLK 輸入, 其餘正反器的 CLK 都是由前一級正反器的 Q 驅動. 這兩種電路均屬於 T 正反器, 因此每一個正反器都會在時脈的下降緣交替轉態 (toggle), 轉態效應一級串一級猶如漣波效應, 故稱 ripple counter, 其狀態轉換表如下 :
可見這是一個二元計數器 (binary counter), 其狀態數為 2 的 n 次方個, 稱為計數器的模數 (modulus, 或 MOD), 此為 MOD-8 計數器.
不過漣波計數器因為正反器傳遞延遲的關係, CLK 串接的結果會讓最後一級的傳遞延遲在 111 變回 000 時最大, 因為每一個正反器都在等前一級轉態, 如下圖所示 :
這使得外部時鐘 CLK 的操作頻率受到限制, 因為最糟情況的總延遲時間為 n*Tpd (傳遞延遲), 這必須小於外部時脈的週期, 否則計數器無法正常運作. 所以一個 n-bit 的漣波計數器的最高操作時脈是 :
fmax=1/(n*Tpd)
其中 n 是正反器數目, 而 Tpd 是取傳遞延遲 TPHL 與 TPLH 中較大的那個.
例如下面這個 10-bit 漣波計數器, 假設每一個 JK 正反器的傳遞延遲是 40 ns, 則此計數器之最高時脈頻率是多少 ?
最大總傳遞延遲=10*40ns=400ns
fmax=1/400 GHz=1000/400 MHz=2.5 MHz
亦即外部時鐘 CLK 不可超過 2.5 MHz.
在標準 TTL IC 中 7493 是常用的漣波計數器 IC, 它是一個 14 腳的 4-bit 漣波計數器, 但內部電路結構是以除 2 與除 8 計數器兩個計數器型態存在, 方便做彈性的應用組合, 其接腳圖與內部電路結構如下圖 :
可見每一個 JK 正反器都以 J=K=1 方式接成 T 正反器. 最左邊的正反器 A 獨立輸出 QA, 而右邊的三個正反器 B, C, D 則組成 3-bit 的漣波計數器. 而 R0 與 R1 接腳經過一個 NAND 閘後接到每個 JK 正反器的 /CLR 輸入, 因此當 R0=R1=1 時才會重設正反器, 這個 NAND 閘在設計其他模數計數器時很有用. 其波形圖如下 :
從波形圖可知 7493 IC 是內含 MOD-2 與 MOD-8 兩種計數器的 IC, 我們可透過串接 (cascading) 組成一個 MOD-16 的漣波計數器, 接線圖如下 :
只要將第一級正反器輸出 QA 串接到輸入 B (MOD-8 計數器的 CLK) 就完成 MOD-16 漣波計數器的串接了, 其狀態變化如下表 :
上面的漣波計數器都是講二元計數器 (binary counter), 亦即按照二進位編碼順序改變狀態, 但生活中常用的是十進位數, 即從 0 數到 9, 這種計數器稱為 BCD 計數器, MOD-10 計數器或 decade counter.
製作 BCD 漣波計數器很簡單, 就是數到 1010 時就馬上讓正反器重設歸零, 這樣正反器狀態就會依序在 0000, 0001, 0010, .... 1001 之間循環, 電路圖如下 :
由狀態表可知, 我們可以利用 Q3=Q1=1 這個條件讓計數器數到 1010 (A) 時馬上回到初始的 0000 狀態, 這就是上面電路圖中 NAND 閘的功用, 波形圖如下 :
可知當計數器數到 1010 時, NAND 閘會輸出 0 重設全部正反器, 使得在 CLK10 的 Q1 波形出現一個突波 (glitch), 亦即會有一個時間很短 (約兩個傳遞延遲時間) 的 1010 狀態.
可以使用標準 TTL 7493 來製作 BCD 漣波計數器, 接線圖如下 :
根據 7493 功能表可知, 其輸入腳 R1 與 R0 是經過一個 NAND 閘之後再接到每個正反器的 /CLR, 因此要重設全部正反器需 R1=R0=1, 因此只要將 QD 與 QB 接到 R1 與 R0 就可以將 7493 由 binary counter 變身為 BCD 或 decade decade counter 了.
其實在標準 TTL IC 中也有不需要依賴重設的現成 BCD 計數器, 那就是 7490 IC, 接腳圖與接腳功能表如下所示 :
可見 7490 有兩組共四個重設 (reset) 輸入 : R0(1), R0(2), R9(1), 與 R9(2), 其中兩個 R0 同時為 1 時會重設計數器為 0000, 而兩個 R9 同時為 1 時會將計數器預設為 1001 (即 9). 如果要讓計數器開始計數, 則 R0 與 R9 每一組至少要有一個為 0. 其內部電路圖如下所示 :
可知 7490 與 7493 一樣都是內含兩個計數器, 其中左邊第一個正反器 A 獨立構成一個 MOD-2 計數器, 而正反器 B, C, D 則混和使用同步與非同步電路設計方法使其成為一個 MOD-5 計數器, 比較難一眼就看出其功能, 但只要利用 JK 正反器的 function table 就可以一步步分析推導出來 :
可知 QDQCQB 狀態會在 000-001-010-011-100 這五個狀態依序循環 (MOD-5), 其波形圖如下 :
因為 7490 是利用狀態機設計的, 所以它不會像上面的 7493 BCD 計數器那樣有一個短暫的 1010 glitch. 既然 7490 是由 MOD-2 與 MOD-5 組成的計數器, 那麼只要將兩者串接起來便可得到一個 BCD 計數器, 亦即將最左邊的正反器輸出 QA 接到 INPUT B (正反器 B 的 CLK), 接線圖如下 :
除了 BCD 的 MOD-10 計數器外, 利用重設方法也可以做任何模數 (modulus) 的計數器, 例如一個 MOD-6 漣波計數器要在數到 0110 時重設回 0000, 電路圖, 波形圖以及狀態表如下 :
可以使用 7493 的 MOD-8 計數器 (QDQCQB) 來做, 將 QD 與 QC 漣接到 R1 與 R0, 則當計數器數至 110 時便會重設為 000, 接線圖如下 :
注意, CLK 輸入是接 INPUT B, 在此 MOD-6 範例中, 左邊 MOD-2 的計數器 A 用不到.
除了上面介紹的 7490, 7493 之外, 還有一顆計數器 IC 7492 也很常用, 此 IC 為 14 腳的 4-bit MOD-12 漣波計數器, 接腳圖如下 :
7492 的接腳比 7490 還簡單, 有兩個時脈輸入 A 與 B, 只有兩個重置 (reset) 腳 R0(1) 與 R0(2), 當此兩輸入同時為 1 時會重置計數器輸出為 0000, 如果樣讓計數器開始計數, 則 R0(1) 與 R0(2) 腳需至少一個為 0, 其內部電路圖與 function table 如下 :
可見 7492 與 7490, 7493 一樣都是將四個正反器分成兩半, 左邊正反器 A 獨立為一個 MOD-2 計數器, 右邊三個正反器 B, C, D 與 7493 一樣混合使用同步與非同步電路設計方法使其成為一個 MOD-6 計數器, 可以根據 JK 正反器的 function table 一步步推導 QB, QC, QD 的狀態變化如下表, 確實為 MOD-6 計數器, 參考下列波形圖 :
既然 7492 內含 MOD-2 與 MOD-6 計數器, 那麼只要將兩組串接起來就變成 MOD-12 計數器了, 串接方式有二, 第一種方式是 2*6 串接, 即時脈由 A 輸入, QA 輸出接到輸入 B 完成串接, QD 即為 MOD-12 的輸出, QDQCQBQA 狀態由 0000 連續變化至 1101 再返回 0000 共 12 個狀態, 接線圖與狀態變化圖如下圖所示 :
第二種串接方式是 6*2=12, 即時脈由 B 輸入, MOD-6 的輸出 QD 接到 A 輸入完成串接, QA 就是 MOD-12 輸出, 注意, 這種接法的 QAQDQCQB 狀態並非 12 個連續的二進位值, 如下面圖表所示 :
以上的漣波計數器都是上數 (count up), 下數 (count down) 要怎麼做? 很簡單, 只要改用 /Q 當下一級 T 正反器之時脈即可, 可用 D 或 JK 模擬 T 正反器, 電路如下 :
所有正反器於初始時都會被重設 (reset) 為 Q2Q1Q0=000 狀態, 後續時脈會使 Q2Q1Q0 循著 111-110-101-100-011-010-001-000 順序轉態, 因此是一個下數計數器, 狀態表與波形圖如下 :
同樣地, 要製作可上數與下數雙功能的漣波計數器的話, 可以利用多工器來選擇是用 Q (上數) 還是 /Q (下數), 因此需要一個 UP/DOWN 腳來選擇, 電路圖與波形圖如下 :
當 UP/DOWN=1 時為上數, 當 UP/DOWN=0 為下數.
3. 同步計數器 (synchronous counter) :
上面的漣波計數器好處是很直覺容易使用, 但缺點則是傳遞延遲使操作頻率受到限制, 但同步計數器 (所有正反器 clock 接在一起) 則無此限制.
2-bit 的同步上數二元計數器 (MOD-4) 電路圖與波形圖如下 :
3-bit 的二元計數器 (MOD-8) 需要額外一個 AND 閘, 當 Q0=Q1=1 時讓最後一個正反器輸出 Q3 變成 T 正反器轉態, 電路圖與波形圖如下 :
4-bit 的二元計數器 (MOD-16) 需要更多個 AND 閘, 當 Q0=Q1=1 時讓 Q3 轉態, 當 Q0=Q1=Q2=1 時讓 Q3 轉態, 電路圖與波形圖如下 :
可見同步計數器的正反器輸入有如下的規則 :
J0=K0=1
J1=K1=Q0
J2=K2=Q1Q0
J3=K3=Q2Q1Q0
....
Jn=Kn=Qn-1Qn-2…Q1Q0
J1=K1=Q0
J2=K2=Q1Q0
J3=K3=Q2Q1Q0
....
Jn=Kn=Qn-1Qn-2…Q1Q0
上面的 AND 閘採用串接方式做多重 AND 以減少拉線, 這樣每一個 AND 閘都是兩個輸入端, 但串接級數多時要考慮傳遞延遲問題.
在標準 TTL IC 中, 常見的同步二元計數器例如 74163, 此為 16 腳包裝的 4-bit 二元計數器 (上升緣動作), 接腳如下圖所示 :
74163 有一個重設用的同步 /CLEAR 腳, 亦即當 /CLEAR=0 時不會馬上重設正反器, 而是等待 CLK 上升緣來時才會清除 QAQBQCQD=0000. 其次 /LOAD 腳用來將輸入腳 ABCD 在 CLK 的上升緣載入計數器中做為預設值. 另外有兩個致能輸入腳 ENABLE E 與 ENABLE T, 此兩腳有任何一個為 0 都無法計數, 亦即 ENABLE E=ENABLE T=1 計數器才能計數. 當計數器數到最大值, 即 QAQBQCQD=1111 時, RIPPLE CARRY 接腳會輸出一個 CLK 週期的 high 脈波, 這可用來串接多個 74163 以製作較高模數的同步計數器.
串接兩個 74163 使其成為 8-bit 同步計數器 (MOD-256) 的接線圖如下 :
上圖中左邊是低四位元 (low nibble) 計數器, 其 ENABLE T 與 ENABLE E 兩隻腳都接 high, 亦即它是一直被致能的 (enabled); 右邊是高四位元 (high nibble) 計數器, 其兩個 ENABLE 腳一個接 high, 另一支則接左邊 74163 的 RIPPLE CARRY 接腳, 當左邊的 74163 數到 1111 時, 此腳會輸出 high 一個週期, 這樣讓右邊的 74163 進入致能可計數狀態, 在下一個 CLK 上升緣來時右邊的 74163 就會向上數 1.
BCD (decade, MOD-10) 同步計數器是利用有限狀態機的方法設計出來的, 4-bit 的 BCD 計數器電路如下 :
注意最右邊的正反器除了原先的 Q0 & Q1 & Q2 項之外, 還多了一個 Q0 & Q3 項, 表示在 Q3Q2Q1Q0=0111 與 1001 時 Q3 都要轉態, 亦即分別變成 1 與 0.
在標準 TTL IC 中常用的同步 BCD 計數器例如 74162, 此顆 IC 與上面的 74163 (二元計數器) 一樣都是 16 腳上升緣觸發, 接腳功能都是完全一樣的, 差別在 74162 計數到 1001 (=9) 時 RIPPLE CARRY 腳會輸出一個 CLK 週期的脈波, 且下一個數是回到 0000 而不是 1010 (這是 74163 才這樣), 其接腳圖如下 (接腳功能參考上面 74163) :
同步計數器也有可選擇上數或下數的標準 IC, 常用的例如 74193, 此亦為 16 腳 IC (上升緣觸發), 與 74162, 74163 一樣, /CLR 與 /LOAD 都是在 CLK 的上升緣才會重設與載入 (即同步式清除與載入). 其次是它有兩個時脈輸入, COUNT UP 與 COUNT DOWN, 分別為上數時脈與下數時脈. 另外它還有進位 /CARRY 與借位 /BORRY 腳, 當上數到最大值 1111 時, /CARRY 會出現一個 CLK 週期的 0 脈波; 當下數到最小值時, /BORROW 會出現一個 CLK 週期的 0 脈波, 其接腳圖如下 :
/CARRY 與 /BORROW 腳可以用來串接多個 74193 以製作更大模數的計數器, 例如使用兩顆 74193 製作 MOD-256 二元計數器的接線圖如下 :
其中左邊的 74193 為 low nibble, 右邊的 74193 為 high nibble, 時脈由左邊的 COUNT UP 輸入, 然後將左邊的 /CARRY 輸出接到右邊的 COUNT UP 腳完成串接, 當左邊數到 1111 時會送出 /CARRY=0 的一個 CLK 週期脈波給右邊使其在下一個 CLK 上升緣往上計數 1.
BCD 同步計數器也有可上數與下數的標準 TTL IC, 較常用的例如 74190, 也是上升緣觸發的 16 腳 IC, 其接腳圖如下 :
74190 有一個單一的時脈輸入 CLOCK, 利用 DOWN/UP 接腳選擇上數 (=0) 或下數 (=1), 但必須 /ENABLE 接腳為 0 才會計數. 當數到最大值 1001 (=9) 或最低值 0000 (=0) 時 MAX/MIN 輸出接腳會有一個 CLOCK 週期的 high 脈衝, 同時 /CARRY 輸出腳會有一個 CLOCK 週期的低脈衝, 這兩個接腳都是用來串接多個 74190 之用.
OK, 忙了兩天終於整理完計數器筆記, 希望學生們有在看.
4 則留言 :
感謝 幫助超大的
感謝留言, 雖然只是助憶之用, 但能幫到您我也很高興!
條理清晰,很好懂~
非常感謝!!幫助很大~~~
張貼留言