---
title: Multiplexers, Decoders, and Programmable Logic Devices|第八週
tags: 數位系統與實驗
---
# Multiplexers
多輸入單一輸出

如果有 n 個輸入做為控制,則你可以選擇 2^n^ 種電路

## 實作
可以用 AND 的方式實作

也可以用 Three-State Buffers 的方法實作。
## 應用 3-variable function

# Three-State Buffers
計概提到過的 Tri-State Buffer。
## Buffer
中文叫緩衝,但是其實他還有「推動」的功能,很像是先將電路累積起能量來,然後再推動出去。

向上面就是做為一個推力。
然後其實可以發現她長得跟我們的 NOT 很像,所以沒錯,我們的 NOT 其實本身也是個 Buffer,不過她同時還做了取反的功能。

## Three-State Buffers
顧名思義就是有三種狀態的 Buffer,他讓電路多了第三種狀態--斷路

然後如同上面所說的,你也可以為他加上 NOT 的功能,但是可以加的地方變多了。

## 應用
### 選擇通路 - 1 Multiplexer
你可以用來實作 Multiplexer,也就是上面的例子。

### 選擇通路 - 2
也可以用來選擇要讓哪條路是通的,這樣就可以把兩條都有輸入的電路連在一起了。

### 選擇通路 - 3 Source of an Adder
如果你的加法器可能會需要選擇要用哪個做為被加數,就可以用。

當然,那四個用來開閘的 Enable 只可以一次一個人為 1。
### 選擇通路 - 4 雙向 IO / Bi-directional I/O pin
你可以讓某個電路,在使用同一條電路的情況下傳送輸入跟輸出

可以看到中間那條電路可以有雙向的訊號,但是要注意的是,必須要限制不可以同時有雙向的訊號。
---
# Decoders
剛剛 Multiplexers 是多個電路單一輸出,那麼這個就是與他相反的,少少電路多種輸出。
不過 Decoder 可以有多種設計方式;像下面的就是設計在某種特定的輸入,只有一種輸出會是 1 ,其他是 0;而方法就是用之前提到過的 minterm ,把 8 種可能的組合 AND 起來輸出。

如果你想要結果是取反的話,就只要在輸出那裏加個 NOT 就好,這樣就會變成一個人是 0 其他人是 1,而這可以用在下面的應用中。
## 應用
### 4-to-10 Line Decoder

利用上面 minterm 的方法,把所有 minterm 組合 AND 起來後取 NOT,所以就可以產生某個 bit 是 0 其他 bit 都是 1;而這子只要顯示 10 個 bit 的組合而已,所以 9 以上的 minterm 在取 NOT 之後都會讓這個電路全部的 AND 輸出 1,也就是都長得像是 1111...。
### n-Variable Function
既然有了 minterm,那想當然的就可以用在之前提到的布林邏輯式子上;如果你有個式子是某個特定 minterm 的組合,那麼擬就只要把需要的組合最後 OR 起來就好。

不過上面是...先把全部取過反的 minterm AND 起來再取 NOT,就結果來說是一樣的。
而上面體現了模組化的好處,就是如果你已經知道某種特定的電路組合可以做到某種功效,那麼以後就可以像上面寫一個模塊,然後就可以以更清楚的方式畫出電路圖。
# Encoders / Priority Encoder
他就是跟 Decoder 做相反的功能,前面是少得輸入可以產生多種輸出;這裡則是把多種輸入產生少的輸出

而 Encoder 有種特別的設計方式,就是具有 Priority,上面的圖中可以看到有很多個 DC,是因為這個電路他具有 Priority。
設計方式是,先從最底下看,如果 Y~7~ 是 1,則輸出 1111,如果不是的話才看 Y~6~,如果 Y~6~ 是 1,則輸出 1101,如果不是的話才繼續往下看 Y~5~ 以此類推。
然後要注意,雖然他上面寫的是 8-to-3,但是他有 4 個輸出,其中的 D 的意義是「有輸出 1」;也因此當 Y~0~ 到 Y~7~ 都是 0 的時候 D 輸出是 0
## 卡諾圖
我們可以把 Encoder 上面的真質表轉成 K-Map,然後要注意的是,之前的 DC 是在 Output 的地方,這裡則是在 Input 的位置,也就是說不管輸入是 0 或是 1。
所以其實可以很快的看出來,上面的例子中,變數太多了,要用 Quine-McCluskey;如果是 4-to-2,這樣三個 Output 四個 Input 就還可以畫畫看。
---
# Read-Only Memories / ROM
就是常聽到的唯讀記憶體,只可以讀取其中的值,但不可以修改其中的值。

