--- title: Registers and Counters|第十一週 tags: 數位系統與實驗 --- # Registers 暫存器 顧名思義,就是可以暫存東西的電路。 講到儲存的話,就是我們上週提到的各種 Flip-Flops;所以實作暫存器的方式之一就是把很多的 DFF 串在一起。 ![](https://drive.google.com/uc?id=1sgYkLREEXmnrmz8lwtxCyatWGarGx5m_&export=download) 串在一起的時候,大家要共用同個 CLK 達到同步的效果;上圖可以看到我們用一個 Load 跟 CLK AND 在一起,達到 CE 的效果,並且由於接入 Latch 前可以看到有 NOT,所以是個下降改變的 CLK;然後還有之前提到的 ClrN。 也有一種畫法是把 CE 作為 中間 Latch 的一個輸入,把 AND 閘弄到裡面去。 ![](https://drive.google.com/uc?id=18e-JT03ot_e2zH2tCxHzIitRkhs5_plb&export=download) 可以簡單畫成下圖: ![](https://drive.google.com/uc?id=1VjdXs0ASPnvY8op0Qe6FjGggsseVj_x6&export=download) ## 2-to-1 MUX 可以實作出如下面的 MUX ![](https://drive.google.com/uc?id=1eujObDWe1zOvj8OwQCIi09qCsibd1Z-h&export=download) 我們使用 EN 來決定要輸出哪條路的值。 ## Register with Tri-State Output 從上面可以看到我們將 FF 搭配 EN 的效果,所以就有一種是搭配 EN 的 Register。 ![](https://drive.google.com/uc?id=1Bjrz6F-qc-ApCoxUGr2JrKPW1LMg2p3b&export=download) 模組化的圖示: ![](https://drive.google.com/uc?id=1X5ua-IUEp6wkhqi6wyMwAoGd7N4xK8-5&export=download) ## BUS 此外還可以搭配上 Decoder ,做出更多樣的變化,下面就是可以四選一的暫存器,四個暫存器的其中一個會把值送到中間的「BUS」上,而上方的兩個暫存器就有 Ld 決定要不要把值讀進去。 ![](https://drive.google.com/uc?id=1lyleqfUhxPcJTAaRZPtK_3cb4rM_GUOi&export=download) # Shift Registers 因為這個電路有「Shift」的效果,所以叫做 Shift Registers;這種效果又叫做「序列輸入/輸出 Serial In / Out」 上圖中也可以把 Serial Out 拉回來,這樣就會弄出一個 Loop。 ## Timing diagram 可以看到各個輸出有初始值,隨著時間演進,各個的值會被傳下去。 ![](https://drive.google.com/uc?id=1bKavgijDkBB_ZDWMzcxRyNaRJEyGz_dV&export=download) ## N-bit Serial-In Serial-Out Shift Registers 上面的普遍版本。總共會需要 N-1 個 Cycle 才可以把輸入給輸出出來 ![](https://drive.google.com/uc?id=1XF07UsLfaO8wFurmpZie5E-ghsB1lhQY&export=download) ## Parallel-In Parallel-Out (PIPO) Right Shift Register 既然有 Serial,想當然的就有 Parallel。也就是一次讀全部的輸入,然後一次全部輸出出來。 ![](https://drive.google.com/uc?id=17fxrrFYqn9dRUtSBMcrUB8-c50QUwc9z&export=download) 不過上圖是綜合體,他是 PIPO 加 SISO,所以他的全名才會叫做 PIPO Right Shift Register;可以看到他有用一個 Sh 來判斷要不要 Shift。 ![](https://drive.google.com/uc?id=1d4fNTyFdC7odKvt8sQi_BGjjlAQP4nOl&export=download) ## 實作例子 下面是一種實作的方式: ![](https://drive.google.com/uc?id=1kwfVzdr9c_WGyTgTw0brsxcU9sWPS-1n&export=download) 可以看到關鍵就是把 Sh 跟 L 用 4-to-1 MUX 接在一起,然後搭配上面的真值表,就可以體會這種巧妙的設計。 --- # Shift Register with Inverted Feedback 接下來就要進入 Counter 的部分。所謂的 Counter,就是經過一定的次數,狀態就會循環,例如下面的電路: ![](https://drive.google.com/uc?id=1OeUJpH1VgDxL_ycahA-HlC9w0xFrwdDe&export=download) ## State graph 狀態圖 畫出他的狀態圖,可以得到如下的結果: ![](https://drive.google.com/uc?id=1TKE8LmIJ5cIic23TsY_0pejZarkMmCg3&export=download) # Counting 0 to 7 (bianry) with TFF 我們來設計會從二進制 0 數到 7 的 Counter,這裡我們想要用 TFF 設計;設計的第一步就是畫出真值表: ![](https://drive.google.com/uc?id=16S9ZH3YkDCbdHJe2jXfToszUSgk8EK7D&export=download) 有了真值表後,就是畫出卡諾圖畫簡;要注意這裡是以舊的狀態,也就是 ABC 作為輸入,而我們三個 TFF 需要的輸入 T 則是作為輸出。 最後就是來用 TFF 實作。 ![](https://drive.google.com/uc?id=135wlvmOBSc9un7C-ifmtyoao2zycCpyr&export=download) Synchronous Counter 就是會同步的 Counter。 # Counting 0 to 7 (bianry) with DFF 當然我們可以有別種實作方式,這次我們想要用 DFF 設計,所以一樣畫出卡諾圖: ![](https://drive.google.com/uc?id=1HM9zT05eU_jIgGOpmUHYw3IZkcOKZHjF&export=download) 由於 DFF 的輸入就是舊資料,不像 TFF 代表的是「要不要翻轉」,所以這裡的真值表比較簡單;然後從真值表可以很輕鬆地得到卡諾圖的結果,然後根據結果畫出電路圖: $$ D_{A} = A^{+} = A'\\ D_{B} = B^{+} = A'B+AB' = A\oplus B\\ D_{C} = C^{+} = C'BA + CB' + CA'= C'BA + C(BA)'= C\oplus BA\\ $$ ![](https://drive.google.com/uc?id=1IXHenfAKBm5dfjUcOCMB1p0kYb_5cjXO&export=download) # Up-Down Counter 這是可以「上下」的 Counter;這裡的 Counter 多增加了人為的可操作性,我們可以用 U 跟 D 來控制上跟下,總之先畫出真值表: 然後我們要給一些規則,我們首先「不允許同時為 1」,「以及同時為 0 代表不動」。 有了真值表就可以畫出卡諾圖來化簡: ![](https://drive.google.com/uc?id=1ku0WRB4r15FTU3E1MCdBa6xDVBMRfbiN&export=download) $$ D_{A} = A^{+} = A\oplus (U+D)\\ D_{B} = B^{+} = B\oplus (UA+DA')\\ D_{C} = C^{+} = C\oplus(UBA+DB'A')\\ $$ 可以看到似乎都會用到 $\oplus$ # State Diagram of Counter / with TFF 這個就是一種沒有人為輸入的 Counter,用來表示狀態圖。 ![](https://drive.google.com/uc?id=1YStj9ptLj7nNyrN36kwmPrshFlnAOrpy&export=download) 所以一樣先畫出真值表: ![](https://drive.google.com/uc?id=18PBU7W99L0aybtjyDwA0WX_kgPhMsoHh&export=download) 可以看到有很多 DC。然後先畫出卡諾圖: ![](https://drive.google.com/uc?id=1Nt77bwxvunQ8Ow7ZM2roi6NtwfDoYjOH&export=download) 此時我們來想想要怎麼實作。如果我們想要用 TFF 實作...此時要注意的是,TFF 的輸入 T,是決定「要不要翻轉」,所以我們要再建立一個新的卡諾圖,也就是看什麼樣的情況要翻轉: ![](https://drive.google.com/uc?id=1_Z60zRIZPTCCdhAJ6pBA91sNJ10ZRSOB&export=download) 不過呢,其實我們也可以直接從我們上面建立好的卡諾圖直接推出來,方法很簡單,首先我們知道要翻轉的前提是 $Q$ 跟 $Q^{+}$ 異或要是 1,或者說: $$ T=Q\oplus Q^{+} $$ 以 C 作為例子,在卡諾圖外面的那個 C 就是 $Q$,而在裡面代表輸出的值就是 $Q^{+}$ ![](https://drive.google.com/uc?id=1mfLlMlzaaEJqtPqqOayWoxPSJjnjrenL&export=download) 最後可以畫出我們的電路圖: ![](https://drive.google.com/uc?id=1KcSUXY3OXkLPBw-k3QkDoYCeXcCWN1w2&export=download) ## Don't Care States 但是上面的例子,在我們兜好電路後,如果我們給他意料外的輸入... ![](https://drive.google.com/uc?id=1AroJZN5q44NuiIFcTEYmId0q7bLN8LrR&export=download) 上面的例子中,我們假設一開始是 001,那麼很幸運的,我們的電路並沒有跑出其他的結果;但是,在其他情況可就不一定了,所以弄電路之前一定要先分析其他的 State 會造成甚麼效果、或者是給予 Reset,讓他強制回到你要的狀態圖。 # DFF 版本 下面是 DFF 版本的前面例子,根據前面的真值表,畫出卡諾圖: ![](https://drive.google.com/uc?id=1yKZ5veIZroMabmLLAaT1g7L0hz_6jTM3&export=download) ![](https://drive.google.com/uc?id=1WTJawxq33XFHJ94grpx_jZeTPGxkFltF&export=download) # SR FF 版本 或者我們來一點不一樣的體驗,我們來用用看 SR FF,不過在那之前我們先看個東西: ![](https://drive.google.com/uc?id=13H6fyqinPx_SUeZ0cBS_qbs92oW-lBF7&export=download) 原本一開始的真值表是以 SR 作為輸入,然後看輸出會長怎樣;但是我們現在想要知道的是,如果我有舊的狀態,我想要達到某個新狀態,我的輸入要長怎樣,因此也就有了右邊的圖。 有了這個概念後,我們回到原本的狀態圖例子,我們根據我們的上一張圖右邊的SR跟QQ^+^對照表,畫出以下的真值表後,再用卡諾圖化簡得到下面的式子。 ![](https://drive.google.com/uc?id=1giImdTFfvnTagHCYVJ32OzF-dl-dV80b&export=download) 或者,我們可以用上面 TFF 提到的類似技巧,也就是利用 SR 跟 QQ^+^的對應關係: $$ S = F(Q,Q^{+})\\ R = F(Q,Q^{+})\\ $$ ![](https://drive.google.com/uc?id=19r792uFKfU34HCuwgAt1LaOFOS2SgtG5&export=download) ## 電路圖 ![](https://drive.google.com/uc?id=1NYp2DXPEH4N1TlatjxEPB4oQcjAZ7BKX&export=download) # JK FF 版本 既然提到了 SR,那麼就不能不提 JK,所以我們依樣畫葫蘆,先找出 JK 跟 QQ^+^ 的真值表: ![](https://drive.google.com/uc?id=1cSR8I1oP7IcQy7xf01eGuVeVLtEEAoXF&export=download) 然後一樣可以重新用卡諾圖畫簡,或是使用上面提到的快速技巧,從原先的卡諾圖進行轉換。 ![](https://drive.google.com/uc?id=1LccGH_v_9-hyLI6C7FpC5tYWSnNFKPxy&export=download) ## 電路圖 ![](https://drive.google.com/uc?id=1PPtER6IuNxXdytiicbbAWvRHrcCZAsw7&export=download) --- # Flip-Flop Input Equations 上面的快速技巧太重要了,所以我們來給他統整一下: ![](https://drive.google.com/uc?id=1QvumYFzpbMMSOGYXyOhlYEFc7b2HXQea&export=download) 可以化簡成下面的小表格: ![](https://drive.google.com/uc?id=1yLTDiJQPKh367IE4FgifgiRhKJ7XCiP5&export=download) $$ D = Q\\ T = Q\oplus Q'\\ $$ SR 跟 JK 似乎用記得比較快。 :::warning 有空補例子 :::