究竟是如何設計的電路,具有計算和控制的智力?
這一點也不高深。本系列文章從初中學的最簡單的電路圖說起,看看能不能從最初的有一個繼電器的電路,畫到一個簡單的CPU。電路圖用multisim12.0繪制,這樣就可以看到效果了。
(注:雖然現代計算機是用半導體材料制作芯片的,但是電路原理和繼電器材料沒有不同。本人愚鈍,只理解了繼電器,還沒有研究電子管、晶體管這些器件的工作原理。而繼電器原理簡單,用作講解數字電路原理再好不過。)
從電池、開關和繼電器開始
上圖左上角是一個很普通的電路,由電池、開關電流表和燈泡組成。這個是初中物理學過的。
上圖右上角是對左上角電路的簡單變形,用VCC代替了電池,用接地符號實現了回路。相當于把電池拆開來畫了。電路功能是一樣的。本文此后的電路圖一般都采用VCC和接地表示電源。因為你會發現只有這樣的畫法能夠讓我們方便理解之后的電路圖。
然后往下看,第三個電路圖,那個圈圈里圈著個K的藍色的東西,表示的是繼電器。當繼電器左側有電流通過時,右側的電路就斷開;反之則聯通。(對應地,也有那種左側有電流通過時,右側的電路就聯通;反之則斷開的繼電器,稍后會用到)這個電路想讓你知道的是,可以用繼電器實現這樣的功能:控制左側的電路的通斷,即可改變右側電路的通斷。換個方式說,就是左側的電路通斷情況決定了右側的電路的通斷情況。再往抽象了說,就是左側電路代表了"輸入"(Input)這個概念,右側電路代表了"輸出"(Output)這個概念。繼電器則代表了"計算"(或者"算法"、"處理"等)(CPU)這個概念。硬件就是用這種電器設備的固有物理性質提供了最初的計算能力。
再往下看第四個電路圖,它和第三個的區別就在于用VCC和接地符號代替了電池。初次看電路,我們有必要經歷一次從電池到VCC和接地符號的過渡。以后的電路圖,我們將直接使用VCC和接地符號,請務必在此處適應這樣的畫法。
然后是最下邊這個電路。和第四個電路相比,它用一個"非門"的符號代替了"繼電器、右側電路電源和繼電器的接地"這三個符號。也就是說一個"非門"實際上就是"繼電器、右側電路電源和繼電器的接地"這三個東西的組合,而且畫的時候省略了電源和接地符號。
之前在學校里學數字電路,我就是想不明白邏輯門的電源在哪兒,整個電路的通路在哪兒,所以一直學不好。現在有個這個電路圖,感覺一切豁然開朗。
用繼電器做個與門
剛剛我們用繼電器做出了"非門"。可以看到只要用一個繼電器就可以了。與門的電路如下圖所示。
與門由兩個繼電器(這兩個繼電器用的都是跟做非門的繼電器通斷情形相反的那種)構成,只有當兩個繼電器左側都通電時,右側電路才能聯通。這樣就實現了"與"的功能。"與門"的符號是一個躺著封口的U形。
注:本文里我做的電路圖片都是GIF格式的,你可以在瀏覽器里看到隨著開關的開閉,輸入和輸出電路上的燈泡是如何變化的。每個圖上都有(http://bitzhuwei.cnblogs.com)標識我的博客地址,不過每個GIF圖的最后一幀都去掉了這個標識。這樣,看到一幀沒有標識的時候,就知道下一幀將是GIF圖的第一幀了。
用繼電器做個或門
"非門"、"與門"做出來了,"或門"也就不難理解了,直接上圖大家體會吧。(導線交叉的地方,如果有個紅點,表示是聯通的,否則就是互不相干的)"或門"的符號像一個子彈。
用繼電器做個異或門
"異或門"的功能是:左側的兩個輸入電路一個聯通另一個不聯通時,右側電路聯通;否則右側電路不聯通。這次先畫符號,大家可以先自己嘗試用繼電器畫"異或門",鍛煉一下思維,然后再向下看答案。
答案揭曉!"異或門"的實現如下圖所示。乍看很復雜,其實是有邏輯的。最右邊的兩個繼電器其實是一個"或門",最左邊兩個繼電器是兩個"非門",中間兩上兩下共四個繼電器,是兩個"與門"。這樣就好理解了。AB兩個輸入電路為A通、B不通的時候,整個"異或門"會通過下方的路線使燈泡亮;若A不通、B通,則會通過上方的線路使燈泡亮。其他情況燈泡都不會亮。
做一些看起來可用的東西
與或非異或邏輯門電路雖然重要,卻離構造CPU相距較遠,做出來似乎也沒什么成就感。那么我們用這些過于基礎的器件,做一些有用的東西吧!
小小約定
為了表達方便,我們約定一下,邏輯門電路的輸入(輸出)線上有電流的時候,我們說輸入為1(輸出為1),否則就說輸入為0(輸出為0)。
振蕩器能夠不斷地輸出0、1、0、1、0、1、0、1……這樣的信號。這種東西雖然一時說不上有什么用,不過一定是有用到的時候的。振蕩器做起來也簡單得離譜。看下圖所示電路。
把非門的輸出端連到輸入端上。當輸出為1時,輸入也就成了1,那么輸出就得變成0;然后輸入也跟著變成0,這樣輸出又變回了1。循環翻轉無休無止。振蕩器能翻轉多快,就看繼電器的反應有多快了。(現代計算機用晶體管代替了繼電器,晶體管比繼電器翻轉速度快得多,所以能夠得到的頻率更高,計算機的速度更快。而且晶體管比繼電器省電)話說multisim12仿真的翻轉速度也夠可以的,本人截圖也費了不少勁。
順便給一個用繼電器做振蕩器的實際應用的例子:上學的時候上下課的鈴聲就是用繼電器做的振蕩器完成的。0101信號用錘子敲打鐵盔表達了出來。
加法器
剛剛約定了,用1和0表示電路的通斷。電路只有通斷這兩種狀態,所以計算機只用0和1來表示數,這就是二進制啊。關于二進制和十進制的內容別人寫得太多了,我就不提啦。要計算兩個多位二進制數的和,可以分別計算各個數位上的結果,而各個數位的計算方法又是相同的,即"被加數+加數=>和的值+進位的值"。這用邏輯門表示如下圖。
A和B表示加數和被加數,C表示前一位計算的進位的值,C1燈泡表示本次計算的進位的值,S1燈泡表示本次計算的和的值。我找了半天,也沒在multisim12里找到一位二進制數的加法器件的符號,大家看這個圖就可以了。
要計算多位數,把單位數加法器首尾相連就可以了,如下圖所示。這兩張圖是從《穿越計算機的迷霧》中拿來的。如果侵權,請告訴我,不然我就偷個懶不自己畫啦。
學匯編的時候聽過這個東西,"寄存"這個詞讓我感覺寄人籬下可憐巴巴的。寄存器的功能是把數據(約定里說的0和1,實際就是電路的通斷狀態)保存下來,以后還可以取出來用。寄存器這東西比之前的器件都復雜,需要一步一步來做。
R-S觸發器
先看下面這個電路,這是各種有存儲功能的器件的基礎。
上圖展示的是在R和S開關都斷開的情況下啟動電路得到的結果。《穿越計算機的迷霧》里說這種情況下,哪個燈泡亮是不一定的,就看哪個邏輯門轉的快了。不過我用multisim12仿真的時候,兩個燈泡是在忽亮忽滅不停地閃。這可以說是非正常人類使用R-S觸發器的情況。下面再看看正常人類使用R-S觸發器的情況。
R-S觸發器的R是Reset,意思是把Q燈泡重置為0,S是Set,意思是把Q燈泡置為1。可以看到,只閉合S,則Q亮NQ不亮;只閉合R,則Q不亮NQ亮;同時閉合RS,則Q和NQ都不亮;同時斷開RS,則Q和NQ保持剛才的狀態不變。
D觸發器
既然要保存數據,我們就要求只在希望保存某個數據的時候存進去,否則就不理他。所以我們給R-S觸發器加一個新的輸入作為控制端,只有控制端為1的時候才能保存新來的數據。這里也把RS端合并為一個D端,用一個非門實現了只能使R和S有且只有一個開關是閉合的(即要么Q燈泡變為1要么Q燈泡變為0)。
D觸發器的符號我也沒在multisim里找到,大家看這個吧。
上升沿D觸發器
我們只希望在某一瞬間把數據存起來,而不是像D觸發器那樣,控制端為1的整個時間端都會保存新數據。(這樣最安全)于是我們在D觸發器基礎上設計了上升沿D觸發器。這個觸發器只在控制端從0變為1的瞬間存儲新數據。是不是很奇妙的設計?
上升沿D觸發器使用了兩個D觸發器,再加一個非門,就OK了。平時,我們把要存儲的數據(D開關)放好。然后,當控制端CP為斷開時,圖中上面那個D觸發器是能夠存數據的,但是下面那個存不了。就是說新數據已經到了兩個D觸發器之間的導線上。在控制端CP閉合的瞬間,上面的D觸發器無法再存新數據了,而下面的D觸發器可以存新數據了,那么它存的是哪個新數據?只能是剛剛在兩個D觸發器之間的導線上的數據了。這個瞬間之后,新數據無法通過上面的D觸發器,自然也就無法保存了。
這次我終于在multisim12里找到了上升沿D觸發器的符號。
乒乓觸發器
這是個有點類似振蕩器的器件。兩者的區別在于,振蕩器是自動地改變輸出,乒乓觸發器是在輸入一個上升沿的時候改變輸出。電路圖如下所示。
可以看出,乒乓觸發器其實就是把上升沿D觸發器的非Q輸出端接到了輸入端。很顯然每次存的新數據總是和輸出信號相反。
乒乓觸發器可以用來做計數器。計數器有這樣的功能:每收到一個上升沿的信號,就增加1。例如下圖所示的能統計二進制的00000到11111(即0到31)這32個數。計數器的每一位計數器件都是一個乒乓觸發器。燈泡亮表示1,燈泡滅表示0。
走馬燈
利用上升沿D觸發器還可以做"走馬燈"。走馬燈是每次都讓前面一個燈泡亮的設備,最后一個燈泡亮過之后,又從第一個燈泡開始亮,循環往復。下圖所示電路就是一個有5個燈泡循環走馬的走馬燈。為了在電路剛接通的時候讓第一個燈亮起來,我加了兩個開關S1和S2,大家可以分析一下怎么用S1和S2。這有助于加深體會上升沿D觸發器的功能,并加速對更復雜器件的理解。
寄存器
終于到這個小玩意了!
能保存5位二進制數的寄存器如下圖所示。其實就是5個上升沿D觸發器并列起來而已。
想保存數據的時候,調整好D0、D1、D2、D3、D4五個開關(實際應用的時候就可能是其他電路的輸出導線了),然后斷開再閉合一下控制端的開關S5即可,數據就保存到了5個上升沿D觸發器的Q端。
我這里只畫了保存5位數的寄存器,是因為再畫就太大了,在word里圖就看不清楚了。我們知道現在計算機的寄存器已經到32位或者64位了。那就是有32或64個并列的上升沿D觸發器組成一個寄存器。我們也看到了一個上升沿D觸發器需要幾十個繼電器(晶體管),那么一個寄存器就需要上千個繼電器(晶體管)了。而CPU里包含的寄存器、加法器等運算器還有各種控制器,其包含的繼電器(晶體管)數目上百萬也就很好理解了。內存條里的內存也是用上升沿D觸發器和一個門電路組成存儲一位(一個bit,8個bit是一個字節)的存儲結構的,其包含的繼電器(晶體管)數目可想而知有多少。
中場休息
到這里,做CPU需要的基礎器件就差不多全了。不過再寫下去就太長了,不利于理解和記憶。因此暫且中場休息,下一篇再繼續介紹如何構造一個簡單的CPU。
前面介紹的各自器件,可以用下表描述其繼承關系。(索性把下一篇文章要介紹的器件也列出來了)
評論
查看更多