--- title: Karnaugh-Map 和 Quine McCluskey|第五週 tags: 數位系統與實驗 --- ## Karnaugh-Map 因為有視覺化的圖形,比較適合人腦;通常適用 2~5 個變數,再往上就超出可以視覺化的部分了 ## Quine McCluskey 雖然沒有了視覺化的圖形,但是這樣就可以有條理的列出每個階段的步驟,反而沒有了 Karnaugh-Map 在 6 個變數以上很難呈現的困擾 也因為這個特性很適合用來寫出演算法 ## 重要點 - Karnaugh-Map:相鄰的兩格只能有一個 bit 是不一樣的 - Quine McCluskey:每次要合併時只能有一個 bit 是不一樣的 --- # Karnaugh-Map 步驟 ## 1. 畫出卡諾圖 :::warning 注意,畫的時候,相鄰兩格一次只能有 1 個 bit 不一樣 ::: ### 這是 4 個變數的卡諾圖 ![](https://drive.google.com/uc?id=19Ucp5esqTkO6WGhLTvZlIy8W9AtiDD8z&export=download) ### 這是 3 個變數的卡諾圖 ![](https://drive.google.com/uc?id=17ITlwGt60phbqWIFt5zuq8mBASQKDsiE&export=download) ### 這是 2 個變數的卡諾圖 ![](https://drive.google.com/uc?id=1E7_E-qatn1A0MaB95HU59fGsFppaHj8W&export=download) ### 這是 5 個變數的卡諾圖 ![](https://drive.google.com/uc?id=1X64_E3LXeHs-Y_FzeTwHgQ1l-tUa51ID&export=download) 這個很像是在原本的四個變數之上多疊一層樓 ## 2.將你的式子中的會等於 1 和 0 的都填上去 這裡以 4 個變數舉例 假如我們的式子是 | Term | A | B | C | D | F(A,B,C,D) | |:--------:|:---:|:---:|:---:|:---:|:----------:| | $M_{0}$ | 0 | 0 | 0 | 0 | 0 | | $m_{1}$ | 0 | 0 | 0 | 1 | 1 | | $M_{2}$ | 0 | 0 | 1 | 0 | 0 | | $m_{3}$ | 0 | 0 | 1 | 1 | 1 | | $m_{4}$ | 0 | 1 | 0 | 0 | 1 | | $m_{5}$ | 0 | 1 | 0 | 1 | 1 | | $M_{6}$ | 0 | 1 | 1 | 0 | 0 | | $M_{7}$ | 0 | 1 | 1 | 1 | 0 | | $M_{8}$ | 1 | 0 | 0 | 0 | 0 | | $M_{9}$ | 1 | 0 | 0 | 1 | 0 | | $m_{10}$ | 1 | 0 | 1 | 0 | 1 | | $M_{11}$ | 1 | 0 | 1 | 1 | 0 | | $m_{12}$ | 1 | 1 | 0 | 0 | 1 | | $m_{13}$ | 1 | 1 | 0 | 1 | 1 | | $M_{14}$ | 1 | 1 | 1 | 0 | 0 | | $M_{15}$ | 1 | 1 | 1 | 1 | 0 | 可以知道 $$ F(A,B,C,D)=\sum m(1,3,4,5,10,12,13)=\prod M(0,2,6,7,8,9,11,14,15) $$ 然後將上面的情況填進去 ![](https://drive.google.com/uc?id=1oErYXMVm13SvRE3HkEAU2JPZC926DqFe&export=download) ## 3.開始圈 1 或 0 :::warning 1. 圈的時候,一定要圈最大的;並且每次只能圈 2 的整數次方個 - 像是 1,2,4,8 個... 2. 所有的 1 或 0 都要圈到 3. 讓圈圈的總數是最小的 - 所以要先評估,哪些 1 或 0 是只會被 1 個圈圈包住 - 那麼該圈圈就一定要圈,優先把它圈起來 4. 如果有 DC ,請視情況將他視為 1 或 0,只要能夠讓你圈越大、圈越少就好 ::: ### SOP :::success SOP 要把 1 圈起來 ::: ![](https://drive.google.com/uc?id=14dhEchsC1nVQ8AD9p5iohrNIqdoUj5sa&export=download) :::warning - 上圖中,橘色的就是圈最大、圈最少的結果 - 但是綠色的圈圈,**就是多餘的**;上面只是為了示範用才圈他 ::: ### POS :::success POS 要把 0 圈起來 ::: ![](https://drive.google.com/uc?id=1HY8Vq8kDyQtxakyveJcaw5Uzul8cgJVq&export=download) :::warning 圈的時候要注意一些事情 1. 整個圖是「循環的」,也就是說右邊邊界,跟左邊邊界是相鄰的;上下邊界亦然 - 所以圖中,最左上角那格,跟最左下角那格是相鄰的 - 所以要把那兩個相鄰的 0 給他圈起來 - 圖中最右上角那格跟最左上角那格也是同理,屬於相鄰的格子,要圈起來 ::: ## 4.將圈起來的內容寫下來 ### SOP 從結果可以知道,我們圈了 3 個地方 1. 中間四個被圈起來的,看看哪個變數同時出現 0 跟 1,就把它刪掉 - 可以知道是 A 跟 D - 所以那個圈圈得出的式子就是 $BC'$ - 0 代表 $'$ 1 代表沒有 $'$ 2. 左邊兩個圈起來的,看看哪個變數同時出現 0 跟 1,就把它刪掉 - 可以知道只有 C - 所以那個圈圈得出的式子就是 $A'B'D$ 3. 右下角那孤獨的 1,就直接把他寫起來 - 因此就是 $AB'CD'$ 最後,將結果 OR 起來,就會得到 $$ BC'+A'B'D+AB'CD' $$ ### POS 從結果可以知道,我們圈了 4 個地方,寫起來的方法跟剛剛 SOP 一樣 1. 中間四個被圈起來的 - $BC$ 3. 左上跟右上角被圈起來的 - $B'C'D'$ 5. 左上跟左下角被圈起來的 - $A'B'D'$ 7. 右邊兩個被圈起來 - $AB'D$ 一樣,將結果 OR 起來,就會得到 $$ BC+B'C'D'+A'B'D'+AB'D $$ 而 POS 最不一樣的步驟是,將上面的整個式子取反,並使用迪摩根化簡 $$ (BC+B'C'D'+A'B'D'+AB'D)'\\ =(BC)'(B'C'D')'(A'B'D')'(AB'D)'\\ =(B'+C')(B+C+D)(A+B+D)(A'+B+D') $$ ## 原理 ### SOP 會去看哪個變數同時有 1 跟 0,然後把它刪掉,是因為如果把它寫出來,其實就長得像: $$ AB+AB'=A(B+B')=A $$ 利用了分配律,這就是為甚麼可以消掉的原因 ### POS 為了方便說明,例子改成 2 個變數 假如有某個邏輯式子是這樣 $$ F(A,B)=\sum m(0,1) $$ 1. 我們知道由 minterm 組成的 SOP 是標準的 SOP,所以他是可以化簡成最簡單的 SOP >其實這裡很明顯就是 $F(A,B)=A'$ 2. 我們也知道同個式子除了用上面的標準 SOP 表示,也可以由標準 POS 表示,也就是 maxterm $$ F(A,B)=\prod M(2,3) $$ 3. 這個標準的 POS 一定可以化簡成最簡單的 POS 4. 回顧之前 minterm 跟 maxterm 是互補的關係,也就是說 $$ m_{i}=M_{i}' $$ 5. 此時回想我們圈 0 到底做了甚麼 - 把 0 給圈起來,其實就是在圈 Maxterm 對應的那些組別,像上面例子中的 2 跟 3 - 但是由於當初建立卡諾圖的時候,是根據 minterm 的情況建立的 - 也就是說 0 對應的是 $'$ 1 對應的是沒有 $'$ - 所以我們圈起來化簡後的結果就是 $\sum m(2,3)$ 化簡的結果 6. 所以我們藉由圈 0 得到了 $\sum m(2,3)$ 的化簡結果,但本質上跟 $\sum m(2,3)$ 是等價的,所以可以藉由互補關係,給他取反,得到 $\prod M(2,3)$ 的最簡結果 :::warning 那直接取反得到的真的是最簡結果嗎?底下藉由直接圈出 POS 來說明為甚麼是最簡結果 ::: ## 直接圈 POS 此時回顧之前提到的「不直覺的分配律」 $$ (A+B)(A+B')=A+BB'=A $$ 上面這件事告訴我們,如果 Maxterm 之間如果有個變數同時有 1 跟 0,那他就可以消掉,像是 $$ (A+B+C+D')(A+B+C+D)=A+B+C+DD'=A+B+C $$ 所以其實我們也可以不用採取取反的方式,直接用卡諾圖圈出我們要的 SOP ![](https://drive.google.com/uc?id=1HtSj6p6Ds7tMXQT47Uy662jylxmXCjXM&export=download) 這裡就直接以上面圈好的為例子,可以注意到,為了換成以 POS 為主,所以將 bit 整個取反了(綠色) 所以接下來做的事情就跟原本 SOP 一樣,看誰有 0 跟 1 ,就把他刪掉 1. 中間四個被圈起來的 - $B'+C'$ 3. 左上跟右上角被圈起來的 - $B+C+C$ 5. 左上跟左下角被圈起來的 - $A+B+D$ 7. 右邊兩個被圈起來 - $A'+B+D'$ 接下來全部 OR 起來就是我們要的最簡 POS 了 :::warning 此時應該會注意到,「圈起來」跟「刪掉」這兩個步驟,不管是先以 SOP 的角度然後再取反,還是直接取 POS,我們圈起來的,還有刪掉的變數都是相同的,所以兩者都是最簡的結果 ::: --- ## Prime Implicant 就是不能再長大的框框 :::warning 可以使用 MQ 有系統的找出所有 PI ::: ## Non Prime Implicant 就是還可以再長大的框框 **而一個最簡式子,一定只包含 PI** ![](https://drive.google.com/uc?id=1Fc5Dd8O7NQMUesM1hw92Gfd4CV1ej_hx&export=download) ## Essential PI 就是如果你要圈 1 或 0 的時候,有人只能被圈到 1 次,則包含那個 1 或 0 的圈圈就是 EPI 一定要優先把 EPI 圈起來,這樣就可以筆記好規劃要圈誰 ## Two level Logic 是在講像 SOP 這種,一堆變數先經過 AND ,然後再一起 OR 起來的樣子,很像經過兩層結構 ## 講義 POS 範例 ![](https://drive.google.com/uc?id=1YKveuMFwrLz3LbUNrcZ38cBAszFfN297&export=download) --- # Quine McCluskey ## 例子 | Term | A | B | C | D | F(A,B,C,D) | |:--------:|:---:|:---:|:---:|:---:|:----------:| | $m_{0}$ | 0 | 0 | 0 | 0 | 1 | | $m_{1}$ | 0 | 0 | 0 | 1 | 1 | | $m_{2}$ | 0 | 0 | 1 | 0 | 1 | | $M_{3}$ | 0 | 0 | 1 | 1 | 0 | | $M_{4}$ | 0 | 1 | 0 | 0 | 0 | | $m_{5}$ | 0 | 1 | 0 | 1 | 1 | | $m_{6}$ | 0 | 1 | 1 | 0 | 1 | | $m_{7}$ | 0 | 1 | 1 | 1 | 1 | | $m_{8}$ | 1 | 0 | 0 | 0 | 1 | | $m_{9}$ | 1 | 0 | 0 | 1 | 1 | | $m_{10}$ | 1 | 0 | 1 | 0 | 1 | | $M_{11}$ | 1 | 0 | 1 | 1 | 0 | | $M_{12}$ | 1 | 1 | 0 | 0 | 0 | | $M_{13}$ | 1 | 1 | 0 | 1 | 0 | | $m_{14}$ | 1 | 1 | 1 | 0 | 1 | | $M_{15}$ | 1 | 1 | 1 | 1 | 0 | 好的我知道看上面那個會看到眼花 $$ F(A,B,C,D)=\sum m(0,1,2,5,6,7,8,9,10,14)=\prod M(3,4,11,12,13,15) $$ ## 1.分區 先把 minterm 是 1 的列蒐集起來,並且依照該 minterm 有 1 的個數,分成小區塊 下面是四個變數的例子,所以分成四個區塊,也就是有 0 個 1,1 個 1,2 個 1 ... ![](https://drive.google.com/uc?id=1s-NzKoXbzhjz2cv3QsLYfX7JzkA1hpKy&export=download) ## 2.合併 其實上圖就有在做合併的動作。 1. 所謂的合併,就是看哪些組別他們只有一個 bit 不一樣,那就可以把這兩個併起來 - 所謂的只有 1 個 bit 不一樣,就是該 bit 一個人是 1 另一個是 0 - 併起來之後用「底線 _ 」標記這個位置 - 但是不能因為那個位置可以是 0 或 1,就以為他可以拿來跟別人合併 - 反而是兩組要合併時,該 bit 都要是「底線 _ 」才可以合併 3. 由於先前已經分好組別了,所以可以知道 0 個 1 的 跟 2 個 1 的一定不可能合併在一起 4. 有合併的,就移到新的表格,並標記誰跟誰合併,還有合併的樣子,如上圖 5. 如果有無法合併的組別,就把他做記號標起來 - 但是上圖因為都可以合併,所以看不到記號 ## 3.持續合併 沒錯,要一直合併,直到沒有組別可以合併下去 ![](https://drive.google.com/uc?id=1Wt-IHlwUb_aEO4-lnkAOKHYk02qsgc35&export=download) 1. 上圖中,兩兩個一組的組別中,只有 (1,5),(5,7),(6,7) 這三組無法合併下去變成四個一組,所以用紅色標起來 2. 由於到了四個一組,所以有可能合併起來後會有重複的,像上面畫紅線的就是重複的組別 3. 最後一樣檢查看看能不能繼續合併 - 可以的話就是要重複持續合併的步驟,然後持續把不能合併的記錄下來 而這個例子到這裡就不能再繼續合併了 :::warning 這個合併的過程,其實就是卡諾圖在畫圈圈的過程,但是 QM 的不是一次畫最大圈,而是慢慢由小圈圈變成大圈圈 ::: ## 4.列出來找 EPI 上面逐漸把圈圈長好長滿的結果,就是要去除掉不用圈的 ![](https://drive.google.com/uc?id=1hkSXykLm5-u_Ku5jyAP4784d569cm3hm&export=download) 在卡諾圖中,上面可以發現深色框的就是只被圈到一次的 1,所以包含他的圈圈就是 EPI ![](https://drive.google.com/uc?id=1rasfupC0I7VCPbr-iOlLvP_r20S6Af9o&export=download) 上面就是依照我們結果畫出的表格 1. 左半邊就是我們無法再往下合併的各個大小圈圈,記得順便紀錄他的 bit 狀況 2. 右半邊就是組成那些圈圈需要的 Minterm - 所以不用全部列出來 3. 深色的框框,也就是 9 號跟 14 號,就是我們只被圈到一次的 1 - 所以 (0,1,8,9),(2,6,10,14)這兩組就是 EPI,是一定要圈的圈圈 ## 5.去除掉不需要的圈圈 有了優先需要的圈的組別後,代表該組別的 minterm 都會被圈到 所以如果有其他小圈圈是由這個組別的 Minterm 組成,代表該圈圈就是重複的 也就是下圖中間那條圈圈 ![](https://drive.google.com/uc?id=1hkSXykLm5-u_Ku5jyAP4784d569cm3hm&export=download) ![](https://drive.google.com/uc?id=1Y2zxlH07vD3ubTP94I-T6ykLcmDtqqxp&export=download) 1. EPI 所擁有的 Minterm 分別是 橘色線的和綠色線的 2. 畫掉後會剩下 5 跟 7 這兩個 Minterm,而正好就有組別是 5 跟 7 組成的 3. 所以可以知道,這一步跟卡諾圖一樣,圈圈要畫越少越好 ## 6.列出結果 上面總共需要三個圈圈,把這三個圈圈的 bit 情況寫出來 $$ F(A,B,C,D)=m(0,1,8,9)+m(2,6,10,14)+m(5,7)\\ = B'C'+CD'+A'BD $$ ## 跟卡諾圖對應 ![](https://drive.google.com/uc?id=1k0gVXr1930_lp_35OWhpBqRaiH2VsBOH&export=download) --- ## 用卡諾圖解釋 Consensus ![](https://drive.google.com/uc?id=1KaHm1Yd5k0v74kPMCYN4YBVR1KdgzPO3&export=download) 之前學的其他的定理也都可以用卡諾圖解釋