這是一個簡單的例子,可以看到他用 ABC 這三個輸入決定地址,來去讀取記憶體中的內容,而這個記憶體存放著 8 個長度 4 bit 的 word,至於 8 個的原因是因為只有 3 個輸入決定地址。

這是裡面個個地址存放的內容。
然後下面是更普遍的形式:

可以發現,這個解址的功能,不就是我們 Decoder 在做的事情嗎,沒錯:

解址的部分就是我們 Decoder 在做的。
>或許這就是他就 Decoder 的原因
## 可能的實作方式
下面是一種可能的實作方式,可以看到雖然前面說 ROM 是儲存資訊,但是這在裡,則是用 Decoder,去決定要把四條路的哪幾條輸出 0,哪幾條輸出 1,而輸出 0 的方式就是直接接地。

## Code Converter
下面是把 16 進位的數字轉乘 ACSII Code 的電路,像是 0 對應到的就是 48,A 對應到的就是 65。
這個的實作方式其實跟上面一樣,就是有六條輸出,看各個 minterm 要選擇把誰接通;而左邊表格的 01 的情形當然就是事先查好 ACSII 的數字的二進制,然後再去接電路。

## Common Types of ROMs
有很多種的 ROM,有興趣的可以去查維基百科。
>老師說電機系會開相關課程
[影片支援](https://www.youtube.com/watch?v=RVqIXBNAHHE)
### Mask-programmable ROMs
[Wiki](https://en.wikipedia.org/wiki/Read-only_memory)
### 可程式唯讀記憶體 Programmable ROMs (PROMs)
:::warning
其內部有行列式的熔絲,可依使用者(廠商)的需要,利用電流將其燒斷,以寫入所需的資料及程式,熔絲一經燒斷便無法再恢復,亦即資料無法再更改。
By [Wiki](https://zh.wikipedia.org/wiki/%E5%94%AF%E8%AE%80%E8%A8%98%E6%86%B6%E9%AB%94)
:::
### 可抹除可編程唯讀記憶體 Erasable programmable read-only memory (EPROM)
:::warning
可利用高電壓將資料編程寫入,但抹除時需將線路曝光於紫外線下一段時間,資料始可被清空,再供重複使用。因此,在封裝外殼上會預留一個石英玻璃所製的透明窗以便進行紫外線曝光。寫入程式後通常會用貼紙遮蓋透明窗,以防日久不慎曝光過量影響資料。
By [Wiki](https://zh.wikipedia.org/wiki/%E5%94%AF%E8%AE%80%E8%A8%98%E6%86%B6%E9%AB%94)
:::
### Electrically erasable programmable ROMs (EEPROMs)
:::warning
電子抹除式可複寫唯讀記憶體(Electrically Erasable Programmable Read Only Memory,EEPROM)之運作原理類似EPROM,但是抹除的方式是使用高電場來完成,因此不需要透明窗。
By [Wiki](https://zh.wikipedia.org/wiki/%E5%94%AF%E8%AE%80%E8%A8%98%E6%86%B6%E9%AB%94)
:::
---
# Programmable Logic Devices
## Programmable Logic Array (PLA)
如果你今天想要產生很多種不同的布林邏輯,你可以先把他們全部所有的 AND Level 的可能先 AND 起來,然後再將各個邏輯式子需要的 AND 結果給 OR 起來
例如我們今天想要有下面的四種式子。
<iframe src="https://drive.google.com/file/d/1Dnm_0gF1XmxlSO6d_zJfR1M8qp34prGh/preview" height="280"></iframe>
那麼我們先把全部有的 AND 可能先找出來,並列出哪些式子各自需要那些 AND 結果。
<iframe src="https://drive.google.com/file/d/1qA-Ermfy3g4epLxWDLtCFFEsA5FqlcUJ/preview" height="280"></iframe>
畫成電路就會長的像下圖:
<iframe src="https://drive.google.com/file/d/1nQiFJGGbp4GR4Ps9WXJm3lgWIKjxnKfF/preview" height="280"></iframe>
而這種設計可以普遍化成下面的架構;可以看到有一個「Array」負責做 AND,另一個 「Array」負責做 OR。
<iframe src="https://drive.google.com/file/d/1pvWMqT5OPa-VZ30uOg9lfjWoX2gC-YwO/preview" height="280"></iframe>
### Switching Element 表示法
<iframe src="https://drive.google.com/file/d/1sPJzEZNL1j1WE5xcfO_wYQBALBivTKCB/preview" height="380"></iframe>
這裡要注意 Switching Element 的箭頭代表的意思;它代表了電流的方向。
舉例來說,第一條會是 A'B' 的原因,是因為如果 A' 或 B' 等於 0,則左邊電源提供的電流會流到他那裏,從而使得對於右邊的 F 輸出來說 A'B' 的結果是 0,因為電流流不到他們那裏;所以只有當 A' 跟 B'都是 1 的時候,左邊電源的電流才不會流到他們那裏而繼續流向右邊的 F 輸出位置。
:::info
不要忘記他有三個輸入
:::
### 更簡潔的 Switching Element 表示法
這個是以另一個 PLA 舉例,先以 K-Map 化簡,然後再去做跟上面一樣的動作,不過在表示上面變得更簡單,用點,或是叉叉來代表 Switching Element,或者說代表接通。
<iframe src="https://drive.google.com/file/d/1oneP0TFMlR-zOovWIcFF8Iq_XUA8j-k5/preview" height="380"></iframe>
## Programmable Array Logic / PAL
這個東西名稱看起來跟剛剛的 PLA 很像,他其實是 PLA 的一個特例。
他是讓 AND 一樣是 Programmable,但是 OR 的部分變成固定的。
下面先介紹兩個新的表示法:
<iframe src="https://drive.google.com/file/d/188QpADCyHt4fJLvreAXrtjWILuBwJOPX/preview" height="380"></iframe>
左邊就是代表同時有自己跟與自己相反的值;右邊則是代表有三個輸入,但是把他們用叉叉畫在一起。
這樣的好處是在畫的時候架構可以變得更簡潔,例如原本有下面的畫法:
<iframe src="https://drive.google.com/file/d/1zQJIH5BTBE8JSAyTBbwhfJ4MOHT5IsR4/preview" height="380"></iframe>
此時把 AND 的輸入都改成一條線上,用叉叉代表輸入,就會變得像下面簡潔:
<iframe src="https://drive.google.com/file/d/1ihh2bl5dglwQwlvLujL2ZzjUI2jx1le8/preview" height="380"></iframe>
### 例子 加法器
下面就是用 PAL 還有上面的畫法所畫出的加法器架構圖:
<iframe src="https://drive.google.com/file/d/1f4eW3sol9p66Kf3nrcTksfZI_4FaZNur/preview" height="380"></iframe>
可以看到就很像是各取所需組成 AND ,然後再 OR 起來;而最下面那個灰色的 AND 要代表的是這是一個 PAL,在 OR 的部分是 Non Programmable,也就是說他已經被固定了不可動,所以你可以自己接電路的部分就剩一下前面的 AND 部分;至於那個沒用到的 AND 閘就不要去接他就好
---
# Complex Programmable Logic Devices / CPLD
可以看到我們可以自行操作的內容有減少的趨勢,像是到了最後的 PAL,我們能夠自己操作的就只有把哪些 input AND 起來而已。
雖然這看起來限制很大,但是就如同計概時老師講過的,有時候下一些限制,反而可以從這些限制獲得一些好處。
Complex Programmable Logic Devices 是由很多的 PLA 跟 PAL 組成的小晶片,對於 PAL 的部分,因為已經限制住 OR 的地方了,所以你只要專心把 AND 接好就沒事了。
然後這裡是給個概念,Programmable Logic Devices 是可以很複雜的,不像前面舉的簡單例子:
<iframe src="https://drive.google.com/file/d/1QaS7e0Ky6Z7K26FUpcoMmXqa5tHwIMJY/preview" height="380"></iframe>
---
# Field-Programmable Gate Arrays / FPGA
跟前面的 PLD 很像就是根據自己的需求把電路接起來:
<iframe src="https://drive.google.com/file/d/1bRSVIUWRvWGM8hlPvAR_l-6L0Vf4S6sm/preview" height="380"></iframe>
## Configurable Logic Block & LUT
上圖可以看到 Configurable Logic Block,這是 Sequential Logic 的部分,所以之後會提到;不過裡面有一個東西叫做 Look Up Table LUT,他是產生 function 的方法,或者說一種 Function Generator。
如果你有一個 function,那麼我們可以很明確的知道他怎樣有最小的電路長相,但是為了有更簡單的實作方法,所以以下面的例子,我們就把全部的 16 種可能全部先產生出來,然後用一個 Flag 代表那個 AND 閘要不要開:
<iframe src="https://drive.google.com/file/d/1HIQLZqO98a7CTBQ-RB9IkgQlKvIL0l-b/preview" height="280"></iframe>
畫成電路就會長的像這樣:
<iframe src="https://drive.google.com/file/d/1nRsnIA8qfuSXK_ktbq0G2Dv9EXmk6sFD/preview" height="280"></iframe>
可以看到每個 AND 會多接一個判斷用的輸入 F 進去;這樣就產生了我們的 LUT。
## Shannon's Expansion
這可以算是一種 Function Generator;他就是把原本的式子,把其中一個變數挑起來,然後再將兩種可能的情形分別跟他原本的式子 AND 起來再 OR 起來,但是該式子要帶入該值為特定值;如下面的例子,可以看到他挑了 x~i~ 出來,而左邊的是 x~i~^'^,所以他會跟原本的式子,然後它的位置代入 0 AND 起來,而另一半也是一樣的做法。
<iframe src="https://drive.google.com/file/d/1Xa53SBprfuPjSTPP1DNDWvUp1PkLeIH6/preview" height="380"></iframe>
而這分成的兩半,可以看做有 F~0~ 跟 F~1~,求得的方法有兩種
- 第一種就是跟上面的操作一樣,將挑出來的那個變數直接帶入對應的值
- 可是上圖的是另一種作法,是直接將 K-Map 畫成兩半,然後再去畫圈圈
- 這樣就可以得到在有限制條件下的最簡 SOP
## Function Generator
這邊就是要利用上面提到的 Shannon's Expansion 來製作 Function Generator。
下面就是原先有一個 5 個變數的 function,但是我們把 A 給挑了出來,所以最後我們就可以把 A 當作 MUX 的 Enable 來做選擇的功用。
$$
F(A,B,C,D,E) = A' • F(0,B,C,D,E) + A • F(1,B,C,D,E) = A' • F_{0} + A • F{1}
$$
<iframe src="https://drive.google.com/file/d/1ZXxIJhWGDH_4sWEFugAoJnY89WWXh92N/preview" height="280"></iframe>
### 更多變數
當然我們不只可以挑一個變數,我們還可以挑很多個變數出來,如下面的例子就會長的像:
$$
G(A,B,C,D,E,F) = A•B•G(1,1,C,D,E,F) + A•B'•G(1,0,C,D,E,F) +A'•B'•G(0,0,C,D,E,F)+A'•B•G(0,1,C,D,E,F)\\
=A•B•G_{11} + A•B'•G_{10} +A'•B'•G_{00}+A'•B•G_{01}
$$
<iframe src="https://drive.google.com/file/d/1pxSIA6AUxDOtXTOtOcWq0Rk39ueynel2/preview" height="280"></iframe>