• 沒有找到結果。

程式執行與改進

說明重要參數的設計與影響 第五章 意外的收穫

程式結果的額外啟發.

第六章 結論

心得感想與未來計畫.

第七章 程式碼

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,於是我 再加以思考,如果我的初始狀況給他雜亂無章的數值,是否能夠給我們 最佳解?結果都能成功執行

4-3 20 個邏輯閘程式執行說明

首先我們啟動 20 個邏輯閘的程式,並且輸入 cycle=50 的 要求,表示我們要程式對該電路執行 50 次的邏輯閘變換.如下 (圖 11-1)

(圖 11-1)

程式一開始便秀出初始狀態的電路圖,並且讓我們知道該 電路使用了 6 個 AND gate ,3 個 NAND gate,9 個 OR gate,2 個 NOR gate,而且換算出要使用到 7 個 IC .如下圖(圖 11-2)

(圖 11-2)

程式在第一個 cycle 便把邏輯閘加以變動,產生新的電路, 並告知總 IC 數 下降到 6 個 IC,並把他加以保留.如(圖 11-3)

(圖 11-3)

程式在第 22 個 cycle 時, 得到更小的總 IC 數=5,並把他加 以保留.如(圖 11-4)

(圖 11-4)

程式結束時,秀出最佳解,也就是秀出 IC 數=5 時的電路,並 且告知我們是在第 22 cycle 時所得到的.如(圖 11-5)

(圖 11-5)

最後程式結束時,並告知我們,在多次執行之下,平均跑了 18 個 cycle,便可以得到最佳解.如(圖 11-6)

(圖 11-6)

4-4 16 個邏輯閘程式多次執行說明

針對 16 個邏輯閘,在多次執行之下,找出平均取得最佳解 的 cycle 數.統計如下(表 2)

Cycle 數 連續執行次數 取得最佳解 cycle 數

50 1 7.0000

50 5 4.6000

50 10 6.8000

50 15 6.8000

50 20 6.8000

50 25 4.8000

50 30 4.4666

50 35 4.3714

50 50 4.8500

50 100 3.9000

(表 2)

我們可以看出,當重複執行次數愈大,則平均取得最佳解的

cycle 數愈會下降.

相關文件