---
# System prepended metadata

title: Registers and Counters|第十一週
tags: [數位系統與實驗]

---

---
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
有空補例子
:::