從晶體管聊起,說說計算機為什麼採用二進制

導讀:本文聊一聊計算機是如何使用晶體管實現二進制計算的。

如果你感覺文章略長,可以直接到文章末尾看總結文字。

1.理論先行

1.1.二進制思想的提出

二進制是計算技術中廣泛採用的一種數制。二進制數據是用0和1兩個數碼來表示的數。它的基數為2,進位規則是“逢二進一”,借位規則是“借一當二”,由18世紀德國數理哲學大師萊布尼茲發現的。

當前的計算機系統使用的基本上是二進制系統,數據在計算機中主要是以補碼的形式存儲的。

1.2.二進制思想的初步實現

(1)二進制與邏輯代數

1854年,英國數學家喬治·布爾(George Boole)發表了一篇具有里程碑意義的論文,詳細描述了一種邏輯代數系統,該系統將被稱為布爾代數。他的邏輯推理是在數字電子電路的設計中起了重要的作用。

(2)繼電器開關實現二進制的設想

1937年,克勞德·香農(Claude Shannon)在麻省理工學院發表了他的碩士論文,在歷史上第一次使用電子繼電器和開關實現了布爾代數和二進制算術。

香農的論文題目是對繼電器和開關電路的符號分析,基本建立了實用的數字電路設計。

(3)繼電器計算機

最早使用繼電器製造計算機的是貝爾實驗室的喬治·斯蒂比茲(George Stibitz),1937年,他製作出了一個可完成兩位數加法的模型,被稱為Model-K。

其實,Model-K只是一個繼電器計算器的演示品,還很簡陋。

在上級的支持下,1940年初,繼電器計算器M-1成功運行,它使用了440個繼電器,可以解決當時貝爾實驗室做電學研究中面對的大量複數的加減乘除四則運算問題。

它開創了一個時代,這就是數字計算機時代,使用二進制來運算,而之前的計算機械大都是基於常用的十進制數的。

下圖就是一臺繼電器計算機。

從晶體管聊起,說說計算機為什麼採用二進制

1.3.二進制思想在現代計算機上的實現

(1)第一臺電腦

1946年誕生了第一臺現代電子計算機ENIAC,ENIAC程序和計算是分開的,也就意味著你需要手動輸入程序。

這種程序的輸入需要藉助手工插接線的方式進行的,沒有存儲器且它用佈線接板進行控制,運算速度可想而知。而且ENIAC使用的是十進制計算,並不是二進制。

這個時候一位美籍匈牙利數學家——馮·諾伊曼,登場了。

從晶體管聊起,說說計算機為什麼採用二進制

(2)馮·諾依曼的設想

1945年,馮·諾依曼和他的研製小組在共同討論的基礎上發表了一個全新的“存儲程序通用電子計算機方案”——EDVAC(Electronic Discrete Variable Automatic Computer),這是一份長達101頁的總結報告。

報告廣泛而具體地介紹了製造電子計算機和程序設計的新思想。

EDVAC方案明確奠定了新機器由五個部分組成,包括:運算器、邏輯控制裝置、存儲器、輸入和輸出設備,並描述了這五部分的職能和相互關係。

報告中,馮·諾依曼對EDVAC中的兩大設計思想作了進一步的論證,為計算機的設計樹立了一座里程碑。

設計思想之一是二進制,他根據電子元件雙穩工作的特點,建議在電子計算機中採用二進制。報告提到了二進制的優點,並預言,二進制的採用將大大簡化機器的邏輯線路。

(3)馮·諾依曼的實現

1952 年由計算機之父馮·諾依曼設計的電子計算機EDVAC問世。

與它的前任ENIAC不同,EDVAC採用二進制,而且是一臺馮·諾依曼結構的計算機。馮·諾依曼的設想在這臺計算機上得到了圓滿的體現。

EDVAC是第一臺現代意義的通用計算機。它由五個基本部分組成:運算器CA;控制器CC;存儲器M;輸入裝置I;輸出裝置O。

這種體系結構一直延續至今,現在使用的計算機,其基本工作原理仍然是存儲程序和程序控制,所以現在一般計算機被稱為馮·諾依曼結構計算機。

1.4.二進制運算的好處

(1)二進制狀態實現簡單,可以使用元件開關特性、電壓高低特性。廣泛來說,只要一個事物具有兩種對立狀態都可以作為二進制思想的實現。

比如前段時間去世的張首晟教授,他的研究方向之一就是電子自旋,利用電子自旋的兩個方向也可以實現二進制思想;

(2)可靠性、穩定性高,只有兩個狀態,所以抗干擾性強;

