# 邏輯設計筆記序向篇 : Latch (電栓) 與 Flip-Flop (正反器)
暫存器最被熟知的用途是在 CPU 中暫時儲存運算資料之用, 主要包括若干通用型暫存器 (general purpose registers), 輔助控制單元 (control unit) 進行內部控制的程式計數器 (PC, Program Counter), 指令暫存器 (IR, Instruction register), 以及程式狀態暫存器 (PSW, Program Status Word) 等等.
上圖中, CPU 與外部記憶體 ROM 與 RAM 之間其實還有一組暫存器 MAR (Memory Address Registers) 與 MDR (Memory Data Registers) 作為與匯流排 (Bus) 之間的緩衝暫存器之用.
馮紐曼架構的電腦之運算是以 ALU (算術邏輯單元) 為中心, 程式編譯後會分成指令 (code, 運算指令) 與數據 (data 運算元) 分別載入到不同的記憶體區域, 執行時以程式計數器 PC 控制執行流程, 從記憶體提取指令到指令暫存器 IR 中, 其次提取運算元至一般用途暫存器, 指令經解碼成微指令後控制運算元由一般暫存器載入 ALU 中進行運算, 結果再放回一般用途暫存器中, 等待後續指令處理, 結構如下 :
暫存器是由正反器 (通常是 D 正反器) 與邏輯閘組成, 依照運作方式分成下列四種, 其中 PIPO 暫存器又稱為緩衝暫存器 (buffer register), 資料並列載入後只是暫存於正反器中等待並列輸出, CPU 中的一般用途暫存器最常用來作為緩衝暫存器用. 除 PIPO 外, 其餘暫存器稱為移位暫存器 (shift register) :
- SISO (Serial-In Serial-Out) : 串列輸入, 串列輸出
- SIPO (Serial-In Parallel-Out) : 串列輸入, 並列輸出
- PISO (Parallel-In Serial-Out) : 並列輸入, 串列輸出
- PIPO (Parallel-In Parallel-Out) : 並列輸入, 並列輸出
常見的標準 TTL 暫存器 IC 如下表所示, 可利用串接方式組成較長位元之暫存器 :
1. PIPO 緩衝暫存器 (buffer register) :
首先來看 PIPO 緩衝暫存器, 一個 4 位元的 PIPO 電路圖與功能表如下所示, 每一個 D 正反器除了 CLK 與 /CLR 外輸入 D 與輸出 Q 都是獨立互不相連, 每個 CLK 上升緣會將 D0D1D2D3 載入 Q0Q1Q2Q3 保存 :
如果加上多工器, 則可以控制是否要載入輸入資料 :
此處多工器的控制腳作為 Load 輸入, 當 Load 為 1 時, 上面的 AND 閘導通, D0D1D2D3 被連接到 D 正反器的輸入, 因此下一個 CLK 就會將輸入載入 Q0Q1Q2Q3 中. 當 Load=0 時換成下面的 AND 閘導通, Q0 接 D0, Q1 接 D1, Q2 接 D2, Q3 接 D3, 因此正反器處在 No change 狀態.
2. SIPO/SISO 移位暫存器 (shift register) :
其次是 SIPO 與 SISO 暫存器, 這兩種暫存器可說是一物兩用, 電路結構相同, 差別只在於輸出方式, SIPO 是從各正反器的 Q 輸出; 而 SISO 則是從最後一個正反器的 Q 輸出, 電路圖如下 :
下面的範例波形圖描述串列輸入 010100000 時, 此 bit stream 會依序通過 Q0Q1Q2Q3 輸出, 經過四個脈波後輸入位元就會出現在 Q3 了 :
可知 0101 的 bit stream 的第一個位元 0 會在時鐘 1 進入 Q0, 第二個位元 1 會在時鐘 2 進入 Q0, 而第一個位元 0 則由 Q0 移位至 Q1 ... 到時鐘 4 時第一個位元就到達 Q3 了.
標準 TTL IC 74164 是 14 腳的 8-bit 移位暫存器 (上升緣動作), 可用作 SISO 與 SIPO 暫存器, 其接腳與內部電路圖如下 :
可見兩個串列輸入 A, B 是經過 AND 閘後再送入第一個 D 正反器, 因此只有 A=B=1 時才會輸入 1, 否則輸入 0. 從下面的 function table 可知, A=B=1 時 QA 的次狀態是 1, QB 是從 QA 移過來的 QAn, ... 依此類推 :
作為 SIPO 用時並列輸出有 8 個, 即 QA, QB, QC... QH, 如果做 SISO 用, 則由最後一個正反器 QH 輸出, 範例波形圖如下 :
上圖中串列輸入 A, B 經過 AND 閘後得到 00110100000 ... 的位元串流, 會在 CLK 上升緣依序被存入 QA 並向右移動.
3. PISO 移位暫存器 :
此種暫存器需要一個 LOAD/SHIFT 輸入來控制並列載入與移位, 例如下面的 4-bit PISO 右移暫存器, 當 LOAD/SHIFT=0 時右邊的 AND 閘導通, D0D1D2D3 被接到 D 正反器輸入, 在下一個 CLK 上升緣這些並列輸入就會被存入 Q0Q1Q2Q3 中. 當 LOAD/SHIFT=1 時左邊的 AND 閘導通, 左方正反器的輸出會被接到右邊正反器的輸入形成右移暫存器 :
此 PISO 移位暫存器之範例波形如下圖所示 :
可見在時脈 CLK1 時由於 /LOAD=0, 因此會在 CLK1 的上升緣將 D0D1D2D3=1010 載入 Q0Q1Q2Q3 中. 由於在時脈 CLK2 上緣來臨前 /LOAD 已經變成 1 (變成右移暫存器), 因此在 CLK2 上升緣時 Q0Q1Q2Q3=1010 整個向右移變成 0101 (因為 D0 在 /LOAD=1 時變成 0), 到 CLK4 之後, 原先載入的 1010 已全部從 Q3 輸出去了.
常見的標準 TTL IC 中可作為 PISO 暫存器者例如 74165 (上升緣動作), 此 IC 是一個 16 腳的 8-bit 右移暫存器, 除了可用作 PISO 暫存器外也可以用作 SISO 暫存器 (從 SERIAL IN 輸入), 其接腳圖如下所示 :
可知 74165 有 8 個並列輸入腳 A, B, C, D, E, F, G, H, 有一個串列輸入腳 SERIAL IN, 兩個互補串列輸出腳 QH 與 /QH, 一個時脈禁止輸入 CLOCK INHIBIT, 以及一個載入位移控制腳 SHIFT/LOAD, 當 /LOAD=0 時將 A~H 的並列輸入載入內部 8 個 D 暫存器中, 當 CLOCK INHIBIT=0 且 SHIFT=1 時開始將正反器內容 QA~QH 往右移, 其 function table 如下表所示 :
此表中 A~H 表示並列輸入腳, a~h 表示值 (0/1), QA~QH 表示內部正反器的輸出 (僅 QH 有拉出), QA0~QH0 表示 QA~QH 原先的狀態. 範例波形圖如下所示 :
上圖中開始時 CLOCK INHIBIT=1 使得 CLK 信號無作用, 而 /LOAD=0 使 D0D1D2D3D4D5D6D7=10101011 被載入內部的 8 個 D 正反器內, 因此 QH 馬上輸出 1 (因載入 H=1). 載入後 /LOAD=1 使內部暫存器變成右移暫存器, 因此時脈 CLK1 上升緣時整個暫存器往右移一位, 因此 QG=1 會被移到 QH, 同時 SERIAL IN=0 會被移入 QA, 亦即 /LOAD 變成 1 之後就改由 SERIAL IN 輸入資料了. 到 CLK8 之後原先並列載入的 10101011 就全部從 QH 輸出完畢, 接下來輸出從 SERIAL IN 讀入之資料 0011011 ... 了.
以上便是 SISO/SIPO/PISO/PIPO 這四種暫存器運作模式之說明. 在標準 TTL IC 中也有四合一功能的 IC, 例如 74195 便是一顆 16 腳, 上升緣驅動的 4-bit 四合一右移暫存器, 其接腳圖如下 :
參考 :
# http://www.nteinc.com/specs/7400to7499/pdf/nte74LS195A.pdf
可見此 IC 具有清除 /CLEAR, 移位載入 SHIFT/LOAD, 串列輸入 J 與 /K (注意是反相輸入), 並列輸入 ABCD, 以及並列輸出 QA, QB, QC, QD 等接腳. 其 function table 如下表 :
注意, 此處的串列輸入是 J 與 /K, 不是 K. 當 J=0, /K=0 時 (即 JK 正反器的 J=0, K=1), 下一個時脈會將 QA 設為 0; 當 J=1, /K=1 時 (即 JK 正反器的 J=1, K=0), 下一個時脈會將 QA 設為 1; 當 J=1, /K=0 時 (即 JK 正反器的 J=1, K=1), 下一個時脈會將 QA 狀態會反轉. 範例波形圖如下 :
此波形圖顯示, 在 CLK1 時因 J=/K=0 而將 0 載入 QA, 在 CLK2 時因 J=/K=1 而將 1 載入 QA, 然後串列輸入一直維持 J=/K=0, 因此接下來的時脈會將此 1 往右移, 而在 CLK5 時將此 1 移到 QD. 接著在 CLK6 時 /LOAD 變成 0, 因此在 CLK7 的上升緣會將 ABCD=1010 並列載入內部正反器中, 然後從 CLK8 開始將這些資料往右移, 到 CLK11 時就全部移出暫存器了. 可見, 74195 預設是 SISO 或 SIPO 從 SERIAL IN 讀取資料, 只有在 /LOAD=0 時才變成 PISO 或 PIPO.
以上所探討的移位暫存器都是向右移, 只要將 D 正反器的 Q-D 連接順序反過來就變成左移暫存器了. 或者可用多工器製作兼具左移與右移功能的雙向移位暫存器, 電路圖如下 :
上圖中當 RIGHT=1 時, 左邊的 AND 閘導通, 左邊正反器的 Q 接到右邊正反器的 D 形成右移暫存器; 當 RIGHT=0 時, 右邊的 AND 閘導通, 右邊正反器的 Q 接到左邊正反器的 D 形成左移暫存器.
標準 TTL IC 中 74194 (4-bit) 可說是萬用全能型 (universal) 的移位暫存器, 不僅可用作 SISO/SIPO/PISO/PIPO, 還可以左右雙向移位, 其接腳圖如下 :
74195 具有兩個串列輸入 R (右移串列輸入) 與 L (左移串列輸入), 兩個模式選擇腳 S0, S1, 四個並列輸入腳 A, B, C, D, 以及四個並列輸出腳 QA, QB, QC, QD. 其 function table 如下表 :
可見共有下列工作模式 :
S1S0=00 : 暫存器保持狀態不動作 (No change=inhibited)
S1S0=01 : 右移 (R 會被存入 QA 中)
S1S0=10 : 左移 (L 會被存入 QD 中)
S1S0=11 : 並列載入模式 (ABCD 被載入 QAQBQCQD 中)
範例波形圖如下 :
波形圖開始時以 /CLEAR=0 重設暫存器, 因 S1S0=11 (並列載入模式), 所以在 CLK1 上升緣會將 ABCD=1010 載入 QAQBQCQD 中. 接著在 CLK2 上升緣來臨前 S1S0 變成 01 (右移模式), 因此從 CLK2 開始內部正反器會持續向右移位, 並將串列右移輸入腳 R 載入 QA 遞補, 由上圖可知在 CLK3 與 CLK4 從串列輸入 R 連續讀入兩個 1 到 QA, 這些資料到 CLK8 就全部從 QD 輸出完畢, 這部分屬於 PIPO 或 PISO 運作.
在 CLK7 時 S1S0 變成 01 (左移模式), 因此從 CLK9 上升緣開始便會持續從串列左移輸入腳 L 讀取資料, 將其存入 QD 中. 上圖中自 CLK9 至 CLK12 從 L 陸續載入 1011 進入 QD 並往左移, 直到 CLK12 後 S1S0 變成 00 進入禁止模式. 74164 一顆多用真是好用的暫存器 IC 啊!
OK, 花了兩天終於寫完了, 真累, 這些圖都是我參考範例用 Picpick 重新繪製, 希望學生們有在看.
謝謝老師
回覆刪除謝謝您寫了這一系列的文章 真的很有幫助
回覆刪除感謝您的留言
回覆刪除謝謝老師的講解非常詳細!!
回覆刪除感謝您留言, 加油!
回覆刪除謝謝老師
回覆刪除一個大學不認真讀書的工程師留