數據選擇器MUX(二選一)你們是怎麼想出來的呢?

最近上From NAND to TERIS(Coursera),老師上課第一周project中有道題讓我們用HDL寫數據選擇器。我對數字電路——0基礎(坦白地講,其他幾道簡單題目,我是硬套那些基礎的真值表寫出來的。)

但數據選擇器,三維,我套不了了,實在是想不到,想了許久,就只有兩個方向——

1、if,then,但是這等於用了高級語言,實現不了,

2、窮舉(就等於套公示表),醉了,怎麼可能

實在想不到,最後百度出來了

我實在很想知道你們當初學習的時候,是怎麼寫/畫出來的呢?(還是也是老師給的結果)我特別想知道你們的心路歷程,雖然上面一幅圖寥寥幾筆,但我真的無法想出。

Coursera上,這門課的要求是零基礎,結果我這個多少還算是學過一些理科知識的傢伙,愣是沒能想出,實在是難堪,真心求教各位大神。


一般而言,就是想得出的。也說不上是怎麼想出來的。

但你要實在比較老實(ben),要找什麼必殺技,是有的哦,開心吧! 就是通過化簡卡諾圖的方法。

卡諾圖是一種真值表,比如你的選擇器,本質是一個三輸入,一輸出的東西,那麼就可以從最終功能出發,列寫卡諾圖如下:

這表怎麼看呢,左邊第一列就是s的可能情況,第一行就是ab的可能情況,這個表把所有可能的輸入以及其對應的輸出都列出來了需要注意的是,在列寫輸入時,相鄰兩格只允許一個輸入變數變化

錯誤案例:

正確案例:

做這個工作基本就是無腦的。你設計選擇器,無非就是一個輸入,控制選通哪路。另兩個作為被選的路。如果根據這個要求連真值表都列不出來我就幫不了你了。

根據卡諾圖,你可以把任何邏輯需求表達為輸入變數與(用於表徵每一格的邏輯)完以後的相加形式。

比如上面這個可以轉化為:

0*sar{a}ar{b}+1*sar{a}b+1*sab+0*saar{b}+

0*ar{s}ar{a}ar{b}+0*ar{s}ar{a}b+1*ar{s}ab+1*ar{s}aar{b}

看上去很長,其實仔細看,我就是幹了一件很sb的事情,本質就是把上面那個表格換了一種表達方式。一個蘿蔔(邏輯)一個坑(格子)

這裡那些0係數項都能消掉對吧,所以上面那一坨可以簡化如下(把是1的坑裡的蘿蔔留下):

sar{a}b+sab+ar{s}ab+ar{s}aar{b}

其實,基於上面這個邏輯式,你已經可以用一個很複雜的邏輯電路實現你想要的選擇功能了。但這樣做明顯很浪費,因為上面這個式子還能簡化的。

卡諾圖簡化的一個重要原則就是,相鄰的兩個格子圈起來,可以消掉一個變數。

什麼意思呢?

比如我紅圈全起來的,第一行圈起的兩格所對應的輸入里,只有a變。a變了,但輸出不變(因為我故意把輸出都是1的圈起來了),所以a可以去死了。同理第二行。

第一行的兩個邏輯合併:sar{a}b+sabRightarrow sb

第二行的兩個邏輯合併:ar{s}ab+ar{s}aar{b}Rightarrow ar{s} a

最後,得到最終簡化效果:

sb+ar{s} a

這樣,你就把一個原本8項的複雜邏輯式,簡化成了一個2項的邏輯式。

而這個邏輯式幾乎一目了然。

我用中文描述一遍:

sb結果 和 s反a結果 做一個運算。

所以你要的是一個非門,兩個與門和一個或門。

怎麼搭電路已經呼之欲出了對不?

==========================

基於要給你把來龍去脈講清楚的原則,上述描述中有大量廢話作為理解性的過度,其實真的操作時我想沒人會真的去列寫那個8項的邏輯式吧。Just in case,我還是簡要說一下必要步驟:

1、根據邏輯需求列寫卡諾圖。

1-2、列寫卡諾圖裡為1的那些邏輯,得到初步邏輯式(熟練後可跳過)

2、看卡諾圖裡輸出是1的格子可以怎麼合併,盡量多合併。

3、根據合併原則,消項。

4、得到簡化後邏輯式,根據邏輯式直接搭邏輯電路。


我現在還沒明白,高斯的正十七邊形是怎麼想出來的.....


推薦閱讀:

怎麼反駁「被狗咬了一口,難道你還要咬回去?」?
唯物主義者可以變為唯心主義者,但沒有唯心主義者變為唯物主義者,這是不是就說明唯心主義比唯物主義更先進?
請問自指通過否定一定能構成悖論嗎?
悖論提出的具體意義是什麼?
子非魚,安知魚之樂 這樣的邏輯該怎麼解?

TAG:邏輯 | 數字集成電路 | 電路設計 |