(3)運算規則簡單,簡化設計;

(4)通用性強。

2.從晶體管到“1+1=2”

我們都知道一臺計算機的核心就是處理器(CPU),它的職責之一就是運算。

而CPU是一塊超大規模的集成電路,所以我們要想弄清楚計算機的運算機制就要明白集成電路是如何具有運算能力的,而集成電路是由大量晶體管等電子元件封裝而成的,所以探究計算機的計算能力就可以從晶體管的功能入手。

2.1.晶體管如何表示0和1

從第一臺計算機到EDVAC,這些計算機使用的都是電子管和二極管等元件,利用這些元件的開關特性實現二進制的計算。

然而電子管元件有許多明顯的缺點。例如,在運行時產生的熱量太多,可靠性較差,運算速度不快,價格昂貴,體積龐大,這些都使計算機發展受到限制。

於是,晶體管開始被用來作計算機的元件。

晶體管利用電訊號來控制自身的開合,而且開關速度可以非常快,實驗室中的切換速度可達100GHz以上。

使用了晶體管以後,電子線路的結構大大改觀,進入了晶體管為代表的第二代電子計算機時代。

1947年貝爾實驗室的肖克利等人發明了晶體管,又叫做三極管。下面是晶體管的產品照片。

從晶體管聊起,說說計算機為什麼採用二進制

需要說明的是,晶體管有很多種類型,每種類型又分為N型和P型,下面圖中的電路符號就是一個N型晶體管。

從晶體管聊起,說說計算機為什麼採用二進制

晶體管電路有導通和截止兩種狀態,這兩種狀態就可以作為“二進制”的基礎。

從模電角度來說晶體管還有放大狀態,但是我們此處考慮的是晶體管應用於數字電路,只要求它作為開關電路,即能夠導通和截止就可以了。

如上圖所示,當b處電壓e處電壓時,晶體管中c極和e極截止。

這只是一個簡化說明,實際上從模電角度分析,導通和截止的要求是兩個PN節正向偏置和反向偏置,還要考慮c極電壓。

但在實際的數字電路中e極電壓和c極電壓一般恆定,要麼由電源提供、要麼接地,所以我們可以簡單記為“晶體管電路的通斷就是由b極電壓與恆定的e極電壓比較高低決定”。

換句話說,這個三極管的b極電壓相對e極為低電平時三極管就會導通,相對e極為高電平時三極管就會截止。

從這裡可以看出,晶體管的導通與截止這兩種狀態對外可以使用b極電壓的相對高低來表示,進而說明了我們可以使用高電平或者低電平狀態來表示二進制。

也就是說b極是一個輸入量(自變量),可以作為變量存儲兩個數值:高電平或低電平,相應的輸出值(因變量)就是電路實際的變化:導通或截止。

就上面這個N型晶體管而言,高電平截止,低電平導通。

那麼假如此時我們把高電平作為“1”,低電平作為“0”。那麼b極輸入1,就會導致電路截止,如果這個電路是控制計算機開關機的,那麼就會把計算機關閉。這就是機器語言的原理。

我們編程語言的本質就是在編寫一大堆高低電平信號。那麼如何輸入1呢?要知道計算機剛誕生時是沒有鍵盤的,這時就要引入“打孔紙帶”這一老物件了,這個東西會在下面細說。

回到晶體管上,實際用於計算機和移動設備上的晶體管大多是MOSFET(金屬-氧化物半導體場效應晶體管)。

它也分為N型和P型,NMOS就是指N型MOSFET,PMOS指的是P型MOSFET。注意,MOS中的柵極Gate可以類比為晶體管中的b極,由它的電壓來控制整個MOS管的導通和截止狀態。

NMOS電路符號如下圖:

從晶體管聊起,說說計算機為什麼採用二進制

PMOS電路符號如下圖:

從晶體管聊起,說說計算機為什麼採用二進制

NMOS在柵極高電平的情況下導通,低電平的情況下截止。所以NMOS的高電平表示“1”,低電平表示“0”;PMOS相反,即低電平為“1”,高電平為“0”。

到了這個時候,你應該明白“1”和“0”只是兩個電信號,具體來說是兩個電壓值,這兩個電壓可以控制電路的通斷。

2.2.從晶體管到門電路

一個MOS只有一個柵極,即只有一個輸入,輸出雖然是高低電壓信號,即“1”或“0”,但是作用只是簡單的電路導通、截止功能,無法完成計算任務,此時就要引入門電路了。

小提示,電壓、電平、電信號在本文中是一回事。

