11
501 研究者:黃詩芸 指導者:鄭政牟教授、陳怡芬老師 本研究旨在利用 Quine-McCluskey 演算法自動化程式化簡布林代數,使布林代數 的項數減少,達到花費最短時間以及最小硬體空間的效益。Quine-McCluskey演算法在 功能上等同於卡諾圖,用於簡化布林代數,但是它具有文字表格的形式,因此更適合用 於電子設計自動化演算法的實現。 布林代數在計算機科學中扮演著很大的角色。結合了集合運算和邏輯運算二者的根 本性質的一個代數結構 ,用來處理集合運算交集 並集 補集 ;和邏輯運算布林代數也可以在邏輯電路中表示為二進制數或電平,所以布林代數在電子工程計算機科學中有很多實踐應用。在設計數位系統時,若將所得之布林代數,依所設計數 位電路之實際狀況,進行適當的化簡工作,即可以降低布林代數之複雜度,減少實現數 位電路所需之邏輯閘數量與邏輯閘間連接線之複雜度,如此可進一步降低製作硬體電路 所需之成本,且減少運算時所需花費的時間。 因此本研究希望使用Quine-McCluskey演算法寫出一支程式,利用電子設計自動化 演算法化簡布林代數,達到最高的效益。 本研究將對於布林代數化簡法進行了解及效能評估。使用Quine-McCluskey演算法 使布林代數運算式的次數降低,使用較少的邏輯運算來表達。使用者將輸入一組欲化簡 的極小項 (mintern) 和不關心項(don't care)及變數的量,經由此程式化簡得到最簡化之 布林代數式。 一、布林代數: 布林代數又稱為布爾代數,是由 George Boole 發明,最早於 1847 年出版的 一個小冊子《邏輯的數學分析》出現,後來又出現在 1854 年出版的更充實的書 《思維規律》中。 布林代數是一種邏輯思維上的判斷,如同我們生活中常常需要做出「是」或

以自動化程式化簡布林代數web.fg.tp.edu.tw/~tfghdb/blog/wp-content/uploads/2016/01/WL21_pp501... · 卡諾圖(Karnaugh Map)又稱K 圖(K-map),是由Maurice Karnaugh 於1953

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

  • 501 

     

    以自動化程式化簡布林代數

    研究者:黃詩芸 指導者:鄭政牟教授、陳怡芬老師

    摘要

    本研究旨在利用 Quine-McCluskey 演算法自動化程式化簡布林代數,使布林代數的項數減少,達到花費最短時間以及最小硬體空間的效益。Quine-McCluskey演算法在功能上等同於卡諾圖,用於簡化布林代數,但是它具有文字表格的形式,因此更適合用

    於電子設計自動化演算法的實現。

    壹、研究動機

    布林代數在計算機科學中扮演著很大的角色。結合了集合運算和邏輯運算二者的根

    本性質的一個代數結構,用來處理集合運算交集、並集、補集;和邏輯運算與、或、非。 布林代數也可以在邏輯電路中表示為二進制數或電平,所以布林代數在電子工程和

    計算機科學中有很多實踐應用。在設計數位系統時,若將所得之布林代數,依所設計數

    位電路之實際狀況,進行適當的化簡工作,即可以降低布林代數之複雜度,減少實現數

    位電路所需之邏輯閘數量與邏輯閘間連接線之複雜度,如此可進一步降低製作硬體電路

    所需之成本,且減少運算時所需花費的時間。 因此本研究希望使用Quine-McCluskey演算法寫出一支程式,利用電子設計自動化

    演算法化簡布林代數,達到最高的效益。

    貳、 研究目的

    本研究將對於布林代數化簡法進行了解及效能評估。使用Quine-McCluskey演算法使布林代數運算式的次數降低,使用較少的邏輯運算來表達。使用者將輸入一組欲化簡

    的極小項 (mintern) 和不關心項(don't care)及變數的量,經由此程式化簡得到最簡化之布林代數式。

    参、 研究過程或方法

    一、布林代數: 布林代數又稱為布爾代數,是由 George Boole 發明,最早於 1847 年出版的

    一個小冊子《邏輯的數學分析》出現,後來又出現在 1854 年出版的更充實的書《思維規律》中。

    布林代數是一種邏輯思維上的判斷,如同我們生活中常常需要做出「是」或

  • 502  

    「否」、「好」或「不好」、「要」或「不要」的邏輯判斷,在布林代數中我們可以

    以 1 跟 0 來表示。 也因為布林代數只有兩種表示法:「是」和「否」,因此常被使用於邏輯電路

    之中。所以如果我們能將我們得到的電路圖,以布林代數表示,再藉由化簡程式

    運算,得到簡化的布林代數式,將其運用回邏輯電路之中,是必能減少邏輯閘之

    間的複雜度,進一步的減少所需成本以及所費之時間。布林代數最基本的運算邏

    輯閘有以下三種:

    (一)AND 閘:

    當 A、B 兩項皆成立此式才可成立。 可以以下邏輯閘表示:

    (二)OR 閘:

    當 A、B 兩項其一成立此式即可成立。 可以以下邏輯閘表示:

    (三)NOT 閘:

    就是反向閘,將輸入值轉換成另一值。 可以以下邏輯閘表示:

    而布林代數的表示方式有三種,分別為符號表示法、極小項表示、值表示法,

    表示方法如下表:

  • 503  

    二、布林代數式化簡法: 布林代數的化簡方式有很多種,分別為基本定理運算、卡諾圖運算以及

    Quine-McCluskey 演算法。

    (一)基本定理運算:

    同等於一般數學之運算,有交換律、分配律、結合律。最值得注意的是一

    個數加上他的反向會等於 1。

    (二)卡諾圖:

    卡諾圖(Karnaugh Map)又稱 K 圖(K-map),是由 Maurice Karnaugh 於 1953發明的化簡布林代數的方法,卡諾圖可藉由利用人類的模式識別能力的優勢,

    減少了需要進行的大量計算。 卡諾圖是用來簡化真實世界的邏輯要求,以便它們可以使用最少的邏輯閘

    來表示。 我們以下面的布林代數式做為例子來介紹卡諾圖的用法:

    此式中 m 代表著極小項,亦即: )=A’BCD’+AB’C’D’+AB’C’D+AB’CD’+AB’CD+ABC’D’+ABC’

    D+ABCD’ 當我們擁有四個變數時,我們的極小項可由 0~15 組成共會有 16 個變數,

    因此我們的卡諾圖也會含有16個位置。(如右圖)

    在這 16 個位置之中,相鄰的兩格只會相差一個位元,因此若相鄰兩格被填

    入的數值相同我們就可利用前述一個數

    加上他的反向會等於 1 將它化簡。 利用這種方式可圈出多個二的 n 次

    方矩形,矩形所涵蓋的範圍越大越好,

    矩形個數則要越小越好,才能達到最佳

    化簡效果。

    布林代數表示法

    符號 AB’C’D’ A’B’C’D’ ABCD ABCD’

    值 1000 0000 1111 1110

    極小項 8 0 15 14

  • 504  

    當卡諾圖在變數小於四時,可以非常簡單且方便的使用在化簡布林代數上,

    甚至由人工在紙上即可化簡。但是當變數超過五後,雖仍然能使用卡諾圖,但

    因少了直觀性以及增加了很多的複雜度,所以很難再以人工的方式去化簡。 三、自動化化簡布林代數(Quine-McCluskey演算法化簡):

    所謂電子設計自動化,就是要撰寫演算法,使使用者輸

    入相對於此程式所需要的值後,利用演算法計算,得到一個

    相對應的結果。 在電子設計自動化方面,McCluskey 於 1956 年發表「布

    林函數之最小化」(Minimization of Boolean Function),即以列表的方法來化簡邏輯系統中輸入與輸出間布林函數式,可

    解決接點邏輯電路簡化問題。 Quine-McCluskey 演算法在邏輯上同等於卡諾圖,但它

    更具有文字表格的形式,可以達到化簡更多變數的效果。本

    研究將利用 Quine-McCluskey 演算法化簡布林代數,使布林代數的項數變少,以節省下不必要的浪費。

    首先,我們要讓使用者先輸入欲化簡的極小項,再經由

    程式將使用者所輸入的極小項轉換使用二進位表示,經由轉

    換後的二進位我們可以判斷二進位數所含的一的個數,並依

    照一的個數將這些二進位數做分類,之後將分類好的二進位

    數做比較找出蘊含項及素蘊含項,再將所取得的素蘊含項列

    表找出本質素蘊含項,最後將所取得的本質素蘊含項輸出,

    即得所求。

    (一)邏輯電路二進位數表示法

    將使用者輸入的極小項 (minterm) 及不關心項 (don’t care) 轉換成二進位表示法並依照 1 的個數作為分類。將所有極小項都化簡成為二進位數,可利於後面的比較步驟。舉例而言,若我們要化簡以下的布林代數式:

    此式中 m 代表極小項,d 代表不關心項,第一步就是要將極小項及不關心

    項化簡為二進位,再依照 1 的個數作分類,並列出表格如以下:

  • 505 

     

    利用 python 軟體,寫出 binary 函式,用來將輸入的極小項化簡成一個二

    進位並儲存於一個陣列中:

    下列 one_number及 sort_by_one函式分別為判斷一的個數及將每一個二進

    位陣列做分類丟到每一個新的陣列中。

    (二)找出素蘊含項(Implicants)

    比較每兩個項,如果兩個項只有一個二進位的數值不同,則可以這個位的

    數值可以替代為一個橫槓”-“,來指示這個數字無關緊要。在前面我們已經將極小項及不關心項的二進位以 1 的個數分類,已知若兩個項只有一個二進位數值不同時這兩項的 1 的個數勢必差 1,因此上一個步驟將二進位以 1 的個數作分類有助於減少此步驟所要花費的時間。在經過比較之後我們可以得到我們所

    需要的素蘊含項(Implicants)如圖:

  • 506 

     

    下列函式為判斷每兩個項是否只相差一位,並列出可行的蘊含項:

    下列兩函式第一個為呼叫以上函式將前面所得到已分類好的二進位陣列

    一一比較,第二個則是重複比較找出所需要的素蘊含項:

    蘊含項不一定只存在於兩個數之間,在組合完一次之後我們要再繼續檢查

    有沒有更大的蘊含項,如上表我們看見有大小為 2 的蘊含項,由大小為 2 的蘊含項再次組合之後還可以得到大小為 4 的蘊含項。若以一個四個變數的布林代

  • 507  

    數式而言最多可以得到大小為 16 的蘊含項,因此在自動化程式的化簡上,我們需要以變數的個數來決定我們需要檢查幾次。在化簡蘊含項的同時,我們也

    要將無法再次組合的蘊含項以"*"表示,化簡完成後,我們在表上所看到有"*"的就是我們所需要的素蘊含項。

    (三)找出本質素蘊含項 (prime implicants)

    在找到素蘊含項之後我們可以將我們所找到的素蘊含項列為表格,此時縱

    向是剛才生成的素蘊涵項,橫向則是早先指定的極小項。由於不關心項對於任

    何結果重要,因此我們可以在此步驟忽略不關心項,只需討論極小項就好了。

    由下表我們可以發現含有極小項 4和含有極小項 15的素蘊含項都各只有一個,因此分別是我們所要尋找的本質素蘊含項。而第二列和第三列因為只剩下極小

    項 8 未被覆蓋,且這兩列都含有 8,因此只要任意選擇一組當作解即可。

    程式演算如下我們假設我們原本得到的素蘊含項是最好的答案,再經由下

    列函式一一比較,若發現後來的素蘊含項的項數及邏輯閘數少於前面的最佳解

    答,就將他代換,直到得到最佳解為止:

  • 508 

     

    (四)布林代數式化簡成簡單形式

    最後,我們就可以將原本有多個項數且複雜的布林代數式化簡成最簡單的

    形式如圖所示,原本冗長的算式經由化簡之後得到下面兩組最簡式

    最後執行程式,輸出結果:

    肆、 研究結果

    根據以上的實驗步驟,我們寫出了我們所需要的自動化程式。以四個變數為例,我

    們可以輸入0~15作為我們的極小項,利用程式,化簡出最小的布林代數,並分析其效能

  • 509 

     

    如下表: Case 1:

    輸入值

    (0~15 的極小項組合)Items1

    Gates1

    prime implicants Items2

    Gates2

    Itemsaved

    Gatessaved

    4,8,9,10,11,12,14,15 8 32 [([4, 12],['-', 1, 0, 0]), ([8, 9, 10, 11],[1, 0, '-', '-']), ([10, 11, 14, 15],[1, '-', 1, '-'])]

    3 7 5 25

    ���� �� �� �)=A’BC’D’+AB’C’D’+AB’C’D+AB’CD’+AB’CD+ABC’D’+ABCD’+ABCD

    f��� �� �� �)=BC’D’+AB’+AC 62.5%

    78.1%

    Case 2:

    0,4,8,12 4 16 [([0, 4, 8, 12],['-', '-', 0, 0])]

    1 2 3 14

    ���� �� �� �)=A’B’C’D’+A’BC’D’+AB’C’D’+ABC’D’

    f��� �� �� �)=C’D’ 75% 87.5%

    Case 3: 0,2,4,8,10,11,12 8 28 [([0, 2, 8, 10],['-', 0, '-',

    0]), ([0, 4, 8, 12],['-', '-', 0, 0]), ([10, 11],[1, 0, 1, '-'])]

    3 7 5 21

    ���� �� �� �)=A’B’C’D’+A’B’CD’+A’BC’D’+AB’C’D’+AB’CD’+AB’CD+ABC’D’

    f��� �� �� �)=B’D’+C’D’+AB’C 62.5%

    75%

    Case 4: 2,3,5,7,11,13 7 28 [([2, 3],[0, 0, 1, '-']), ([3,

    11],['-', 0, 1, 1]), ([5, 13],['-', 1, 0, 1]), ([3, 7],[0, '-', 1, 1])]

    4 12 3 16

    ���� �� �� �)=A’B’CD’+A’B’CD+A’BC’D+A’BCD+AB’CD+ABC’D

    f��� �� �� �)=A’B’C+B’CD+BC’D+A’CD

    42.8%

    57.1%

    Case 5: 2,3,4,9,12,15 6 24 [([2, 3],[0, 0, 1, '-']), ([4,

    12],['-', 1, 0, 0]), ([9],[1, 0, 0, 1]), ([15],[1, 1, 1, 1])]

    4 14 2 10

    ���� �� �� �)=A’B’CD’+A’B’CD+A’BC’D’+AB’C’D+ABC’D’+ABCD

    f��� �� �� �)=A’B’C+BC’D’+AB’C’D+ABCD

    33.3%

    42.6%

    Case 6: 4,5,6,8,12,15 6 24 [([4, 5],[0, 1, 0, '-']), ([4,

    6],[0, 1, '-', 0]), ([8, 12],[1, '-', 0, 0]), ([15],[1, 1, 1, 1])]

    4 13 2 11

    ���� �� �� �)=A’BC’D’+A’BC’D+A’BCD’+AB’C’D’+ABC’D’+ABCD

    f��� �� �� �)=A’BC’+A’BD’+AC’D’+ABCD

    33.3%

    45.8%

  • 510 

     

    Case 7: 0,5,7,12,14,15 6 24 [([0],[0, 0, 0, 0]), ([5, 7],[0,

    1, '-', 1]), ([12, 14],[1, 1, '-', 0]), ([7, 15],['-', 1, 1, 1])]

    4 13 2 11

    ���� �� �� �)=A’B’C’D’+A’BC’D+A’BCD+ABC’D’+ABCD’+ABCD

    f��� �� �� �)=A’B’C’D’+A’BD+ABD’+BCD

    33.3%

    45.8%

    Case 8: 5,7,13,14,15 5 20 [([5, 7, 13, 15],['-', 1, '-',

    1]), ([14, 15],[1, 1, 1, '-'])]2 5 3 15

    ���� �� �� �)=A’BC’D+A’BCD+ABC’D+ABCD’+ABCD

    f��� �� �� �)=BD+ABC 60% 75%

    Case 9: 2,4,5,8,12,13 6 24 [([2],[0, 0, 1, 0]), ([4, 5,

    12, 13],['-', 1, 0, '-']), ([8, 12],[1, '-', 0, 0])]

    3 9 3 15

    ���� �� �� �)=A’B’CD’+A’BC’D’+A’BC’D+AB’C’D’+ABC’D’+ABC’D

    f��� �� �� �)=A’B’CD’+BC’+AC’D’ 50% 62.5%

    Case 10: 3,4,6,9,13,15 6 24 [([3],[0, 0, 1, 1]), ([4, 6],[0,

    1, '-', 0]), ([9, 13],[1, '-', 0, 1]), ([13, 15],[1, 1, '-', 1])]

    4 13 2 11

    ���� �� �� �)=A’B’CD+A’BC’D’+A’BCD’+AB’C’D+ABC’D+ABCD

    f��� �� �� �)=A’B’CD+A’BD’+AC’D+ABD

    33.3%

    45.8%

    Case 11: 7,3,4,6,1,10,15 7 28 [([1, 3],[0, 0, '-', 1]), ([4,

    6],[0, 1, '-', 0]), ([10],[1, 0, 1, 0]), ([7, 15],['-', 1, 1, 1])]

    4 13 3 15

    ���� �� �� �)=A’BCD+A’B’CD+A’BC’D’+A’BCD’+A’B’C’D+AB’CD’+ABCD

    f��� �� �� �)=A’B’D+A’BD’+AB’CD’+BCD

    42.8%

    53.5%

    Case 12: 2,4,15,7,9 5 20 [([9],[1, 0, 0, 1]), ([2],[0, 0,

    1, 0]), ([7, 15],['-', 1, 1, 1]), ([4],[0, 1, 0, 0])]

    4 15 1 5

    ���� �� �� �)=A’B’CD’+A’BC’D’+ABCD+A’BCD+AB’C’D

    f��� �� �� �)=AB’C’D+A’B’CD’+BCD+A’BC’D’

    20% 25%

    由上表可得知我們的項數在化簡上可達到減少45.7%的效果,亦即使用了此方法化簡布林代數,可以減少掉一半的項數,最高甚至可以達到少了75%的項數。

    而在於使用的邏輯閘個數,平均也達到了減少57.8%的效果,可以說是大幅的減少,對於此化簡的結果,我們可以說是成功的。

  • 511 

     

    伍、 討論

    從研究結果中,我們可以發現當我們輸入值的極小項的數量越高時,所能化簡的效

    率越高,因為當極小項越多時,分布於四個變數所組成的16個極小項中,就有可能會愈密集,因此極小項與極小項之間就更有可能達到可以化簡的要素,因而化簡。故當我們

    擁有超過四個以上的極小項時,使用本研究所提供之演算法,可達到化簡的最高效能。 普遍而言,少於四個極小項的布林代數式,使用人工作業的卡諾圖即可。因為有些

    時候,少於四個極小項的布林代數式,可能化簡後結果不會改變,使用卡諾圖可以更直

    覺更清楚的得到結果。不過還是可以使用此演算法作化簡的動作,只是效果可能不會很

    明顯。

    陸、 結論

    本研究透過Quine-McCluskey演算法化簡布林代數,確實可以使布林代數有效率的被化簡,得到最簡化的布林代數式,降低布林代數之複雜度,減少實現數位電路所需之

    邏輯閘數量與邏輯閘間連接線之複雜度。如能應用於數位電路設計中,可進一步降低製

    作硬體電路所需之成本,且減少運算時所需花費的時間。

    柒、 參考資料及其他

    1. McCluskey, E. J. (1956) Minimization of Boolean function. Bell System Technical Journal, 35(6),1417-1444.

    2. Petrick's method.Wikipedia.Retrieved February10, 2014,From http://en.wikipedia.org/wiki/Petrick%27s_method

    3. Karnaugh map. Wikipedia.Retrieved February10, 2014,From http://en.wikipedia.org/wiki/Karnaugh_map

    4. 周立強、程安邦、張邦彥。(民 101)實現以布林代數演算為基礎之可程式控制器適合作為循跡式小型載具其方向速度控制器之設計。科學與工程技術期刊,第八卷第二期。

    5. 奎因-麥克拉斯基演算法。維基百科。民 103 年 2 月 10 日,取自: http://zh.wikipedia.org/wiki/%E5%A5%8E%E5%9B%A0%EF%BC%8D%E9%BA%A6%E5%85%8B%E6%8B%89%E6%96%AF%E5%9F%BA%E7%AE%97%E6%B3%95

    6. Embedding Boolean Expressions into Logic Programming. J. Symbolic Computation (1987) 4, 191-205

    7. The Quine-McCluskey method.Steven Nowick.handout5.Jaunary19,2006