說明重要參數的設計與影響 第五章 意外的收穫
程式結果的額外啟發.
第六章 結論
心得感想與未來計畫.
第七章 程式碼
Turbo C 程式碼
第一章 導論
1-1 研究動機
記得以前大二的時候,我上一門王益文老師的數位電路設計課程, 當時在實驗課的時候,老師第一次給我們一個邏輯函數,比方是
OUT=(AB+C'+D'+EF+G'+H')*(I'+J')KL+A
老師要我們用邏輯 IC 來實作出來.想當然,第一步便是化簡我們的
電路,我們用直覺來畫以上函數的電路圖,大概會是如(圖1)的景況:
(圖 1) 在圖 1 裡面包含了:
5 個 2_AND gate 3 個 2_NAND gate 4 個 2_OR gate
而老師當初給我們的 IC 是
1 個 7400 IC (內含 4 個 2_NAND gate) 1 個 7402 IC (內含 4 個 2_NOR gate)
1 個 7404 IC (內含 6 個 INVERTER gate) 1 個 7408 IC (內含 4 個 2_AND gate) 換句話說我們初始設計的電路圖要用到:
1 顆 7400 IC , 因為有 3 個 2_NAND gate 2 顆 7408 IC , 因為有 5 個 2_AND gate 卻少了具有 2_OR gate 的 IC...
於是在課堂上,老師教我們手動化簡電路圖 OUT=AB+(CD)'
(如下方圖 2-1)
(圖 2-1) 在圖 2-1 裡包含了:
1 個 2_AND gate 1 個 2_NAND gate 1 個 2_OR gate
ABCD 為 input, (圓圈 1)為 CD AND 之後的反向, 使之成為 NAND.
(圖 2-2)
在圖 2-2 中:我們在連線中各自加入兩個圈圈,(圈圈 2)(圈圈 3)(圈圈 4)(圈圈 5).
其中(圈圈 2)(圈圈 3)互相抵銷, 負負得正, 而維持原函數的值正確.
其中(圈圈 4)(圈圈 5)互相抵銷, 負負得正, 而維持原函數的值正確.
(圖 2-3)
在圖 2-3 中: 我們把(圈圈 3)和(圈圈 5)向右邊(後級)移動, 使得 OR gate 變成 NAND gate, 也就是形成(圈圈 6).
(圖 2-4)
在圖 2-4 中: (圈圈 2)往左移動, 使得 AND gate 變成 NAND gate, (圈圈 1)和(圈圈 4)互相抵消.
最後變成:
F=((AB)'CD)' =AB+(CD)'
我們使用了:
1 個 2_AND gate 2 個 2_NAND gate
很明顯的是,我們不必使用到 2_OR gate ! 於是,我們把這個方法,套用到當初老師所給的函數:
OUT=(AB+C'+D'+EF+G'+H')*(I'+J')KL+A 將他變成圖3:
(圖 3) 我們用了:
1 個 7400 IC (使用其中 4 個 2_NAND gate) 1 個 7402 IC (使用其中 4 個 2_NOR gate) 1 個 7404 IC (使用其中 1 個 INVERTER gate) 1 個 7408 IC (使用其中 4 個 2_AND gate) 最後我們達成了 IC 限制下的任務
於是我覺得手工化簡電路圖是一種見仁見智的工作,或許經驗可 以給我們幫助,也或許光用眼睛就可以看出如何變動 IC 就可以得到最 好的解,但是這是一個僅有 12 個 GATE 的邏輯函數,如果今天是一個數 百個,數千的邏輯閘的電路圖呢?是否仍然能夠光憑眼睛就看出最佳解 呢?我想,那是不可能的!
既然如此,我們是否可以利用電腦函數的強大計算能力,來幫助我 們達到這個理想?於是我想設計一個程式,來幫助我們針對特定的邏輯 電路,加以變動其中的 gate,來達成我們的要求.
1-2 研究目的
在大三時,我們修習了陳德生老師的 VLSI 演算法課程,其中運用了 不少演算法來幫助我們化簡電路,減少邏輯閘,甚至是作 floorplan,繞 線等等工作.記得老師強調,在電子產業之中,降低成本一直是企業獲 利的第一要素.
一樣的一塊電路板,拉線少拉十公分,便是降低成本,少用一顆 IC 也是降低成本,甚至使用的 IC 種類越少,也是降低成本的方法.於是乎, 如果工程師在接到上級的製作規格書時,有著上述的限制,要他在幾種 IC 或者幾顆 IC 的限制下完成一個電路,那麼我們要如何作到呢?
所以我想完成一個程式,好比第一步驟之中,我將一個剛剛好 16 個 邏輯閘的電路,如圖 4 所示:
我刻意的將他的邏輯閘設計為:
4 個 2_AND gate 4 個 2_NAND gate 4 個 2_OR gate 4 個 2_NOR gate
而剛剛好使用到 4 種 IC
(圖4)
但是, 我將之轉換成較亂的電路圖如圖5
很明顯的是, 這裡我們用到了:
5 個 2_AND gate 2 個 2_NAND gate 6 個 2_OR gate 3 個 2_NOR gate
(圖 5)
於是必須要用到至少 6 顆 IC 才能實作這個電路, 我們給他的限 制是,我們要用最少的 IC 種類,來完成一樣的電路,畢竟 4 顆 IC 的製 作成本比起 6 顆 IC 的製作成本,足足省了 33 %,這便是我的研究所要 達成的目的.
1-3 研究過程
1 針對初步的 16 個邏輯閘電路預先設計最完美的解, 便是平均使 用到四種邏輯閘, 四種 IC.
2 打亂該電路邏輯閘的種類, 使他運用到的邏輯閘遠大於最少個 數.
3 研究手工化簡電路時, 我們會運用到的方法, 將理論基礎加以 整理.
4 將上述理論基礎實作成程式.
5 執行程式並找出錯誤加以更正.
6 達成最少 IC 數之後, 加以圖形化表達.
7 計算多次執行的情形下, 平均執行次數為何.
8 將 16 個邏輯閘的程式, 加以變更為 20 個邏輯閘的程式, 求證是 否能將該程式加以擴大到邏輯閘數量龐大的電路之上.
9 比較 16 個邏輯閘 和 20 個邏輯閘的差異.
10 將結果加以整合.
第二章理論基礎
狄摩根定律
AB = (A'+B')' (如圖 6-1)
故遇到 AND gate 則替換成 NOR gate 且前級的 gate 要加上 Inverter
(圖 6-1)
(AB)' = A'+B' (如圖 6-2)
故遇到 NAND gate 則替換成 OR gate 且前級的 gate 要加上 Inverter
(圖 6-2)
A+B = (A'B')' (如圖 6-3)
故遇到 OR gate 則替換成 NAND gate 且前級的 gate 要加上 Inverter
(圖 6-3)
(A+B)'= A'B' (如圖 6-4)
故遇到 NOR gate 則替換成 AND gate 且前級的 gate 要加上 Inverter
(圖 6-4)
第三章程式製作
3-1 設計預設最少 IC 數的電路圖
在這個階段,我們把 16 個邏輯閘平均分為四種邏輯閘,便是: 4 個 2_AND gate,4 個 2_NAND gate,4 個 2_OR gate,4 個 2_NOR gate,這樣
便可以用恰恰好四種 IC 來實作,於是我們設計如下的電路圖(圖7)
(圖 7)
3-2 產生最雜亂 IC 數的電路圖
我們運用(狄摩根定律),把原本的電路圖轉成以下電路圖(圖 8)
(圖 8)
3-3 製作資料格式
為方便我們記憶以及程式的撰寫,我們以一個陣列來儲存所有邏 輯閘的資訊,包含欄位如(表 1):
欄位順序 資料型態 代表意義 出現數值
欄位 0 int 整數 前級上端 gate 編號 1 - 13
欄位 1 int 整數 前級下端 gate 編號 2 - 15
欄位 2 int 整數 前級上端 gate 節點編號 17 - 107 欄位 3 int 整數 前級下端 gate 節點編號 18 - 108
欄位 4 int 整數 本級上端節點編號 1 - 46
欄位 5 int 整數 本級下端節點編號 2 - 47
欄位 6 int 整數 本級邏輯閘種類 1 - 4
欄位 7 int 整數 本級輸出節點編號 17 - 48
欄位 8 int 整數 次級 gate 節點編號 25 - 126
欄位 9 int 整數 次級 gate 編號 9 - 16
(表 1)
3-4 使用決策方法
3-4-1 選取變動邏輯閘個數
首先,要變動邏輯閘之前,我先用亂數函數 random(); 來決定該 次要變動幾個 IC,為了不要變更輸入端的訊號源,所以我們將不變動那 些會造成訊號源正負值得邏輯閘.所以只會選取 gate:
9,10,11,12,13,14,16 如圖 9
(圖 9) 3-4-2 選取變動邏輯閘
依照上述選取個數,由亂數函數決定要挑哪一個邏輯閘加以變動, 原則採用前述(狄摩根定律),並將前級受影響邏輯閘加以修正.
3-4-3 計算變動後邏輯閘數量
依照變動後之各個邏輯閘的型態,計算各種邏輯閘的種類及數量.
3-4-4 計算變動後 IC 數量
依照邏輯閘的數量,每四個一組,推算出一共使用了幾種 IC.
3-4-5 與先前的結果作比較
比較該次 IC 數是否有減少?如果是,我們就將該次結果設為最佳結 果,反之,將丟棄該結果,並繼續維持上一次的結果.
3-5 秀出電路圖
在每一輪的執行之後,以 Turbo C 的繪圖函數畫出各種邏輯閘的
圖案,並依照電路圖的相對關係位置秀在螢幕上.如圖10
圖 10
3-6 結束程式計算結果
將最佳的解紀錄下來,並記下當時程式執行的次數,多次執行的結 果之後,計算平均執行幾次可以得到最佳解,以圖形的方式,將最佳解 的電路圖表達出來,秀在螢幕上.
第四章 程式執行與改進
4-1 (選取個數)參數的設立
當初一開始時,我的設計並沒有(選取個數)的參數,於是我發現程 式在沒有問題的情形之下,一樣的初始狀況,常常執行幾百次,甚至幾 千次,都很難得到最佳解,也就是一開始初始狀況的 IC 數為 6,而執行 了幾百次之後,仍然停留在 6,而最好的狀況也僅在於 5,就無法再下 降了,始終沒辦法找到 4 個 IC 的最佳解,原因何在 ?
這使我想到以前在作手工化簡時,往往要一次變動好幾個邏輯閘, 才能得到迥然不同的解,如果單單只是變動一個邏輯閘,就很難有大的 改變,更別說是最佳解了,於是才想到,如果每次選取變動 IC 個數,都給 他不一樣的量,是否會有改善?
結果是肯定的,在最後加入(選取個數)參數,使得程式能在較少的 執行次數下,便得到最佳解.
4-2 任意初始值的給予
在多次執行結果後,在在都能夠得到最佳解,便是 4 個 IC,於是我 再加以思考,如果我的初始狀況給他雜亂無章的數值,是否能夠給我們 最佳解?結果都能成功執行