門電路是數字電路中最基本的邏輯單元。它可以使輸出信號與輸入信號之間產生一定的邏輯關係。

門電路是由若干二極管、晶體管和其它電子元件組成的,用以實現基本邏輯運算和複合邏輯運算的單元電路。這裡只介紹最基礎的門電路——與門、或門、非門、異或門。

(1)與門

與門電路是指只有在一件事情的所有條件都具備時,事情才會發生。下面是由MOS管組成的電路圖。A和B作為輸入,Q作為輸出。

例如A輸入低電平、B輸入高電平,那麼Q就會輸出低電平,轉換為二進制就是A輸入0、B輸入1,那麼Q就會輸出0。

對應的Java語言運算表達式為0&&1=0。

從晶體管聊起,說說計算機為什麼採用二進制

(2)或門

或門電路是指只要有一個或一個以上條件滿足時,事情就會發生。下面是由MOS管組成的電路圖。A和B作為輸入,Q作為輸出。

例如A輸入低電平、B輸入高電平,那麼Q就會輸出高電平,轉化為二進制就是A輸入0、B輸出1,那麼Q就會輸出1。

對應的Java語言運算表達式為0||1=1。

從晶體管聊起,說說計算機為什麼採用二進制

(3)非門

非門電路又叫“否”運算,也稱求“反”運算,因此非門電路又稱為反相器。下面是由MOS管組成的電路圖。非門只有一個輸入A,Q作為輸出。

例如A輸入低電平,那麼Q就會輸出高電平,轉換為二進制就是A輸入0,那麼Q就會輸出1;反之A輸入1,Q就會得到0。

對應的Java語言運算表達式為!0=1;!1=0。

從晶體管聊起,說說計算機為什麼採用二進制

(4)異或門

異或門電路是判斷兩個輸入是否相同,“異或”代表不同則結果為真。即兩個輸入電平不同時得到高電平,如果輸入電平相同,則得到低電平。

下面是由MOS管組成的電路圖。A和B作為輸入,Out作為輸出。

例如A輸入低電平、B輸入高電平,那麼Out輸出高電平,轉換為二進制就是A輸入0,B輸出1,那麼Out就會輸出1。

對應的Java語言運算表達式為0^1=1。

從晶體管聊起,說說計算機為什麼採用二進制

2.3.從門電路到半加器

通過門電路,我們可以進行Java語言中邏輯運算了,但是加減乘除等算數運算仍然無法完成,這時需要更復雜的電路單元了。

由基本門電路組成的各種邏輯單元電路登場,假如我們要實現一個最簡單的加法運算,計算二進制數1+1 等於幾。

我們這時候可以使用半加器實現。

半加器和全加器是算術運算電路中的基本單元,它們是完成1位二進制相加的一種組合邏輯電路,這裡的1位就是我們經常說的“1byte=8bit”裡的1bit,即如果我們想完成8位二進制的運算就需要8個全加器

半加器這種加法沒有考慮低位來的進位,所以稱為半加。

下圖就是一個半加器電路圖。

從晶體管聊起,說說計算機為什麼採用二進制

半加器由與門和異或門電路組成,“=1”所在方框是異或門電路符號,“&”所在方框是與門電路符號。

這裡面A和B作為輸入端,因為沒有考慮低位來的進位,所以輸入端A和B分別代表兩個加數。輸出端是S和C0,S是結果,C0是進位。

比如當A=1,B=0的時候,進位C0=0,S=1,即1+0=1。

當A=1,B=1的時候,進位C0=1,S=0,即1+1=10。這個10就是二進制,換成十進制就是用2來表示了,即1+1=2。

到了這裡,你應該明白了晶體管怎麼計算1+1=2了吧。

然後我們利用這些,再組成全加器。下面是一個全加器電路圖,同樣只支持1bit計算。

Ai和Bi是兩個加數,Ci-1是低位進位數,Si是結果,Ci是高位進位數。

從晶體管聊起,說說計算機為什麼採用二進制

如果我們將4個加法器連接到一起就可以計算4位二進制,比如計算2+3,那麼4位二進制就是0010+0011,下表就是利用加法器計算的值。

從晶體管聊起,說說計算機為什麼採用二進制

和普通加法一樣,從低位開始計算。加數A代表0010,B代表0011。

結果Si:0101,就是十進制5,加法器實現了十進制運算2+3=5。

到這裡,本文的核心內容基本說完了。

回憶一下:單一的晶體管只能控制電路通斷;

多個晶體管組成基本的門電路可以做到輸入電信號、輸出亦為電信號的基本單元,完成基本邏輯運算;

