1. 程式人生 > >編碼的奧祕:邏輯閘電路

編碼的奧祕:邏輯閘電路

轉自:《編碼的奧祕》   第十一章

 

         在遙遠的將來,當人們回顧2 0世紀的計算機發展史時,有人可能會以為一種稱為“logic gates(邏輯閘)”的裝置是以著名的微軟公司創始人的名字命名的( Bill Gates中的G a t e s在英語中有“門”的意思),其實並非如此。我們很快就會明白,邏輯閘和通常讓水和人通過的門十分相似。邏輯閘通過阻擋或允許電流通過在邏輯中執行簡單的任務。

         回憶一下在上一章中你走進一個寵物店所要的那隻貓,這可以由下面的布林表示式說明:

         

        同時,也可以用下面的電路來選擇符合條件的小貓:

         這樣一個電路有時被稱為網路。但在今天,網路這個詞更多地被用來指連線起來的計算機,而不僅僅只是開關的集合。

         儘管這個電路包含的全是1 9世紀發明的東西,但那時卻沒有人意識到布林代數可以直接由電路實現。這種等同性直到2 0世紀3 0年代才被發現,主要貢獻人是克勞德·夏農(生於1 9 1 6年)。夏農在他著名的、於1 9 3 8年在麻省理工學院所寫的碩士論文《A Symbolic Analysis of Relay and Switching Circuits》中闡述了這個問題。(1 0年之後,夏農的文章The Mathematical Theory of Communication》是使用“位( b i t )”這個字來表示二進位制數字的第1篇出版物。)

         1 9 3 8年以前,人們已經知道當把兩個開關串聯起來時,只有兩個開關都閉合電流才能流通;而當把兩個開關並聯起來時,只需閉合其中的一個即可構成迴路。但沒有人能像夏農那樣清晰地闡述電子工程師可以使用布林代數的所有工具來設計帶開關的電路。此外,如果你簡化了描述網路的布林表示式,你也可以相應地簡化網路。

         例如,描述你想要的小貓的表示式是:

         用結合律把用×結合的變數重新排序並按下面的方式重寫表示式:

         為更清楚地表達意圖,可以定義名為X和Y的兩個新變數:

         現在,描述你想要的小貓的表示式可以寫成下面的樣子:

         完成簡化後,我們再把X、Y代回原來的式子。

         注意,變數N在表示式中出現了兩次。使用分配律,表示式可以按如下方式重寫,並只使用一個N:

         現在把X、Y表示式代入:

         由於有很多圓括號,該表示式看上去似乎仍很複雜。但表示式中少了一個變數項(減少了一次×運算),也就意味著網路中少了一個開關。這是修改後的電路圖:

            確實,證明修改前後的兩個電路圖功能是一樣的比去證明兩個表示式功能是相同的要簡單。

           可是,網路中仍然多餘了三個開關。理論上講,你只需要四個開關來定義你心目中的貓咪。為什麼是四個呢?因為每個開關都是一個“位”。你需要一個開關來定義性別(斷開表示公的,而閉合表示母的);一個開關來定義是否有生育能力(閉合表示鬮過的,斷開表示未鬮過的)還需要兩個開關表示顏色。因為只有四種可能的顏色(白、黑、褐和其他所有顏色),而我們知道四種選擇可以用兩個二進位制位來定義,所以只需要兩個開關來表示顏色。例如,兩個開關都斷開表示白色,一個閉合表示黑色,另一個閉合表示褐色,兩個開關都閉合就表示其他所有顏色。

          現在,讓我們做一個控制面板來選擇一隻貓。控制面板上有四個開關(正如你家裡的電燈開關)和一個燈泡:

          開關打到上面是指開關閉合,反之是指開關斷開。也許表示貓的顏色的兩個開關標識得不是很清楚,這是為了把控制面板做得更簡練不得已而造成的。在表示顏色的一對開關中,左邊的開關標著B,如果只有它往上就表示黑色;右邊的開關標著T,如果只有它往上就表示黃褐色;B、T兩個開關均往上則表示其他顏色,由O標識;B、T兩個開關均往下則表示白色,由W標識。

         在計算機專業術語中,開關是一種輸入裝置,輸入是控制電路如何工作的資訊。本例中輸入開關對應於描述一隻貓咪的4位資訊,輸出裝置是燈泡。如果開關描述了一隻符合條件的貓,燈泡就會亮。上面介紹的控制面板上的開關被設定成表示一隻無生育能力的黑母貓,這是符合你的要求的,所以燈泡亮了。

         現在所要做的是設計一個使控制面板工作的電路。

         前面提到過夏農的論文題目是《 A Symbolic Analysis of Relay and Switching Circuits》,他所指的 r e l a y和第6章中所講的電報系統的繼電器很類似。在夏農的論文發表時,繼電器已被用作其他目的,尤其是用於電話系統的大型網路。

         像開關一樣,繼電器也可以串聯或並聯以執行邏輯中的簡單任務。繼電器的組合稱為邏輯閘。這裡所說的“邏輯閘執行簡單邏輯任務”是指邏輯閘只完成最基本的功能。繼電器比開關好是因為繼電器可以被其他繼電器控制而不必用手指控制,這意味著邏輯閘可以被組合起來以執行更復雜的任務,比如一些簡單的算術操作。事實上,下一章就要展示如何用電線連線開關、燈泡、電池和繼電器來構造一個加法機(儘管它只能工作於二進位制數字狀態)。

          繼電器對電報系統的工作十分重要。連線電報站的電線長距離時電阻很大,需要一種方法來接收微弱的訊號並把它增強後傳送出去。繼電器通過使用電磁鐵控制開關可做到這一點。事實上,繼電器放大了一個很弱的訊號使其成為一個強訊號。

          就我們的目的而言,我們並不對它的訊號放大能力感興趣,真正使我們著迷的是繼電器作為開關可用電來控制而不用手指。可以用電線把繼電器、開關、燈泡和一對電池做如下連線:

          注意左邊的開關是斷開的,燈泡不亮。當閉合開關時,電流流過圍繞在鐵棒上的線圈,於是鐵棒具有了磁性,並把上面有彈性的金屬簧片拉下來,從而連通了電路,使燈泡發光:

          當電磁鐵把上面的金屬簧片拉下來時,這個繼電器被稱為“觸發了”。當左邊的開關斷開時,鐵棒不再有磁性,繼電器中的金屬簧片則彈回到原來的位置。

          這看上去似乎是用一種很不直接的方式點亮燈泡的,但實際上這種方式是很直接的。如果我們只對點亮燈泡感興趣,我們完全可以捨棄繼電器。但我們的興趣並非只是點亮燈泡這麼簡單,我們有更巨集偉的目標。

          本章要多次用到繼電器(當邏輯閘建好之後就會很少再用了) ,所以要把上面那幅圖簡化一下。可以通過大地省去一些導線。在這種情況下,大地僅代表了一個公共端,並不是指真正的物理接地:

          

           這看上去仍然不夠簡化,但還不至於那樣做。注意兩個電池的負極均接地,所以當看到的電池是這樣的時:

           可用大寫字母“ V(它代表電壓) ”代替上圖中的電池 (如在第 5和第 6章中所做的 )。現在繼電器看上去如下圖所示:
 

              當右邊開關閉合時,電流從 V端流出,經過電磁鐵芯流到地上。這使得電磁鐵把上面有彈性的金屬簧片拉下來,從而連通了接有燈泡的電路,燈泡點亮:

           上面圖顯示了兩個電源和兩個接地,但本章的所有圖中,電源,即“ V”,可以互連,接地端也可以互連。本章及下一章的所有繼電器和邏輯閘的網路只要求有一個電池,但可能是一個大容量的電池。例如,上一幅圖可只用一個電池,如下所示:

            但這幅圖並不能清楚地表明要用繼電器做什麼。先不考慮電路而把注意力放到輸入和輸出上,就像前面的控制面板一樣:

           如果電流流經輸入(例如,用一個開關把輸入連到“ V”端) ,電磁鐵就會被觸發,輸出就有了一個電壓。

           繼電器的輸入不一定只能是開關,其輸出也未必只限於燈泡。一個繼電器的輸出可以連到另一個繼電器的輸入,如下所示:

              當閉合開關時,第一個繼電器被觸發,它為第二個繼電器提供了輸入電壓,於是第二個繼電器也被觸發,燈泡被點亮了:

             把繼電器連線起來是構造邏輯閘的關鍵。

            事實上,燈泡可以兩種方式連到繼電器上。注意,具有彈性的金屬簧片是被電磁鐵拉下來的。平時,金屬簧片與上端接觸,當電磁鐵吸引它的時候,它便和下端接觸。我們一直把金屬簧片與下端的接觸作為繼電器的輸出,但我們也可以把它與上端的接觸作為輸出。當使用這種輸出時,結果正好相反,輸入開關斷開時燈泡是亮的:

             而當輸入開關閉合時,燈泡便滅了:

           使用這種開關的繼電器稱為雙擲繼電器 ,它的兩個輸出在電性上是相反的—當一個有電壓時,另一個則沒有。

            順便說一下,如果你不知道現在的繼電器是什麼樣子,你可以很方便地從當地的電器行的透明小包裡看到一些。有些繼電器就像 (加入飲料的 ) 方形小冰塊一樣大小,如元件號為2 7 5 - 2 0 6和 2 7 5 - 2 1 4的繼電器就是這種大小的且經久耐用的繼電器。它們被封在一個乾淨的塑料外殼裡,所以你可以看到電磁鐵和彈性金屬簧片。本章和下一章所描述的電路都使用的是元件號為 2 7 5 - 2 4 0的繼電器,它體積小且價格便宜(每個 $ 2.99)。

             正如兩個開關可被串聯一樣,兩個繼電器也可以串聯:

            上面繼電器的輸出為下面的繼電器提供了輸入電壓。如上所示,當兩個開關均斷開時,燈泡不會發光。試著閉合上面的開關:

            由於下面的開關仍舊斷開,下面的繼電器沒有觸發,所以燈泡仍然不亮。若斷開上面的開關而閉合下面的開關:

            燈泡仍舊不亮。因為上面的繼電器未被觸發,電流無法流經燈泡。點亮燈泡的唯一方法是閉合兩個開關:

          現在,兩個繼電器都被觸發了,電流可以在電源、燈泡和接地點之間流通。

          同串聯開關一樣,這兩個繼電器也執行了邏輯操作。只有當兩個繼電器都被觸發時,燈泡才會點亮。串聯的兩個繼電器就是一個“ AND gate(與門)”。為避免複雜的圖示,電氣工程師使用一個特殊的符號表示“與門”,如下圖示:

         這是四個基本邏輯閘中的第一個。與門有兩個輸入端(在圖的左部) ,一個輸出端(在圖的右部) 。這樣表示的與門通常輸入在左部,輸出在右部。這是因為人們習慣於從左到右讀圖。但是與門同樣可以畫成輸入在上部、右部或底下。

          有兩個繼電器、兩個開關和一個燈泡的原始電路圖如下所示:

         使用“與門”符號,上圖可同樣表示成:

           注意與門不僅代替了串聯的兩個繼電器,同時也隱含了上面的繼電器連著電源,且兩個繼電器都是接地的。只有當上下兩個開關都閉合時,燈泡才會發光,這就是它之所以叫與門的原因。
          與門的輸入未必一定要和開關連線,且輸出也不一定只能是燈泡。我們真正要處理的是輸入端的電壓和輸出端的電壓。例如,一個與門的輸出可以是另一個與門的輸入:


          只有當三個開關都閉合時,燈泡才會發光。當上面的兩個開關閉合時,第一個與門的輸出會觸發第二個與門的第一個繼電器,而最下面的開關會觸發第二個與門的第二個繼電器。

          如果把不加電壓視為 0,加上電壓視為 1 ,則與門的輸出按如下方式由輸入來決定:

        正如兩個串聯的開關一樣,與門的輸入輸出關係可作如下描述:

        

        與門也可以有多於兩個的輸入端。例如,假設串聯了三個繼電器:


          只有當三個開關同時閉合時,燈泡才會發光。這種配置可用如下符號表示:

         它被稱為三輸入端與門。

         以下邏輯閘可用並聯的繼電器解釋:



           注意兩個繼電器的輸出是連線在一起的,這個連線在一起的輸出為燈泡提供了電源。任何一個繼電器都可以點亮燈泡,例如,如果閉合上面的開關,燈泡會亮。這時,燈泡從左上角的繼電器得到了電力供應。

          如果讓上面的開關斷開而閉合下面的開關,燈泡也會亮:



           當兩個開關都閉合時,燈泡同樣會亮:



       可見,當上開關或下開關中的任何一個閉合時,燈泡都會亮。這裡的關鍵是“或”,所以這樣的門叫“ OR gate(或門) ”。電氣工程師使用如下符號表示或門:


       它看上去和與門很相似,只是接輸入端的一邊是弧形的,很像英語“ O R”中的字母“ O”。

       或門的兩個輸入中,只要有一個加上電壓,輸出就是高電位。同樣,如果約定不加電壓是0,而加電壓是 1 ,則或門也有四種可能的組合狀態:

        可以把或門的輸入輸出關係小結成如下表格:

        或門也可以有兩個以上的輸入端(當任一輸入端為 1 時,輸出端就為 1 ;只有所有輸入端均為0時,輸出端才為 0)。

 

        前面解釋過繼電器可稱為雙擲繼電器,因為其輸出可以兩種不同的方式連線。通常情況下,當開關斷開時,燈泡不亮:

           當開關閉合時,燈泡點亮。

           也可以用另外一種連線方式,使開關斷開時燈泡點亮:



         在這種情況下,只有閉合開關時燈泡才熄滅。以這種方式連線的繼電器叫作 反向器 。反向器不是邏輯閘(邏輯閘通常有兩個以上的輸入),但它十分有用。反向器可以用下面的符號表示:



         它被稱為反向器的原因是當輸入為 0時輸出卻為 1 ,反之亦然:

         有了反向器、與門和或門,我們就可以製作控制板來自動選擇理想的小貓了。讓我們從開關開始。第一個開關的閉合表示母貓,斷開表示公貓。這樣,可以產生稱為 F和 M的兩個訊號,如下圖所示:


        當F是1 , M就是0,反之亦然。同樣,第二個開關的閉合表示鬮過的貓,而斷開表示有生育能力的貓:


           接下來的兩個開關更復雜一些,不同的組合要代表四種不同的顏色。這裡有兩個開關,都與電源相連:



          當兩個開關都斷開時,它們表示白色。我們用兩個反向器和一個與門來產生訊號 W。如果選擇了一隻白貓, W就為1 ,否則為 0:


         當開關斷開時,兩個反向器的輸入是 0,這樣反向器的輸出(也就是與門的輸入)為 1 ,這也就意味著與門的輸出為 1 。一旦一個開關閉合,與門輸出即為 0。
        為表示一隻黑貓,閉合第一個開關,這可以用一個反向器和一個與門實現:

          只有當第一個開關閉合而第二個開關斷開時,與門的輸出才是 1 。同樣,當第二個開關閉合而第一個開關斷開時,與門的輸出也為 1 。我們用來表示褐色:


       而如果兩個開關都閉合時,用如下圖示表示其他顏色:



         現在把四個小電路整合為一個大電路(通常,黑點表示電線的連線點,沒有黑點的交叉線是不連線的):


            這個連線圖看起來十分複雜。但如果仔細地沿著線路走,看清楚每個與門的輸入而不要關心這些輸入又連到了別的什麼地方,你就會明白電路是如何工作的。如果兩個開關都斷開,訊號W會是1 ,其餘訊號都是 0。如果第一個開關閉合,則訊號 B會是1 ,其餘訊號都是 0。

           連線門和反向器時可以遵循一些簡單的規則:一個門(或反向器)的輸出可以作為其他門(或反向器)的輸入,但是兩個以上的門(或反向器)的輸出永遠不能互連在一起。

          由 4個與門和 2個反向器組成的電路叫作“ 2 - 4譯碼器”。輸入是兩個二進位制位的不同組合,共代表了 4個不同的值。輸出是 4個訊號,任何時刻只能有一個是 1 ,至於哪一個是 1 取決於兩個輸入位。用同樣的原理還可以構造“ 3 - 8譯碼器”或“ 4 - 1 6譯碼器”等等。

          選擇小貓的表示式的簡化表示是:

         

       對於表示式中的每一個加號 ( + ),必定對應電路中的一個或門。對於每一個乘號 (× ),則對應一個與門:


           電路圖左邊的符號和它們在表示式中出現的順序是一樣的。這些訊號來自於和反向器連線的開關及 2 - 4譯碼器的輸出。注意,圖中用了反向器來表示表示式中的( 1 -W)。

          你可能會說: “這不過是一堆繼電器而已。 ”不錯,這正是一堆繼電器,每個與門和或門中都有兩個繼電器,一個反向器中有一個繼電器,因而只能說你必須習慣它。以後的各章會用更多的繼電器。不過,所幸的是你不用真正地去買一堆回家連起來。

          本章再看兩個邏輯閘。這兩個門都會用到這樣一個繼電器,該繼電器在不被觸發時,其輸出為高電位(這是用在反向器中的輸出)。例如,下面配置中,一個繼電器的輸出為第二個繼電器提供了電源。當兩個輸入都斷開時,燈泡是點亮的:

           如果上面的開關閉合了,燈泡就會熄滅:


            燈泡的熄滅是因為第二個繼電器沒有電源供應。同樣,若下面的開關閉合燈泡也會熄滅:

           若兩個開關都閉合,燈泡還是不亮:

           這種行為和或門的行為正好相反,被稱為“ NOR gate (或非門) ”。下面是或非門的符號:


         它和或門的符號很相像,只是在輸出端有一個空心的小圓圈,這個小圓圈表示反向,故而或非門也可用下面的表示:



         或非門的輸出如下表所示:



         這張表顯示的結果和或門相反。在或門中,輸入端中只要有一個是 1 ,輸出就是 1 ;只有輸入端均為 0時,輸出才為 0。

 

        連線兩個繼電器的另一種方式如下圖所示:


         在這種情況下,兩個輸出連在一起。除了連在繼電器的另一個觸點上之外,這種連線形式與或門類似。當兩個開關都斷開時燈泡是亮的。

          當只有上面的開關閉合時,燈泡也是亮的:

 

       當只有下面的開關閉合時,燈泡也是亮的:

 

          只有當兩個開關都閉合時,燈泡才會熄滅:

            這種行為和與門的行為正好相反,被稱為“ NAND gate (與非門) ”。與非門的畫法和與門的畫法很相像,只是在輸出端加了一個小圓圈,表示其最後的輸出和與門的輸出是相反的:


         與非門的輸出如下表所示:



         到此為止,我們已經看到可用四種不同的方式來連線有兩個輸入、一個輸出的繼電器,每一種方式的行為功能都不一樣。為避免畫繼電器,我們把這些連線稱為邏輯閘並使用電氣工程師們使用的符號來表示它們。特定的邏輯閘的輸出取決於其輸入,總結如下:



        現在已有了四個邏輯閘和一個反向器,完成這些工具的其實就是原始的繼電器:


           上圖稱為 緩衝器,用符號表示如下:


          它和反向器的符號類似,只是沒有小圓圈。緩衝器的特點是“什麼都不做”,其輸出和輸入是相同的:



          當輸入訊號很弱時,可以使用緩衝器,這是因為這也正是多年前繼電器被用於電報當中的原因。此外,緩衝器也可用於延遲一個訊號,這是因為繼電器可能要求多一點兒動作時間,如1 秒的幾分之一才被觸發。

         本書從現在開始不再畫繼電器,取而代之的是電路將由緩衝器、反向器、4個基本邏輯閘及更復雜的電路(如2- 4譯碼器)組成。當然,所有這些部件也是由繼電器構成的,但我們用不著看到它了。

         前面講過,可用下面的小電路構造一個 2- 4譯碼器:

        兩個輸入被反向後成為與門的輸入。有時,像這樣的配置可以去掉反向器而畫成如下的樣子:


         注意與門輸入端的小圓圈,這些小圓圈表示訊號在這些點上被反向了, 0會變成1,而1變為0。

        具有反向輸入端的與門和或非門的行為是一樣的:


        只有輸入端均為 1 時輸出才為 0。

        這兩對等同的電路實際上就是迪摩根定律的內容。迪摩根是維多利亞時代的另一位數學家,他比布林年長 9 歲。據說,他的書《 Formal logic 》發表於 1 8 4 7 年,和布林的《 T h eMathematical Analysis of logic》恰好是同一天。事實上,布林正是由於受到發生在迪摩根和另一個英國數學家之間的剽竊事件的觸動而研究邏輯的。 (迪摩根最後證明是清白的。 )很早以前,迪摩根就意識到了布林思想的重要性。他無私地鼓勵和幫助布林進行研究,但最終除了他的這個著名的定律外,他幾乎被人們遺忘了。

         迪摩根定律可以簡單地表示成:



        A和B 是兩個布林運算元。在第一個表示式中,它們被取反(即反向)後再相與。這和先把它們相或後再取反(或非門的功能)的結果是一致的。第二個表示式中,兩個運算元被取反後再相或,這和先把它們相與後再取反(與非門的功能)的結果是一樣的。

         迪摩根定律對於簡化布林表示式,進而簡化電路是一個很重要的工具。從歷史上講,這正是夏農的論文對電氣工程師的真正含義。但是,專門簡化電路並非本書的焦點,更重要的是讓事物工作、起作用。下面我們要執行起來的就是一臺簡單的加法機。