各種門電路組合成一個叫做“加法器”的單元就可以完成加法運算,此時的的這一個單元就是計算機裡面說的1bit。

如果想計算8位二進制加法,如00010101+01001010就要將8個這樣單元電路連接在一起,當然這需要數電方面的知識。

說句題外話,這一小節我們的主題是計算加法,這裡面的加法器使用的是門電路實現的。

實際上,計算機運算部件核心就是加法器,加法器使用補碼就能計算減法,左移累加就是乘法,右移累減就是除法。

除此之外,門電路可以構造出運算部件,也可以構造出具有存儲功能的部件和控制電路,比如CPU的構成就是由運算器、控制器和寄存器組組成,其中寄存器就是由觸發器和門電路構成的。

有了這些功能部件、存儲部件、控制部件,就可以構造出一臺簡單的計算機模型了。

3.完成一次真正的計算

通過上面的敘述,大家應該明白了01010101這一串數字無非就是高低電平信號,邏輯電路可以把這堆電信號轉換成另一堆電信號,那麼01010101是怎麼來的,這些二進制數字又是如何轉換為電信號呢?輸出的電信號又以什麼方式讓人類能夠讀懂呢?

繼續聽我嘮叨。

3.1.穿孔紙帶

穿孔紙帶是早期計算機的輸入和輸出設備,它將程序和數據轉換二進制數碼:帶孔為1,無孔為0,經過光電掃描輸入電腦。

光電掃描利用光敏電阻感光特性的自然可以做到將數字轉換為電信號,比如紙帶有孔的地方透光,那麼光敏電阻的阻值就小,進而可以得到高電壓信號,反之沒有孔的地方得到低電壓信號。

下面這張圖是穿孔紙帶轉化為電信號的一種古老方式,可以讓我們更容易理解電腦讀取輸入的方式。

從晶體管聊起,說說計算機為什麼採用二進制

這種方式是利用電流的通斷來識別數據,對應著這個穿孔紙帶上的每個數據孔位的上面都有著一根金屬針,下面有著容器,容器裝著水銀。

按下壓板時,卡片有孔的地方,針可以通過,與水銀接觸,電路接通,沒孔的地方,針就被擋住。這也是一種01信號轉換為電信號的方式。

下面是一張穿孔紙帶照片,這是我國六七十年代還在使用的輸入方式。

從晶體管聊起,說說計算機為什麼採用二進制

輸入已經理解,輸出就不用多說了,輸出的高低電壓通過機械裝置可以直接打印出輸出結果,比如穿孔紙帶。除此之外,輸出的電信號也可以連接上其它儀器、電路,如示波器等。

3.2.演練一番

在這裡我們清理一下思路:

(1)提出需求:項目中需要計算一下1234567*7654321-987654

(2)十進制轉化為二進制,製作穿孔紙帶

(3)將穿孔紙帶放入計算機,計算機讀取數據

(4)計算機一邊讀取“01”數據,一邊將“01”轉換為低電壓和高電壓。

這裡說明兩點。第一點:低電壓和高電壓並不是一個具體固定的值。如果計算機輸入電壓範圍為0到10V,以5V作為分界線,那麼0~5V內任意電壓值都是低電壓,5V~10V內任意電壓都是高電壓。

第二點:進程的引入。計算機運算速度非常快,但是因為需要人為製作穿孔紙帶、計算機讀取紙帶速度也很慢,所以剛開始的時候計算機兩次計算之間會留下很長時間。

為了不浪費這些計算資源,科學家就引入了“進程”的概念,這樣就可以一次性輸入多次計算任務,開啟計算機後,計算機依次執行相應進程不會有空閒時間。

(5)數據電信號(輸入電平)在指令電信號的控制下在電路中進行轉換,最後得到一批高低電壓(輸出電平)。

(6)輸出,高低電壓信號可以通過打印設備打印出結果。

3.3.編程語言的本質

機器語言就是高低電平不同序列的排列,我們編寫的機器語言就是高低電平(0和1)不同序列的排列、不同順序的輸入,經過電腦處理後輸出的也是不同序列的高低電平的排列。

只是我們通過電路轉換,將這些不同序列的高低電平轉換成不同旋律音高的聲音或明暗色彩不同位置的圖像輸出,進而得到我們能夠直觀理解的信息。

同理,我們的高級編程語言也是這樣,只不過人類可讀的文本代碼需要藉助編譯器才會生成相應的二進制代碼,最後在本機上運行。

一句話,代碼就是高低電平的抽象,點擊運行後,代碼所代表的高低電平組合就會在各種電路中運作了。


分享到:


相關文章: