為什麼計算機能讀懂 1 和 0 ?

從小到大,我們被告知的都是,計算機只能讀懂1和0,但我好奇的是為什麼計算機它就能夠讀懂1和0呢,它是怎麼讀懂的?
白熾燈也能讀懂1和0,讀1就亮,讀0就滅,計算機比白熾燈更聰明嗎?
計算機讀懂後,又是怎樣進行工作的呢?嗯...我想問的就是,最最基本原始的那個工作原理


這個問題從高中就開始疑惑,計算機究竟是如何理解人類思維,如何進行計算?
我很想知道最最基本的工作原理,但是大學裡好多課程,數字邏輯,計算機組成原理,只是從不同層次上解釋了計算機的工作原理,很可惜的是,我並沒有把知識穿起來。看了很多人的回答,大家也只是解釋了一部分問題,沒有完整的把計算機整個的抽象層次說清楚。在大學裡我看到了 Charles Petzold的《編碼 隱匿在計算機軟硬體背後的語言》,這部永不退色的計算機經典著作,為了講明白了這件事兒,今天我決定用自己簡略的話,回顧一下作者寫作的思路,用我的理解為大家講述計算機的工作原理。希望我能夠完成。

今天的計算機已經變得相當複雜,是有史以來人類創造的最複雜最精密的儀器,沒有之一,是二十世紀技術領域的「登峰造極之作」,計算機與生俱來的層次化體系結構,掩蓋了技術背後最本質的東西,現在已經很少有人去關心計算機最本質的工作原理,我希望能剖析計算機一層層『「抽象」面紗,展現最本質的「計算」過程。基本的知識基礎是高中物理,高中數學。


第一節 計算器

下面回到高中課堂,我依稀記得在電磁學那一部分,講到了電磁繼電器,當時老師說,繼電器是很重要的發明,我打開物理課本,「什麼破東西嘛」,太簡單了,那時候覺得像繼電器這樣的發明沒什麼用。高中數學中也講到,布爾代數,簡單老說就是,與、或、非,而且教科書上說,布爾代數意義重大云云。下面問題來了,我只用繼電器能不是實現簡單的計算器?注意是「計算器」,而不是計算機,答案是肯定的,來,那就看看,如何用繼電器打造出一個」計算器「,進而打造出一台」計算機「

兩個繼電器串聯,點亮一盞燈,這算不算實現了「與」的操作呢?兩「真」為」真「

兩個繼電器並聯,點亮一盞燈,是不是實現了」或「的操作?一真為真

一個繼電器本身就可以實現」非「的操作

這樣一來,物理上的繼電器,和布爾代數,完美的融合起來,我把與或非門繼電器實現稱作」物理層「,每張圖右邊的符號表示,稱作」布爾邏輯層「,從」物理層「到」布爾邏輯層「是我們的第一層抽象,很簡單吧?(當然現代計算器從物理實現到邏輯實現,已經不再使用繼電器,而是在硅晶元上雕刻一個個的晶體管,但晶體管的數量絕對不會減少,這一點@丁旭 已經說得很明白)

接下來可能有人問,你整這些小兒科的東西,有什麼用呢?別急,看我慢慢展開!

我們知道,布爾代數是一種數學,既然是在一種數學,那麼存在數學運算啊,數學運算能用繼電器實現嗎,of course

一個或門,一個與非門,一個與門,按照圖示連在一起形成了一個最常見的運算,異或運算,」相同為假,不同為真「,那物理實現上怎麼做呢?請在大腦中想想怎麼連線,一共七個繼電器就可以實現,有了異或運算,我們就可以實現更複雜的運算,下面就和我們實現一台」計算器「直接相關了

一個異或門和一個與門,形成一個」半加器「,圖示下邊的符號表示一個半加器,這裡是新一層的抽象,從布爾邏輯運算到」計算器件「的抽象

有一個半加器,距離我們實現手工打造一個」計算機「還很遠,然而兩個半加器,一個或門,可以實現一個」全加器「,為什麼叫全加器呢?因為我們使用它可以實現一位加法的計算!(這裡是二進位,問題的題目,為什麼計算機能讀懂」0「和」1「,看到這裡是不是心頭一喜呢?)

有了一位」全加器「,我們實現8位加法的計算還遠嗎?當然不遠,8個全加器,按圖示相連,就可以實現8位加法計算(和我們在紙上進行加法運算很像,進位的操作很顯然。當然,這裡都是進行二進位加法),右下方是8位加法器的表示方式。

要是這會兒在19世紀,在電力革命的年代,我一定要親手打造一個計算器!

畫的比較簡陋,見過卡車上的按鈕嗎?上下撥動的那種,這是我穿越回19世紀站在專利局門口,闡述我」偉大」的發明,「我發明的計算器,有兩排輸入按鈕,每個按鈕上下撥動表示輸入的是0或者1,最下排是9個燈泡,燈泡的亮與滅,指示這一位是0,還是1,我的發明是劃時代的,可以把人類從繁雜的計算過程中解救出來...」

「什麼?就因為我的計算器不能實現減法運算兒拒絕我的專利申請,減法運算?減法運算,怎樣實現計算機的減法運算呢?」

計算機發展過程中,最重要的思想是「抽象」,一層層的抽象封裝了實現的細節,使的計算機開發人員更關注與邏輯的實現,相信有了我上面的表述,讀者應該能看懂下邊的抽象思想:

這個電路實現了把輸入的數據取反(0-&>1,1-&>0)

這是求補器的「抽象」

減法的邏輯實現我直接給出,相信讀者也應該能看明白

我還清楚的記得,在計算機組成這門課上,老師講述,原碼和補碼概念,「在計算機內部,正數的補碼是它本身,負數的補碼,記得取反加1「,為什麼取反加1呢?看看上邊的實現,計算機內部如何實現減法?有個取反操作,還有個進位操作,這不正是」取反加1「嗎?

下面從邏輯實現層,回到物理層,思考下,需要多少繼電器才能實現這樣的 」小發明「,算了,嚇一跳吧?然而我們的計算機先驅康拉德·楚澤花費了十年心學,3000多個繼電器才早出一個計算機原型,所以,,,本著向先哲致敬的精神,讓我們在大腦中」打造出「一台計算機

」我的專利不僅僅能實現加法操作,也能實現減法操作,計算具有普遍性,具有劃時代的意義,可以把人類從複雜的計算中解救而出來...「

至此,我們實現了一個簡單的計算器實現,不難吧?然而這才只是萬里長征的第一步。

接下來我來說說,計算機是如何存儲信息的,這真是個費力活兒,在不太遙遠的過去,二十年前,計算機的存儲量還非常有限,我記得初中那會兒還沒有MP3,用磁帶聽歌,直到最近,存儲技術才有了長足的進步,當然這是後話。

第二節,計數器

人類的感官,聽覺,觸覺,味覺,視覺,感官器官接受外界的刺激,在大腦中留下神經信號,進而形成對「外部世界」的認識,那抽象的事物怎麼去認識呢?

電燈通電點亮燈泡,高中的物理知識解釋,足夠了。電可以讓物體運動,這個道理人人都懂。坐在回家的高鐵上,讓我想想一下高速列車是如何運動的:駕駛員按下通電按鈕,帶動電車引擎,電車引擎通過傳動裝置把牽引力傳給電車車輪,列車得以啟動。高速列車的動力系統也相當複雜,我不了解每一個實現的細節,但是我可以想想出電車引擎的工作原理,為什麼?因為這些都是實實在在的實物,看得見摸得著。那我想想出計算機的工作原理嗎?答案是不能,為什麼?因為計算機一層層的「抽象」,一個小小的物理器件上集成了上億的基本元器件,使計算機真正的工作原理是我們越來越遙遠。

下面還讓我們回到19世紀末,二十世紀初,那個激蕩人心的電力革命的年代,讓我們去還原真實的技術實現過程。回到高中物理課堂

我們已經講解了如何去製造一個一台簡易的「計算器」,不知不覺下課了,這時我聽到一陣刺耳的下課鈴聲。電鈴和計算機有關係嗎?我直接上圖吧


注意看旁邊的那個金屬小鎚子

電鈴的工作原理如上圖所示,大家想像下,電鈴的小鎚子震蕩起來敲打金屬蓋發出聲音的情形,duang,duang,daung,形象吧?(這種電路叫做震蕩器)

振蕩器是不是可以實現計數功能呢?交替的輸出0和1,哈哈,感嘆造物的神奇吧!

下面我們再來看一些神奇的電路,當初的先驅們是怎麼想到這些複雜而精緻的設計

閉上上方的電路,燈亮了

斷開上方的電路,燈依然在亮

閉合下方電路,燈滅了

斷開下方的電路,燈依然不亮

電路的奇特之處在於:同樣是在開關都斷開的狀態下,燈泡有時候亮,有時候不亮,當開關都斷開時,電路有兩個穩定狀態,這類電路叫做「 觸發器」。(英國物理學家1918在工作中發現的)

觸發器電路可以保持信息,確切的說,可以「記憶」某些信息,他可以「記憶」那個開關先閉合。觸發器是一個大家族,大家要是有興趣可以去看相關資料。請記住一點!觸發器是用來「記憶」信息的,我再給出兩類常用的觸發器

這個叫做「D型觸發器」,具體實現如上圖,我們的表示一直都停留在很「底層」,一直都很關注實現的細節,隨著細節實現越來越多,我們需要上升到高一層的層次,更加關注功能的實現,而不是陷於細節實現的泥潭!(想一想,為什麼說,計算機具有與生俱來的層次結構)

數據端簡寫為D,時鐘端簡寫為Clk,功能表如下:

腦袋裡想像下,觸發器是一個很聽話的孩子,當clk端通電時,相當於告訴孩子,「孩子啊,你要記住我傳給的信息」,clk斷電時,孩子在自由自在的玩耍,完全不接受任何傳過來的指令,很形象,不是嗎?

在D型觸發器的基礎上實現了更複雜的功能,「 邊緣觸發的D型觸發器」

「抽象」圖

again,抽象的思想,使我們脫離的細節實現(上圖),更加關注功能

向上的箭頭,表示電信號從0到1變化的那一瞬間有效,再次在腦袋裡想像下,觸發器是一個很聽話的孩子,當clk從0-&>1變化時,相當於告訴孩子,「孩子啊,趕緊接住我給你的球,球在這裡指信息」,其他狀態下,孩子在自由自在的玩耍,完全不接受任何傳過來的指令。

有人問,說了這麼多,到底想幹什麼?好的,告訴你,用這些可以實現一個計數器,記得小孩子學數數嗎?我們要做的的就是要用機器來從0開始數數,真的嗎?恩,離這一步已經很近了,不信看下邊


簡單的,把振蕩器和觸發器相連


電平信號的變化

稍微擴展一下,實現更複雜的功能,應該能看明白吧

電平信號的變化(標上0和1)

嗨嗨,清醒下,我們得到了什麼?把上圖順時針旋轉90度,你發現了嗎

這不就是在計數嗎?用二進位的方式計數!

把8個觸發器連接在一起,然後放入一個盒子里,構成了一個8位計數器,能從0數數到2^8-1,(0-255),這個計數器稱為「8位行波計數器」

現在,我們已經懂得如何繼電器來做加法、減法、計數了,這一件很有成就感的事兒,使用的技術也是100多年前就存在的技術。

第三節 存儲器

我想用繼電器打造一個存儲量為64K x 8的存儲陣列,我能實現嗎?這會兒可是在二十世紀初!如果我穿越回那個年代,一定會再次為我的「發明」申請專利,如果真是這樣,那計算機的發展史上會留下我的名字(呵呵,意淫一下),下面就看看我是如何實現我的「發明」吧

上節,我已經提到,觸發器可以「記憶」1位的信息

就是上圖這個樣子,我們把它抽象成:

我們把上圖稱作「1位鎖存器」,想一想,兩個輸入線和一個輸出線都是什麼意思,我上節已經解釋過,來、來、來,想一想那個淘氣的小朋友。

有了「1」,那麼距離「100000」還會遠嗎?無非就是如何組織n個「1」,「抽象」的量級提升的過程

這是8位鎖存器

簡寫成這種形式

再來看兩個神奇的發明,或許你也會為發明者神奇的構思所折服

我想製作出這麼一個元器件,他要實現這些功能。想想一下,某一天,你成了一個名人,每天前來拜訪的人絡繹不絕,今天呢,來了八個人,但是你時間有限,只能見一個人,那就讓5號來吧(把拜訪者編號,0-7),5號拜訪者帶來了自己的禮物(0或者1的信息)。看圖,左邊的三根線表示拜訪者的地址(當然是二進位編碼),000,001,010,011,100,101,110,111,5號就是101,這時候呢,我只需要把S0和S2通電,那麼5號拜訪者就進來了,獻上自己的禮物(1位的信息)。

怎麼實現這個功能呢?有興趣的自己去研究下面實現,請記住,我們現在討論的內容抽象的層次已經不是最最底層的實現了,而是更加關注於邏輯器件實現的功能

這叫「8-1選擇器」

反過來,我有一封信需要送出去,這封信的內容是0或者1,現在我也有8個快遞小哥可以選擇,編號分別是000,001,010,011,100,101,110,111,我讓誰去給我送信呢?那就還是5號吧,於是我把地址分別設置為101,5號小哥就去給我送信了,給出具體實現,有興趣的自己去看吧

這個電路名兒叫做「3-8解碼器」

有了8-1選擇器和3-8解碼器,就可以製作出一個8位存儲器了

again,把複雜的電路實現,抽象成簡單的符號表示

讀/寫存儲器,通常叫做隨機訪問存儲器或者叫RAM,RAM可存儲8個單獨的1位數據

如何得到16 X 1的RAM呢?相信大家都能想到,用2個 8 X 1的RAM,我彷彿回到了《計算機組成》的課堂,讓我再來做一次作業吧

簡寫如下:

這種方式或許正確,但是使用了三根地址線,兩根數據線,能不能使用4根地址線1根數據線呢?

加一個2-1選擇器不就行了嗎?(設計一個2-1選擇器,這會兒應該不算什麼難事兒)

再次用符號簡寫:


回到我們的出發點,怎麼得到64K X 8的存儲陣列呢?

無非就是努力提高8位鎖存器的集成程度嘛,我可以想像,讀者看到這裡,腦子裡全是密密麻麻的的連線,或許你還一時想像不到連線的方式,但是看到這裡,64K X 8的存儲陣列一定能用某種方式實現,對吧?雖然沒有實現其電路圖,但我也可以說,我理解了存儲器工作原理,(你懂了嗎?)。

1024 X 8RAM的符號表示,2的16次方,即64K,地址線有16根,數據線有8根

為了申請我的專利,我需要做出一個機器的外部殼子,和第一節中的「計算器」一樣,把這個機器的殼子把我所有實現的過程封裝起來,形成一個「黑盒」,只保留幾個外部的介面(也就是那幾根數據線,一定要記得他們的功能),我要做成的外部盒子是這個樣子

上一排的對應16根數據線,下一排有8根數據線,這個不用解釋,相信把上文看完的都能明白什麼意思,takeover這個按鈕表示是否使得當前控制面板處於「激活狀態」,也就是說,這個開關的作用是確定由控制面板還是又外部所連接的其他電路(從來沒說過,沒有連接外部其他電路,或者想像下,我這個機器殼子外面有一排的針孔,外部電路可以接進去,想想電腦機箱後邊的針孔,就是這個意思,Soga)來控制。如果有其他電路相連。這時候takeover為 0(圖示狀態),此時存儲器由其他電路接管,控制面板上的其他開關不起作用,當takeover為1 時,控制面板將重新獲得對存儲器的控制能力。

最後還是給出電路實現

想一下,機器殼子後面的針孔連那裡,控制面板的開關又連接哪裡?

簡化的圖示,是不是又用到「抽象」的思想呢?

一個辛辛苦苦裝滿65,536位元組(8位為一個位元組,位元組編碼請去參考ASCII編碼)珍貴數據的64K X 8的RAM陣列,如果斷電,會發生什麼事情?首先電磁鐵會因為失去電流失去磁性,隨著「梆」的一聲,金屬片講彈回原位,RAM中的所有數據將如風中殘燭一般消失在黑暗之中,所以,RAM也成為「易失性」存儲器。

那我一手打造的64K X 8的存儲陣列,需要多少繼電器呢?答案是是500W左右,是不是驚訝到恐怖呢?誰會沒事兒造出這麼個恐怖的怪獸?(100年後的今天,用二極體,三極體,集成這麼多元器件的晶元,連指甲蓋的大小都不到,感嘆人類技術的進步吧)。

我穿越回二十世紀初,再次站在專利局的門口,為我這項「偉大的發明」申請專利,瑞士專利局的愛因斯坦會因此嚇尿嗎?世界上最聰明的大腦,能理解「黑箱」背後發生了什麼嗎?

第四節 自動操作

說了這麼多電子線路的知識,我相信的我的講述方式,大家都是能看懂的,前面所寫的,其實只是為大家講述一件事兒,「把電子元器件內部實現展開」,現有的一個個電子元器件,現在就是一個個小工具(把內部實現封裝起來,保留外部介面,外部介面,就是那一根根地址線,數據線,和其他開關)、原材料。那我們現在看一看現在都有那些原材料呢?

計算器:一個會算數的小朋友,每次你把要進行計算的兩個數給他,拍一下小朋友的頭,小朋友幫我算一下吧,他會把計算的結果給你,沒有一點誤差,計算速度很快,並且樂此不疲。

計數器:一個一直在數數的小朋友

存儲器:辛辛苦苦裝滿了64K 位元組的箱子

解碼器:《唐伯虎點秋香》中有個代號,9527,一個數字,你說它什麼意思呢?如果,我「規定」9527指的是唐伯虎,讓解碼器來做這件事,解碼器你把9527給我帶過來(地址線用2進位表示9527,9527的二進位是多少呢?),這時候解碼器「很聽話」的把唐伯虎叫過來。(在這裡,機器「理解了」人類的語言嗎?)

有了這些原材料,我們就可以著手打造一台computer了,我們的工作才剛剛開始,請讀者保持耐心,我們最終要實現的是一台通用計算機,這台「先進的」機器可以使加減法的過程自動化,is that unbelievable?這台機器可以解決所有能有加、減法處理的問題,而事實上現實中的許多問題確實可以用加法與減法來解決。

讓我來回顧一下自己的教育經歷。從咿呀學語之後,幼兒園開始,我們就要開始一生的學習了,小學的數學課現在還叫不叫「算數」?剛開始,我們扳著自己的手指數數「1,2,3,4,5,上山打老虎...」,學會數數之後呢?老師先教我們加法與減法,那麼乘法和除法呢?我依稀記得,是用加法和減法來實現的,對嗎?

加法與減法,可以從底而上,構建更加複雜的算數系統,以至於,微積分也是建立的基本的算數系統之上,我還清楚的記得泰勒公式帶給我的震撼,記得第一次見到牛頓迭代法時的情景。

最美的數學公式之一,不解釋為什麼了,參考大學微積分

假如,假如我們已經實現一台可編程的最原始的執行加減法運算的「計算機」,如何計算出e的值呢?

想明白這一切,就需要我們了解「自動操作」的過程,了解程序的本質什麼?編寫程序的過程就像堆多米諾骨牌,辛辛苦苦,小心翼翼堆了半天,只為了那一下推到骨牌的快感!下面這一部分內容較難,請讀者一定保持耐心,我會試著按我自己的理解講清楚,如果我有理解不對之處,歡迎大家指出來,討論改正

新紀元-能接受「指令」的計算器

有人問我,真的可以用上述提供的那些原材料(計算器、計數器、存儲器、解碼器)造出一個計算機嗎?就像維克多·弗蘭肯斯坦組裝怪物一樣,當一切都已經就緒,看著我們一手打造出的龐大的怪物,小心翼翼的通上電,「醒來吧,孩子」,就像給他賦予生命一般,這些破銅爛鐵奇蹟般的蘇醒過來,按照我給他的指令,完成我想要的工作,真的,人世間沒有比這樣的工作更讓人神往了,你能理解《模擬遊戲》中Turing對克里斯托弗的一往情深嗎?至少他打動了我的心。

扯多了,我可以很明確的告訴你,只用那些原材料確實可以打造出一台計算機,並且歷史上確實有人實現了!是誰?馮諾依曼?圖靈?很遺憾地告訴你,no。主人公的名字,我前邊已經提到了,他叫康拉德·楚澤,1935年還是一個工科學生的他,在位於柏林的家中打造出一個可編程的計算機,一共花了3000多個繼電器。

接下來讓我們穿越回到1935左右,讓我們跟隨「主人公」的思路,嘗試打造出一台「計算機」。

還記得上小學時,你學完數數,學完加減法之後,大人們常常考考你的題目是什麼?「你給我算一下從1一直加到100吧」,問題是,我能用機器代替我來算數嗎?哦哦,簡單,我的原材料里不是有「加法器」了嗎?,稍作修改就行,好,看看我的設計


拿一個8位的加法器和一個8位的鎖存器,按上述方式相連,每次我們可以通過加法器的開關輸入我們要算的數(當然要輸入的數是0-255之間,計算的結果也是0-255之間,在這裡可以先計算1-10的和),我們小心翼翼的撥動開關,最後下方的一排指示燈顯示計算的結果。簡單吧(這個器件稱作累加器)可是我一不小心輸錯了一個數怎麼辦?只有重新來算,完全再來一遍,好麻煩啊,有沒有可以改進的方式呢?我突然想到,不是有存儲器嘛,可不可以把我要計算的數據先存入存儲器,再通過讀取存儲器的內容,把數據傳送到加法器,執行運算,最後顯示結果。

good idea!具體該怎麼做呢,我給出一種實現方案

一個振蕩器(想想duang,duang,duang的電鈴),16位計數器(我們的存儲器容量不是64K X 8么,需要16根地址線),一個64K X 8的RAM(RAM連接控制面板,控制面板可以輸入數據,還記得控制面板的takeover按鈕是做什麼用的么?),一個8位加法器和一個8位鎖存器。

讓我們閉上眼睛,來想一想,這是怎麼工作的。首先,請清零開關,然後閉合控制面板上的takeover按鈕,這時候控制面板接管了存儲器,如果要算的有100個數,我們一次調整存儲器的地址線和數據線,把數據存入0000h-0063h的地址空間(這一部分你明白了嗎,該怎麼操作控制面板呢?上述地址空間用16進位表示)。數據輸入完了,我們斷開控制按鈕(takeover鍵),這時候控制面板失去對存儲器的控制,斷開清零開關,這時候,計數器開始工作,0000h,電信號傳入存儲器的地址線,存儲器呢,是一個忠實的倉庫保管員,來,我看看你要取什麼東西,他接過傳來的地址,哦原來要0000h盒子內的東西啊,好,你拿走吧,(0000h「盒子」內的東西就是剛才輸入的第一個數),第一個數據傳入到加法器,加法器小朋友一看,好了,你和自身相加,這不還是你自己嗎?他把計算結果給了鎖存器,鎖氣器把計算的結果放入一個臨時的盒子內。經過一點時間(很短)計數器變成0001h,還是和剛才一樣,計數器小朋友把自己的數給存儲器管理大叔,大叔根據傳過來的數,把取出的數據傳給加法器小朋友,加法器小朋友執行加法運算,把得到的結果給鎖存器。他們是如此的兢兢業業,樂此不疲,「機械式」的完成自己的任務,沒有一點兒怨言。

哎,計算的結果是什麼?我怎麼看到指示燈在閃爍,計算的結果哪裡去了?哦哦哦,計數器小朋友實在是太敬業了,根本沒有辦法讓他停止工作,當他數到FFFFh之後又從0000h開始數數了。

還有這樣的計算也太機械了,功能也實在是太有限了,要是我想把100個數,分成50組,計算每一組的和,這又該怎麼做到呢?聰明的讀者你也動動腦袋想一想,怎麼做到呢?

楚澤看到這裡也許和咱們一樣皺緊眉頭,怎麼做呢,怎麼做呢?該怎樣解決這個問題呢?這時候或許突然迸發出「革命性」的想法,把運算的結果存回到RAM陣列中不行嗎?這樣一來,就可以在適當的時候用RAM陣列 的控制面板來檢查運算結果(按下takeover),為了實現這個目的,在控制面板上加一排顯示燈。eureka!

改變之後的連線圖

這裡略去了一部分,包括振蕩器和清零開關。這樣做是很好,但是問題來了,怎樣控制RAM寫入信號呢(何時存入RAM,把結果存在什麼位置?)

假如我有一個這樣的計算任務要完成:首先對三個數進行求和,然後對兩個數進行求和,最後再對三個數進行求和,圖示如下

圖中用一小段連續的紙條(標記上連續的格子)表示一小段存儲器,格子內表示存的內容。怎樣使自動加法器為我們完成這項任務呢?我們不能期待向RAM陣列中輸入一組數,然後自動加法器自動完成任務,自動加法器怎樣「理解」我們交給它的任務,它怎麼「知道」我們要他們幹什麼?

為了完成這個任務,我們需要用一些數字代碼來標示加法器需要完成的每一項工作:載入(Load)、相加(Add)、保存(Save)、終止(Halt)

有了上述的指令,我們就可以命令計算器來工作了(暫時不去了解如何實現),對於上述的任務,可以表示如下:
(1)把0000h地址處的內容載入到累加器
(2)把0001h地址處的內容加到累加器
(3)把0002h地址處的內容加到累加器
(4)把累加器中的內容存儲到0003h地址處
(5)把0004h地址處的內容載入到累加器
(6)把0005h地址處的內容加到累加器
(7)把累加器中的內容存儲到0006h地址處
(8)把0007h地址處的內容載入到累加器
(9)把0008h地址處的內容加到累加器
(10)把0009h地址處的內容加到累加器
(11)把累加器中的內容存儲到000Ah地址處
(12)命令自動加法器停止工作

有了這些指令代碼,那麼這些指令代碼存放在哪裡呢?得了,不去想了,簡單粗暴的解決方式就是在加一個RAM,一個RAM存放數據,另一個RAM存放數據對應位置的操作符(也就是上文指定的那些代碼),再次對我們的機器進行改造,改造後的結果如下

觀察要仔細啊,數據的RAM即可以通過Control Panel控制面板進行輸入,也可以接受外部的數據,而存儲代碼RAM只能通過控制面板寫入!

那麼往存儲代碼的RAM里寫入什麼內容吧?機器又不認識load、store、add、halt這些單詞。既然機器不認識,我就讓他們認識!解決方式,就是編碼,其實兩位信息編碼足夠
操作碼,代碼
Load(載入),10h
Store(保存),11h
Add(加法),20h
Halt(停止),FFh

這樣一來,存儲代碼的那個RAM裡邊要存的內容就一目了然了

看到這裡,讀者有疑問嗎?還是我最早提出的那個問題,機器是如何「理解」人類的語言的,我雖然把要操作的指令用0和1進行編碼,但你把編碼之後的內容拿給我們一手打造的這台機器,他還是「不明白」什麼意思,去進行何種操作啊!我們轉來轉去又轉回最初的起點,你讓冷冰冰的機器去「理解」人類的指令,無異於天方夜譚,機器就是機器,永遠也不可能具有思維,當初,我在這裡也是困擾好久,哦,原來如此!

我已經把答案告訴你了,機器就是機器,永遠也不可能具有思維

我不管你有沒有思維,你必須完成我給你的任務,你把上述的任務算個結果出來,這一點兒或許能辦到,嘻嘻


為了體現Load和Add命令,我的機器內部又進行了部分改變,你看出差別來了嗎?

其實上述有一小部分沒有連線。again,閉上眼睛,跟我來想想機器執行的過程,可愛的小朋友們和敬業的大叔們又來了。計數小朋友把數據給兩個RAM的倉庫管理員,一個取出數據,一個取出指令。數據傳給累加器和2-1選擇器(這是個什麼鬼)?數據到了2-1選擇器小朋友的面前,發現了一道門,門上寫著,「此山是我栽,此樹是我開,要想從此過,留下買路財」,小朋友,讓我過去吧,叔叔給你糖吃,2-1選擇器小朋友說,「我只有一條路,你們兩個人,我讓誰通過呢?」(圖中,2-1選擇器接收了兩組數據),就在這時候,2-1選擇器小朋友,收到了一條指令,這條指令來自哪裡呢?哦哦,剛才管代碼的RAM大叔,取出指令(10h或者,11h或者20h或者FFh),他把指令交給「指令解析器」(圖中沒有畫)指令解析器負責把信送給2-1選擇器、RAM、計數器的指令接收端(也就是2-1選擇器的S,RAM的W等,在這裡稱為控制信號,控制信號決定機器中某些部件是否工作或者決定某些期間如何工作。例如,如果代碼RAM陣列輸出是load指令,2-1選擇器S端收到0,如果代碼RAM陣列輸出是Add,2-1選擇器S端收到1,操作碼是指令Store時,數據RAM陣列的W收到1。實現「指令解析器」很困難嗎?想一想第二節中是如何送信的,3-8解碼器,解碼器實現只是一種方式,當然也可以用邏輯門來實現、你明白了嗎?),2-1選擇器小朋友收到了0,也就是要執行Load操作,8位鎖存器把臨時信息保存起來。然後計數器小朋友又開始數到了0001h,這些勤勞的小朋友和勤勞的大叔又繼續工作了...

用這種方式,我終於實現了我的想法,這真是一件值得高興的事兒,我要好好休息下,等等,休息之前,順便擴展一下我們的機器,讓它也能運算減法。好簡單,增加一條指令不就行了?Subtract(減)

相應的,機器內部實現再改造下,增加一個取反器

布置一道作業題,取反器的那根控制信號線接在哪裡?

數據「流水」

我們從繼電器打造出門電路,進而實現加法器,計數器,存儲器,都是為了向我們的那個終極目標一步步前進。這就像點亮科技樹的過程,一步步提高,直到實現我們的終極目標--一台可編程的通用計算機,那現在來看看,我們的科技樹點亮到哪一步了,現在我們親手打造的「能讀懂人類指令的計算器」,離我們的目標還有多遠?

來看看我們這台機器能不能完成我們想要完成的任務。假設現在要把56h和2A相加,然後再從中減去38h,結果是多少呢?不是有指令了嗎?來,設置指令,讓機器去完成


由於指令和數據是分開存儲的,我們分別通過控制面板在RAM中輸入數據,啟動機器,機器就「神奇」的計算出結果,可以用個控制面板來查看計算的結果。

如果我的計算任務擴大一些,算一算1W個數的和吧?啊?10000個數,這時候我可以想像,站在台機器前面的「主人公」滿臉苦逼的表情,我們小心翼翼的輸入這指令,Load ...,Add ...,Add ...,Add ...,......Store ...。然後我們再輸入數據,這真是個體力活兒啊!當我們終於把這一切都完成之後,啟動機器,Come on,baby!計算吧

讓我們再次閉上眼睛,想像機器工作的情形,計數器多麼像一顆跳動的「心臟」,過一段時間發出一次「心跳」,存儲器收到心跳的脈衝,從此中取出數據,數據被傳送到累加器「加工廠」等待處理,要通過一道道的「門」(2-1選擇器),最後會傳到存儲器。每每想到這裡,我不禁想起在歡樂谷水上漂流的過程,穿過一道道門,經過一間間屋子,每經過一道關卡,都可能被水淋到(數據被加工),最後轉了一圈回到起點,機器內部執行的過程,就是數據坐在船上「流水」的過程,不是嗎?

讓我們來看看機器算出來的結果,這可真是一個激動的時刻,辛辛苦苦撥了半天開關,現在要見證奇蹟了。「咦」?怎麼結果不對,這數值也太小了!

哦,原來如此,我的累加器只能算8位的數據,讓我去安靜的哭一會兒去。

你可能想到,把兩個8位的加法器連在一起構成一個16位的設備,這是一種解決方案,但是,還有代價更小的解決辦法。

比如要計算76ABh+232Ch,最終結果是99D7h

我們可以把高低位分開來算

低位加法

高位加法

最後把計算的結果寫回存儲器

D7h被寫入地址0002h處,99h被寫入地址0005h處

這是很理想的狀況,因為,在上述的例子中把高低位分開計算,低位計算恰巧不存在進位的情況。如果要把76ABh和236Ch這兩個16位的數相加該怎麼做?ABh+6Ch=117h;1h+76h+23h=9Ah。計算的結果為9A17h,怎麼解決這個問題呢?可能有讀者已經想到了,加一個進位鎖存器(存儲進位)不就行了?那我再問一句,「那我們的指令碼是不是需要擴展一下呢?怎麼使得解碼器來觸發讀取進位的信號呢?」讀到這裡,讀者也應該和我一樣,我們現在不關心具體實現細節,一定會有某種邏輯門的組合來實現,對吧?下邊我給出擴展的指令碼(也叫作操作碼)

上述指令中,增加了一個「進位加」(Add with Carry)和「借位減」(Subtract with Borrow)有了他們,就可以極大的擴展加法器的功能,而不僅僅局限於8位數據的運算了,可以對16位,24位,32位,40位數進行加、減法操作了!比如對兩個32位數7A892BCDh和65A872FFh進行加法運算。僅僅需要1條Add指令和3條Add with Carry指令

我們通過增加操作碼指令擴展的我們的「計算器」,在通往終極目標的路上又邁出了堅實的一步,「數據流水」的方式也確實也可按照我們的意願實現一些計算任務,但是,對於計算1W個數相加之類的任務,總不能期待一條條的輸入指令吧?

讓我們看看問題出在哪裡。第一,對於上圖來說,保存計算結果的存儲單元地址不連續。第二。當前設計的自動加法器不允許在隨後的計算中重複使用的前面的中間結果,一旦我們把計算的結果寫回存儲器,我們就無法再次讀取它的值了。

產生上述情況的原因就在於,我們構造的自動加法器,代碼的存儲和數據的存儲是同步的、順序的,並且只能從0000h開始順序定址,直至停機。

要解決這個問題,需要對我們設計的加法器做一個根本性且程度極大的改變。我想幾十年前第一代的計算機的設計者康拉德·楚澤,Turing等人一定會為這個問題寢食難安,因為解決了這個問題,才可以實現真正意義上的「自動操作」,這個問題也是計算器計算機最根本的區別。

沒想到會有這麼多人點贊,謝謝你們的鼓勵,我們的萬里長征已經看到勝利的曙光了,馬上就要迎來激動人心的時刻了,請保持最後的耐心。

數據「轉圈圈」
再次看一下我們設計的機器,代碼的存儲和數據的存儲是同步的、順序的,並且只能從0000h開始順序定址(計數器小朋友在一次計數,告訴存儲器管理員大叔從哪個抽屜里取數據),直至停機。但是,如果我的數據是連續存儲的,並且在任意地址保存數據(也就是說,存儲器存放數據的抽屜式隨意的,我們只知道抽屜的編號),該怎樣去取數據進行計算,並且存儲計算結果啊?這時候我突然聽到一聲,「你傻啊,你把要取數和存數的抽屜編號告訴我不就行了?」,管理員大叔一語驚醒夢中人,是啊,有了存儲器的地址不就行了?可以把數據的地址與數據的內容分開存!這可真是石破天驚

那就再次改變我們的設計吧,

這次,我們把指令(代碼和數據的地址稱為一條指令,先得到數據的地址,在根據地址取數據)放在一個RAM中,把數據存在另一個RAM中,並加了3個8位鎖存器(臨時存放8位數據),示意圖只畫出了改變的部分,其餘部分與原來保持一致(累加器和代碼解析器還有相應的控制信號)。指令佔1個位元組,16位的數據地址佔2個位元組,一條指令共佔用3個位元組,每次從RAM中取出1個位元組,所以每次取出一條完整指令需要3次計數,數據地址再次傳給存儲器(這裡多加了一個RAM),RAM取出數據傳給加法器,而代碼的解析與數據傳輸到加法器進行計算操作也需要1次計數,這必然需要更加複雜的控制信號。

從存儲器中取出一條完整指令的過程叫做取指令,機器響應指令碼的一系列操作的過程叫做執行指令,雖然機器可以自動取出指令,並執行指令,你能說它是一種「有生命」的東西嗎?

看到這裡有人可能要問,我們現在不是假設在1935左右嗎?RAM是很奢侈的(500W個繼電器),能不能想法捨棄掉一個RAM?把指令(代碼和數據地址)與數據存在一起就可以了,這簡單,還記得2-1選擇器小朋友嗎?(存儲器部分提到了)

很簡單,得到數據地址之後,把地址回傳給存儲器(此時計數器小朋友的計數無效),再次根據地址取出數據。
來看一個小例子吧,計算45h+A9h-8Eh=?,假設45h,A9h,8Eh分別存在地址0010h,0011h,0012h處,計算的結果存於0013h處。我們應該給機器這樣的指令:
把0010h地址處的位元組裝入累加器,
把0011h地址處的位元組裝入累加器,
從累加器中減去0012h地址處的地址,
把累加器中的內容保存到0013h地址處,
停機,

數據的存儲可以是任意的,我們只需要知道其相應的地址,那麼指令呢?指令還是機械的順序的往下執行,會不會出現這種情況,順序執行指令,可是數據和指令地址衝突(要存指令的地址處已經有了重要的數據,需要跳過),指令能否跳過某一段區域,繼續執行呢?

這涉及到指令定址方式的改變(耐心聽下去,我們萬里長征,最終的一步來了,跨過他,前方就是一馬平川),怎樣跳過某一段兒區域,繼續執行指令呢?那就jump啊,對,擴充一條跳轉指令(Jump)

相應的機器內部實現也要改變

在上一步基礎之上,增加了一條到計數器的數據通路,相當於告訴計數器小朋友,「小朋友,你下次從我告訴你的那個數開始計數,叔叔給你糖吃,乖~」

讓我們回到電子線路中,計數器的實現,振蕩器和D觸發器串聯方式(16個D觸發器),我們稍作修改一下邊緣型觸發的D型觸發器


可以不用了解上圖的實現,請注意我們現在重點不在於具體實現,而在於實現某一功能,我們需要為16位計數器的每一位都設置一個這樣的觸發器。一旦載入了某個特定的值,計數器就開始從該值開始計數(是不是用糖果把計數器小朋友收買了,呵呵)

Jump(跳轉)指令確實很有用,但是一個有條件的跳轉更有用(「我是個有原則的人,除非滿足我的條件才jump」),比如要計算A7h與1Ch(十進位的28)相乘的結果,和28個A7h相加的結果相同,計算過程涉及到大量的重複操作

假設乘數和被乘數以及計算結果保存在一下地址:

1000h:00h,A7h,(16位乘數保存在此處)

1002h:00h,1Ch,(16位被乘數保存在此處)

1004h:00h,00h,(16位乘積保存在這兩個連續的地址空間)

當這六條指令執行完畢之後,存儲器1004h和1005h地址保存的16位數與A7h乘以1的結果相同。還要把這6條指令反覆執行27次才能達到乘法的目的,如果在地址0012h處置放一條Jump指令會怎樣?

這個過程不會停止下來,它會一直反覆執行下去!

我們需要這樣一種Jump指令,它只讓這個過程重複執行所需要的的次數,這種指令就是條件跳轉指令,怎麼實現它呢?我給出一種實現方式,簡單看看就好

這種鎖存器叫零鎖存器,當8位加法器輸出為零時他鎖存的值才是1。有了進位鎖存器和零鎖存器以後,可以為指令表新增4條指令


非零跳轉指令只有在零鎖存器輸出為0時才會跳轉到指定的地址,如果上一步的加法、減法、進位加法或者借位減法運算結果為0時,將不會發生跳轉。只需要在常規的跳轉命令的控制信號之上再加一個控制信號

那麼繼續剛才提出的問題,0012h地址之後的的指令為

Store指令不會影響零標誌位的值,只有Add、Subtract、Add with Carry、Subtract with borrow這些指令才能影響零標誌位的值,當執行到地28次循環時,1004h和1005h地址保存的16位數等於A7和1Ch的乘積。1003h地址保存的值為1,他和FFh相加的結果為0.零標誌位被置位!Jump If Not Zero指令不會再跳轉回到0000h地址處,程序執行完成。

現在可以說,我們這台不斷完善的機器真的可以稱得上是一台真正意義上的computer了!條件跳轉指令將計算器和計算機真正區分開來。

那麼,你現在明白了嗎,為什麼計算機能讀懂0和1?計算機和程序到底是什麼?

數據被附在電流上不斷地轉圈圈(循環的過程),當滿足某一條件之後,得到最終結果。

彙編語言

把上述機器碼錶示成助記符的形式

那麼這個乘法的程序可以寫成這種形式

編碼時最好不使用實際地址,用label來指代存儲器中的地址空間,所以上述程序可以改寫為

終於在春節到來之前寫完了,算是圓了自己的一份小小的心愿。

寫的不好,歡迎大家批評改正。


2015/11/25 更新:

承蒙大家抬愛,這篇一年多前的回答上日報了,為了避免誤導還是註明一下,文章的目的是儘可能以最簡單的語言讓非微電子專業的讀者能對晶元的工作原理有感性的認識,有高中物理和化學知識就能順利讀完,因此許多過程描述進行了簡化、並不專業,也沒有採用太多術語以避免詰屈聱牙之嫌,希望是如果能有一點科普作用那就極好了。

原文:

關於計算機為什麼能讀懂0和1, @蕭井陌 同學的答案中已經回答地相當仔細了,相信有鑽研精神的朋友讀完他的答案,就能在布爾代數原理和基本電路原理上對計算機的0和1有一個感性的認識。唯一有點美中不足的是他沒有在物理層面上解釋電路器件的運作方式,那麼答主就來解釋一下計算機的硬體核心:IC電路在物理層面是如何工作以及是如何製備出來的。

首先還是通過兩個不同層面的基本介紹來總結一下 @蕭井陌 同學的答案。

一、邏輯實現

IC數字電路中,用高電壓(比如3.3V)代表1,低電壓(比如0V)代表0。利用布爾代數的與、或、非基本邏輯,就可以構造出不同的電路,實現複雜的運算。

與邏輯:1與0=0、1與1=1、0與0=0

或邏輯:1或0=1、1或1=1、0或0=0

非邏輯:非1=0、非0=1

比如要實現一個1位的加法器(C=A+B):

1+0=1

1+1=0

0+0=0

因為是1位加法器,我們就不考慮進位了。那麼邏輯的實現就是:

C=(A 與 非B)或(非A 與 B)

這樣在邏輯上一個簡單的加法器就實現了。複雜的IC數字計算電路,就是由幾億個這樣的簡單邏輯構成的。


在這一個層面的總結中,我們了解到,IC晶元的數學原理是布爾代數,這是晶元工作的邏輯基礎。


二、電路實現

以上介紹的只是純邏輯的實現,那麼怎麼在電路上把它實現出來呢?舉個最簡單的例子,非邏輯,我們用一個稱為非門的電路來實現。

以上是一個非門的電路表示。如果Input為高電壓(代表1),Output就是低電壓(代表0),反之亦然。圖中,Vdd表示高電壓,Vss表示低電壓(接地,即為0)。


PMOS可以看做一個用G端電壓控制的開關器件:如果加在G端是高電壓,那麼PMOS可以看做是斷線,如果加在G端的是低電壓,那麼PMOS可以看做是一根導線。NMOS正好相反,如果G端是低電壓,則是斷線,如果G端是高電壓,則是導線。


那麼看這個非門的電路,當Input為高電壓時,PMOS斷線,NMOS導通,Output相當於接地(Vss),那麼Output就是低電壓了;當Input為低電壓時,PMOS導通,NMOS斷線,Output相當於接Vdd,那麼就是高電壓。


這樣我們就在電路層面實現了最基本的門邏輯-非門。與邏輯和或邏輯可以使用相似但稍複雜的電路來實現。IC數字電路歸根結底都是靠這三種電路來實現的。


在這一個層面的總結中,我們了解到,其實計算機的工作原理並沒有想像中那麼「智能」,其實跟用水閘開關控制水流的衝力去推動風車轉動的基本思想是一致的。計算機並不「懂得」0和1,它只是靠我們精妙的組織具有特定特性的物理器件,讓器件發揮自身的物理性質,從而能在電壓上反應出一個計算電路的輸入和輸出。


有了以上總結,我們就可以研究現代IC晶元的基本器件單元:MOS管了。


三、MOS管

從以上介紹中可以看出,數字電路中最重要的器件就是MOS管了,分為PMOS和NMOS。不同於電阻、電感、電容等基礎電子器件,MOS管的導通與否是通過G端的電壓來控制的,那麼就不能使用最基本的電阻器等原件來實現了,需要重新設計一種器件。

以NMOS為例:


以上是一個NMOS的剖面圖。黃色區域為摻雜了正離子的硅,綠色區域為摻雜了負離子的硅。上面的三塊灰色區域為源(Source)、柵(Gate)、漏(Drain)的電極,分別對應了非門電路中NMOS連接Vss、Input(G)、Output的三個電極。從以上非門的介紹中可以了解到,我們使用NMOS,是希望通過控制Gate的電壓,來控制從Source到Drain能否導通。


如圖所示,現在紅色虛線勾勒出的區域,從左到右形成了一個N-P-N的結構,表示摻雜了負離子的硅-摻雜了正離子的硅-摻雜了負離子的硅。因為正負離子的同性相斥、異性相吸的特徵,在P、N的交界處,會形成一段「耗盡層」,其中是沒有電子的(都被同性相斥、異性相吸到其他區域去了),那麼如果Gate上不加電壓的話(電壓為0),從Source是Drain是不能導通的,對應了以上電路分析時的斷線情況。如果Gate上加上合適的電壓,那麼情況就不一樣了,因為電壓為正,那麼會吸引下方紅色虛線勾勒區域內的負離子到Gate的下方來(電容器原理),從而在Gate下方形成了一段有負離子(N-type)的區域,也就是說原來的摻雜了正離子的硅在Gate下方的一小段區域發生了翻轉變成了摻雜了負離子的硅,這樣就將Source和Drain連接了起來。因為Source和Drain本身也是連接著負離子區域,這段區域就相當於一條導線,那麼從Source到Drain就導通了。這就是NMOS能通過Gate控制導通能力的原理。PMOS原理類似,只不過摻雜的離子極性和NMOS剛好是相反的。


由以上介紹我們知道,控制晶元電路中的「水閘」其實是一個運用電子的基本物理特性工作的人造器件。在現代電路中,這樣的器件尺寸是非常小的,基本在100nm級別(也就是說人的頭髮絲的截面可以放得下幾百個這樣的MOS器件)。那麼這麼小的器件,人類是怎麼製造出來的呢?


四、物理實現


了解了MOS管的功能和它的結構後,就可以繼續了解CMOS工藝了。CMOS工藝的目的就是在硅晶圓上通過多道工序,建造Source、Gate、Drain結構,實現NMOS和PMOS管,從而構造出與或非門,構建出更複雜的邏輯。硅晶圓其實就是從沙子中提取出來的硅單質,我們把它製作成薄片,在表面同時製備成千上萬個MOS器件,形成IC晶元。


首先介紹一下一些基本工藝的目的和原理:

1、 生長SiO2:將硅晶圓放入通了氧氣的烘烤爐中,使Si氧化,在表面生成一層SiO2。一般是為了絕緣。

2、 光刻(濕法):因為半導體器件的尺寸非常小,不可能通過機械手段加工,所以只能通過刻蝕的方法。原理是先在要刻蝕的表面均勻塗抹一層光刻膠並烘乾,然後通過掩膜板(上面繪製了需要刻蝕出的圖像,需要刻蝕的部分為透明的,不需要刻蝕的部分用黑色阻擋),將紫外線照射到光刻膠上。光刻膠分為正膠和反膠,如果是正膠的話,照射到紫外線的部分就溶解掉了。這樣,需要刻蝕的部分上覆蓋的光刻膠就被紫外線透過掩膜照射溶解了,而不需要刻蝕的部分因為紫外線不能透過掩膜的黑色部分,所以仍在器件表面。這時將器件放到能溶解其表面物質的溶液中,被光刻膠覆蓋的部分因為接觸不到溶液,所以不會被去除,而沒有光刻膠的部分就溶解掉了,於是就在器件表面形成了需要刻蝕出的圖形。

3、 離子刻蝕:前序步驟和濕法光刻是一樣的,都是用光刻膠形成圖形。但是不同於用溶液溶解,離子刻蝕是使用高能離子打向器件表面,沒有被光刻膠保護的部分就被打掉了,被光刻膠保護的部分留了下來。


然後我們就可以了解一下MOS的具體製備流程了(以下圖片來自FSI)。


1、 STI淺溝槽隔離:STI的目的是為了在IC電路中,將各器件隔離開來,否則會有漏電等情況發生。STI使用SiO2作為隔離介質,因為SiO2有良好的絕緣性。

首先將切下來的硅晶圓做清潔。

在Si表面生長一層很薄的SiO2,然後在上面覆蓋一層Si3N4。這裡Si3N4起到一個佔位的作用。

在Si表面生長一層很薄的SiO2,然後在上面覆蓋一層Si3N4。這裡Si3N4起到一個佔位的作用。

塗抹光刻膠並烘烤,用紫外線透過掩膜進行光刻。

塗抹光刻膠並烘烤,用紫外線透過掩膜進行光刻。

沒有被掩膜黑色區域保護的光刻膠部分就被去掉了,留下了被保護的部分。

沒有被掩膜黑色區域保護的光刻膠部分就被去掉了,留下了被保護的部分。

干法刻蝕,就是離子刻蝕,沒有光刻膠保護的部分被高能離子打掉了,從而形成了凹槽。

干法刻蝕,就是離子刻蝕,沒有光刻膠保護的部分被高能離子打掉了,從而形成了凹槽。

去除殘留的光刻膠並清潔硅晶圓。

去除殘留的光刻膠並清潔硅晶圓。

在晶圓上沉積一層較厚的SiO2,因為是沉積得到的,表面很不光滑。

在晶圓上沉積一層較厚的SiO2,因為是沉積得到的,表面很不光滑。

通過CMP(化學機械研磨),將不光滑的表面磨平。

通過CMP(化學機械研磨),將不光滑的表面磨平。

這時用能溶解Si3N4的溶液將Si3N4去除。之前提到,Si3N4是佔位的作用,它去除後,SiO2的高度就略高於晶圓表面了,這也是為了起到更好的保護隔離作用。

這時用能溶解Si3N4的溶液將Si3N4去除。之前提到,Si3N4是佔位的作用,它去除後,SiO2的高度就略高於晶圓表面了,這也是為了起到更好的保護隔離作用。

2、 生長阱。阱就是之前介紹MOS管時的黃色區域,作用之前也提到過了,是為了形成N-P(阱)-N或者P-N(阱)-P這樣的結構。

首先還是光刻,用掩膜留下跟需要刻蝕圖形相同的部分光刻膠。

進行離子注入。假設我們是要製作NMOS,那麼就注入正離子(形成P阱)。注意沒有被光刻膠保護的部分會注入,而被光刻膠保護的部分就不會注入到了。

進行離子注入。假設我們是要製作NMOS,那麼就注入正離子(形成P阱)。注意沒有被光刻膠保護的部分會注入,而被光刻膠保護的部分就不會注入到了。

去除光刻膠並清潔表面。

去除光刻膠並清潔表面。

退火,主要目的是為了讓離子在硅晶圓中更好地擴散,形成合適尺寸的阱。

退火,主要目的是為了讓離子在硅晶圓中更好地擴散,形成合適尺寸的阱。

3、 製作柵(Gate)。Gate就是控制Source和Drain是否導通的部分,一般材質是多晶硅,現在有時也用其他材質了。

先對晶圓做一下清潔。

在晶圓上覆蓋一層多晶硅。注意,要覆蓋只能是晶圓表面全部覆蓋,因為尺寸太小在這一步不能可能控制它的覆蓋部分,只能在後續工藝中用光刻去除不需要覆蓋的部分。

還是塗抹光刻膠,用紫外線透過掩膜照射,留下一部分。

還是塗抹光刻膠,用紫外線透過掩膜照射,留下一部分。

濕法刻蝕,把沒有被光刻膠保護的多晶硅去除。

濕法刻蝕,把沒有被光刻膠保護的多晶硅去除。

去除光刻膠並清潔。這樣就留下了我們需要的多晶硅部分了。不過這一部分形成的多晶硅層還不是Gate用的多晶硅,這個叫做犧牲層,主要是為了形成真正的Gate墊背用的。原因是由於Gate的尺寸很小,目前刻蝕工藝無法形成特別精確的矩形圖形,所以使用了兩步工序,這一步形成的多晶硅還會在以後被刻蝕掉,具體原理不再贅述。

去除光刻膠並清潔。這樣就留下了我們需要的多晶硅部分了。不過這一部分形成的多晶硅層還不是Gate用的多晶硅,這個叫做犧牲層,主要是為了形成真正的Gate墊背用的。原因是由於Gate的尺寸很小,目前刻蝕工藝無法形成特別精確的矩形圖形,所以使用了兩步工序,這一步形成的多晶硅還會在以後被刻蝕掉,具體原理不再贅述。

再次覆蓋一層多晶硅。

再次覆蓋一層多晶硅。

覆蓋一層電極物質,一般是金屬(比如Al)。

覆蓋一層電極物質,一般是金屬(比如Al)。

塗抹光刻膠並刻蝕光刻膠。

塗抹光刻膠並刻蝕光刻膠。

柵離子注入。沒有被光刻膠保護的多晶硅部分就被注入了離子了,這是為了增強Gate的導電性。

柵離子注入。沒有被光刻膠保護的多晶硅部分就被注入了離子了,這是為了增強Gate的導電性。

去除光刻膠並清潔。

繼續塗抹光刻膠並刻蝕光刻膠。注意這一步形成的圖形就是柵真正的結構了。

繼續塗抹光刻膠並刻蝕光刻膠。注意這一步形成的圖形就是柵真正的結構了。

干法刻蝕。沒有被光刻膠保護的金屬(黃色部分)和多晶硅(表面紅色部分)就被高能離子轟擊掉了,留下了我們需要的柵結構。

干法刻蝕。沒有被光刻膠保護的金屬(黃色部分)和多晶硅(表面紅色部分)就被高能離子轟擊掉了,留下了我們需要的柵結構。

去除光刻膠並清潔。

去除光刻膠並清潔。

在柵上覆蓋一層氧化層(紫色部分),這是為了在下一步離子注入時保護柵。到這一步,柵(Gate)就製作完成了。

在柵上覆蓋一層氧化層(紫色部分),這是為了在下一步離子注入時保護柵。到這一步,柵(Gate)就製作完成了。

4、 在阱上製作Source和Drain的低摻雜部分。由MOS結構圖可知,Source和Drain之間有一個N-P-N(或P-N-P結構)。之前在製作阱的時候,我們把中間的這個部分(也就是阱)製作完成了,現在就是製作兩邊的部分。

4、 在阱上製作Source和Drain的低摻雜部分。由MOS結構圖可知,Source和Drain之間有一個N-P-N(或P-N-P結構)。之前在製作阱的時候,我們把中間的這個部分(也就是阱)製作完成了,現在就是製作兩邊的部分。

首先還是光刻,留下部分光刻膠。

離子注入,被光刻膠和柵保護的部分是注入不到離子的,而中間兩塊區域就被注入了和阱的極性相反的離子了,於是就形成了N-P-N或P-N-P的結構。

離子注入,被光刻膠和柵保護的部分是注入不到離子的,而中間兩塊區域就被注入了和阱的極性相反的離子了,於是就形成了N-P-N或P-N-P的結構。

去除光刻膠和保護層並清潔。

去除光刻膠和保護層並清潔。

5、 形成柵兩旁的保護層。這是為了防止柵和源、漏之間由於量子隧穿效應形成漏電流。用SiO2保護就可以了。

5、 形成柵兩旁的保護層。這是為了防止柵和源、漏之間由於量子隧穿效應形成漏電流。用SiO2保護就可以了。

沉積一層SiO2和Si3N4。

直接用高能離子轟擊表面,控制轟擊的時間,從而就把大部分SiO2保護層去掉了,留下了柵兩邊的比較厚的部分。

直接用高能離子轟擊表面,控制轟擊的時間,從而就把大部分SiO2保護層去掉了,留下了柵兩邊的比較厚的部分。

清潔表面。從以上步驟我們也可以看出,

清潔表面。從以上步驟我們也可以看出,之所以MOS工藝中要用一步步複雜的光刻、刻蝕、沉積,主要原因就是因為器件太小了,沒辦法直接進行機械加工操作,只能通過化學或離子轟擊的方法來製作,但是這些方法又只能針對一個表面,所以需要用光刻膠和掩膜板來一次次地製作保護區域,形成我們要製備的圖形。

6、製作Source和Drain的高摻雜部分。之所以在製作Source和Drain時要分為高摻雜和低摻雜兩塊區域,是為了使用所謂LDD(輕摻雜漏極)技術,來抑制短溝道效應帶來的Source和Drain之間的漏電流,並且提高MOS器件的橫向耐壓。

首先還是上光刻膠並刻蝕出圖像。

低摻雜的離子注入,形成了兩邊的亮藍色區域。

低摻雜的離子注入,形成了兩邊的亮藍色區域。

去除光刻膠並清除。

去除光刻膠並清除。

退火,使摻雜離子稍擴散。這樣高摻雜和低摻雜區域共同構成了源和漏。

退火,使摻雜離子稍擴散。這樣高摻雜和低摻雜區域共同構成了源和漏。

7、 金屬硅化物的製備。主要是用來連接Gate和電極的,導電性介於金屬和多晶硅之間。

7、 金屬硅化物的製備。主要是用來連接Gate和電極的,導電性介於金屬和多晶硅之間。

首先是清潔表面。

在表面覆蓋一層金屬硅化物。

在表面覆蓋一層金屬硅化物。

退火。

退火。

通過刻蝕等方法將不需要的金屬硅化物部分去除,留下連接柵的那部分。

通過刻蝕等方法將不需要的金屬硅化物部分去除,留下連接柵的那部分。

再次退火。到這一步金屬硅化物(柵到電極的連接部分)就製作完成了。柵的形狀是L形,之後會在L的尾部連接金屬電極。

再次退火。到這一步金屬硅化物(柵到電極的連接部分)就製作完成了。柵的形狀是L形,之後會在L的尾部連接金屬電極。

8、製作接觸電極。柵、源、漏的硅部分已經製作完成了,現在要把它們用金屬導線引出來,這樣才能連接到電路中去。

8、製作接觸電極。柵、源、漏的硅部分已經製作完成了,現在要把它們用金屬導線引出來,這樣才能連接到電路中去。

首先覆蓋一層SiO2和Si3N4。這是MOS管和上層導線的隔離層。

塗抹光刻膠,在光刻膠上形成幾個穿孔。前面兩個是用來連接源和漏的,後面那個是用來連接柵的。

塗抹光刻膠,在光刻膠上形成幾個穿孔。前面兩個是用來連接源和漏的,後面那個是用來連接柵的。

干法刻蝕。用高能離子轟擊晶圓表面,上一步形成的3個穿孔下方由於沒有保護,SiO2隔離層就被擊穿了,柵、源、漏就被暴露了出來。

干法刻蝕。用高能離子轟擊晶圓表面,上一步形成的3個穿孔下方由於沒有保護,SiO2隔離層就被擊穿了,柵、源、漏就被暴露了出來。

去除光刻膠並清除表面。

去除光刻膠並清除表面。

在表面沉積一層金屬,這樣金屬就填充了穿孔,從而連接了柵、源、漏,將它們引了出來。

在表面沉積一層金屬,這樣金屬就填充了穿孔,從而連接了柵、源、漏,將它們引了出來。

CMP工藝,打磨掉表面多餘的金屬。

CMP工藝,打磨掉表面多餘的金屬。

清潔表面。

清潔表面。

9、製作金屬層。這一層就完全根據電路設計中的引線來製作了,使用的金屬材質和圖形都是因設計而異的。

首先沉積一層介電層(就是絕緣層,用來隔離)。

光刻出跟需要製備的金屬層圖形相同的光刻膠層。

干法刻蝕,用高能離子轟擊,刻蝕掉不需要的介電層。

去除光刻膠並清潔。

覆蓋一層金屬,這層金屬填充到了介電層被刻蝕出的凹槽中,連接到了下方的金屬電極。

CMP工序,去除掉表面多餘的金屬。

清潔表面。


然後就是根據電路結構繼續製作金屬互聯層,一層層地連接到外部電路中去。一般一個簡單的晶元需要10-20層互聯結構。最後就是將晶元打上與外部電路連接的電極,一塊完整製作好的晶圓就產生了。一般一塊晶圓上會有幾十塊晶元,把晶元切下來就可以測試、封裝、使用了。


如此,一塊晶元就製作完成了。計算機通過以高低電壓形式表示的1、0狀態作為輸入,在晶元上的千千萬萬個MOS管的作用下,得到同樣是以電壓形式表示的輸出,然後通過以電壓驅動的輸出設備(比如顯示器)顯示給用戶。整個過程其實是利用了電子的物理特性和極其精妙的器件組合,獲得了一個「自動化」的處理方式。


玉來了

既然是問最最原始的那個工作原理。。。

從小到大,我們被告知的都是,計算機只能讀懂1和0,但我好奇的是為什麼計算機它就能夠讀懂1和0呢,它是怎麼讀懂的?讀懂後,又是怎樣進行工作的呢?嗯...我想問的就是,最最基本原始的那個工作原理

+++理論的分割線+++

最最基本原始的那個工作原理甚至都和電無關,是數學原理,布爾代數(搜索),任何可以改變狀態傳遞信息的技術都可以拿來實現布爾邏輯,而實現了布爾邏輯,就離計算機不遠了。

像是三體裡面的人列計算機,就是用三體人實現計算機,這一段我直接跳了,沒什麼可看的,因為我懂嘛。。。
我還設想過水流+開關實現邏輯門,是可行的。


「現在可以公開的情報」

  1. 計算機的理論基礎是布爾代數
  2. 計算機的實現基礎可以是任何擁有『改變狀態』和『傳遞信息』的技術

+++基礎實現的分割線+++

繼續正題。。。
起初, 科學家 創造計算機, 科學家 說,要先有邏輯門,然後就用真空二極體實現了邏輯門
真空管的原理去搜吧

電子計算機的原理就是利用通電、斷電(或曰高電平低電平)這兩個狀態來表示布爾代數中的邏輯真和邏輯假從而實現布爾運算,由於這個原因,設邏輯真為1和邏輯假為0,這樣就可以用計算機表示二進位的數字了。

現在的計算機用的是晶體二極體,雖然底層原理不同,但是性質是一樣的,這就是編程中常說的封裝和抽象的好處,你不需要關心它的原理,用它實現你的功能就行了。
所以說起來,現代電子計算機的實現,是物理原理,計算理論,是數學原理。

二極體的性質是這樣的,只有一個方向可以通電,反向不通電
『想知道具體原理的可以搜索PN結』
還有三極體(還有一種性質相似的場效應管FET),性質是這樣的,b通電ec通,b斷電ec斷
『具體原理搜索NPN結』

【【【【配圖】】】】
二極體和三極體

然後可以組成邏輯電路,下面分別是與或非(AND、OR、NOT)三種邏輯門的電路實現


【【【【配圖】】】】
從左到右分別是與或非三種門,x j表示輸入,m表示輸出

有了這三種邏輯門電路,你就可以實現任意邏輯門了,比如與非門、或非門、異或門、同或門(異或非門)。(搜索邏輯門)
(實際應用中,是以與非門(NAND(Not AND) gate)為基礎原件來構建電路,因為其他所有門電路都可以用與非門構建,關於這一點,你可以思考一下


「現在可以公開的情報」

  1. 地球當代的計算機的實現基礎是電子技術
  2. 二極體和FET的技術原理是PN結和NPN結,是原子、電子層面的原理(很底層吧。。。)
  3. 用二極體和FET可以實現布爾代數中的邏輯操作,稱為『邏輯門』

+++邏輯的分割線+++

二進位數字的加法如下:
1+1=10
1+0=1
0+0=0
0+1=1
用上文中的邏輯門就可以實現這個加法。
不考慮進位的情況下(術語叫半加器),用一個異或門就可以實現兩個數字相加,很簡單,就不畫圖示意了,自行思考吧。。。

考慮進位的情況下(術語叫全加器),稍微有點複雜,輸入通過XOR(異或門)得到結果,同時過一個電路得到進位結果
進位規則如下:
1+1進位1
1+0進位0
0+0進位0
0+1進位0
可見進位規則可以用AND(與門)得到結果,所以電路圖如下:

【【【【配圖】】】】


把這樣的電路串起來,就可以實現多位加法,自己想想看吧。
不過這裡有一個問題,要連多個例圖中的加法器,需要給電路添加一個輸入口m,它是上一位的進位,有興趣可以思考一二。


實際應用中,電路並不是憑空想的,是通過布爾邏輯運算得到一個最簡邏輯表達式,然後按照這個表達式來組裝電路,『請搜索數字電路』。

淘寶可以買到LED燈、二極體和三極體,雖然現在漲價了,但價格依舊感人,不到順豐快遞費就可以買一大把,有興趣的同學可以自行購買這些元器件組裝電路來玩玩。
輸出端接上led燈,就可以觀察到電路運行結果。

額外的,如果你把幾個燈泡並聯並且弄成一條線段的樣子當做一個整體燈管,然後通過輸入來點亮相應燈泡,就可以用來顯示數字了。。
像下面這種,一共7個燈管
1點亮右邊兩根、2點亮相應的,以此類推
這樣可以用布爾代數做出來5個輸入7個輸出相對應的邏輯,然後用上文的邏輯門組成電路圖實現
(為啥輸入是5個?)

「現在可以公開的情報」

  1. 可以用邏輯門實現加法,也可以實現減法
  2. 實現加法的原理在於通過輸入進行邏輯運算得到輸出,這一學科可以通過搜索『數字電子技術』獲得詳情
  3. 通過燈泡等設備,可以實現電路的輸出
  4. 計算機的本質原理就是接受『輸入』,通過『計算』,得到『輸出』
  5. 通過上文所有文字,已經部分解決了樓主計算機為什麼能讀懂1和0以及內部工作原理的問題,雖然還剩下時序邏輯,不過這已經夠了。樓主趕緊點贊吧

+++分割線+++

太長了。。。
後續還有反饋電路、觸發器、時序邏輯存儲器等等等等,最終目標是弄出一個CPU來(如果我有時間的話)可以寫一個模擬器讓感興趣的同學用邏輯門拼湊CPU(如果我還有時間的話)

『待續(應該大概真的會續)』

**不過最後還是想提醒還在學校的cs同學們,這些知識對找工作毫無幫助,請不要在此屠龍之技上浪費時間。


一個快速的完全針對問題的回答是,0是邏輯低,代表電平接地,1是邏輯高,代表電平接電源(3.3V或5V)。計算機其實不懂0和1,它只是根據程序員和電子工程師預先寫好的程序,對用戶的輸入一一做出回應。
打個比方,各地政府都對一些緊急事務做了「應急預案」,一旦事件發端,政府工作人員就可以快速按預案的流程處理事務。這個「應急預案」就類比於程序,工作人員並不需要學會思考和判斷,只需要按照預案一一操作即可,決策的工作交由製作預案的人,也就類比於程序員,來完成了。
如果要詳細回答,用戶的指令,是如何轉化成計算機可讀入的機器碼(0和1),計算機又是如何將得到的正確答案反饋給用戶的,即CPU到底是如何工作的,這可能需要一個稍微長一點的回答:
事先做個聲明,為了保證行文的流暢性和易讀性,有很多相似的概念被刻意做了模糊化處理,包括但不限於場效應管與三極體,不同摻雜方式的場效應管,不同的邏輯門, 不同的觸發器,不同的計算機體系結構,不同的存儲器類型,所以計算機實際的運行方式與我的回答可能會大相徑庭,但背後的基本概念和思維方式應該是一致的。

1場效應管
現代數字電路的基礎是場效應管(模擬電子的基礎是三極體),場效應管的基本機構是長這樣的

藍色部分平時處於絕緣的狀態,此時源級(Source)和漏級(Drain)是不通的,電流不能從中間流過。當柵極(Gate)有電壓時,一部分藍色區域變成導體,源級和漏級就被打通了。這種材料可以表現出導體和絕緣體的兩種特性,所以我們稱之為半導體。由此我們獲得了一個類似於開關的東西,可以通過是否給柵極電壓,來控制電路導通與否,符號化地,我們將之表示為:

藍色部分平時處於絕緣的狀態,此時源級(Source)和漏級(Drain)是不通的,電流不能從中間流過。當柵極(Gate)有電壓時,一部分藍色區域變成導體,源級和漏級就被打通了。這種材料可以表現出導體和絕緣體的兩種特性,所以我們稱之為半導體。由此我們獲得了一個類似於開關的東西,可以通過是否給柵極電壓,來控制電路導通與否,符號化地,我們將之表示為:


2邏輯門
當我們已經擁有了場效應管,我們就可以以此為基礎搭建基本的邏輯門,即 非門,與門,或門。我們來看一個簡單的或門的實現(非門的實現已經有很多答案提到了):

或門要求,當輸入的a和b

或門要求,當輸入的a和b任一等於1,輸出就為1。如果a和b均為0.,則輸出為0.
————————————————原理簡介,可跳過————————————————————
假設現在a為1,b為0,此時a控制的場效應管的柵極有了電壓,這個管子被打通了,這個場效應管的漏極直接與地(即低電平)相接,它的漏極又形成了輸出F的場效應管的柵極輸入,因為場效應管F的柵極沒有電壓,處於截止狀態,輸出F上拉到電源電壓Vcc(高電壓),輸出1。
我們接下來考察當ab輸入均為0的情況。此時ab兩個管子都處於截止狀態,F管的柵極會上拉到Vcc,F管會被導通,於是輸出F與地直接相連,F為低電平0.
————————————————————————————————————————————
相似地,我們可以構建其他基本邏輯門,並以非門,與門,或門為基礎,構建或非,異或,同或,與非門等複雜一點的邏輯門。


3.1觸發器
有了基本的邏輯門,我們如果把1對應真,0對應假,我們已經可以進行基本的邏輯決策了。但在實際情況中,我們做出一個決策,並不僅僅依賴於當前的輸入,還依賴於之前的狀態,因此我們需要構建帶有記憶功能的邏輯組件,即觸發器,看一個最簡單的RS觸發器:

它的真值表為

它的真值表為

——————————————原理簡介,可跳過——————————————————————

——————————————原理簡介,可跳過——————————————————————
當RS均為0,觸發器的兩個輸入為1(輸入是RS取反),當Q為1時,下面的與非門的兩個輸入都是1,因此輸出為0,上面的與非門輸入為1和0,輸出是1,因此Q保持1。當Q為0時,下面的與非門兩個輸入為1和0,以為內輸出為1,上面的與非門輸入為兩個1,因為輸出為0,因此Q保持0。
所以當RS為0時,Q輸出與前一狀態相同。
類似地,我們可以推到其他3種狀態,得到上面的真值表。
————————————————————————————————————————————
我們可以看出,觸發器的前一輸出會影響到觸發器後一輸出。所以在某種意義上,我們稱它具有記憶功能。觸發器將會是構成狀態機(控制單元)的重要基礎組件。但為了對CPU的工作原理有更加全面的認識,我們暫時把目光從邏輯控制單元上移開,轉向另外一個重要單元,計算單元。

3.2半加器和全加器
我們還是以邏輯門為基礎。我們考察異或門的真值表:

我們發現,這恰恰就是二進位加法當前位的結果。

我們發現,這恰恰就是二進位加法當前位的結果。
0+0等於0,0+1等於1,1+1等於0(因為產生了進位),因此我們很容易地想到,可以用異或門構造一個加法器(半加器):


S為當前位的結果,C為進位,當且僅當AB都為1時,產生一個進位1。
當然我們做加法時,是不能不考慮進位的,之前的半加器是不夠完備的,一個完整的加法器(全加器)是這樣的:

低一位的進位,和當前位的兩個加數,共同決定輸出。

低一位的進位,和當前位的兩個加數,共同決定輸出。
好了,我們有了最基本的運算單位,加法運算單位。減法運算單位與之類似。從某種意義上講,乘法運算可以看做是次數為被乘數的加法運算,除法可以看做是次數是被除數的減法運算,因為也可以用類似的方法實現(現代數字電路中,為了加快運算速度,已經不採用這種方法了,而是類似於我們用筆算乘法的邏輯,只不過是從10進位變成了2進位)。
這些數學運算單位,可以構成CPU的另一重要組件,計算單元。但僅僅有控制單元和計算單元並不足以組成CPU,我們還需要存儲單元。

3.3靜態隨機存取存儲器
不同的存儲器的基本原理差別很大,有五花八門的存儲器基於不同的單位成本,讀取速度,是否需要上電保持來供計算機不同的應用進行選擇,一一介紹冗長而又無趣,為了簡單起見,僅介紹一種基於場效應管的存儲器,靜態隨機存儲器:


原理介紹我直接摘取了維基百科的內容,一如既往地,可以快速跳過以保持閱讀的流暢性。
——————————————原理簡介,可跳過——————————————————————
準備:

如果字線沒有被選為高電平, 那麼作為控制用的M5與M6兩個晶體管處於斷路,把基本單元與位線隔離。由M1 – M4組成的兩個反相器繼續保持其狀態,只要保持與高、低電平的連接。

讀取:

假定儲存的內容為1, 即在Q處的電平為高. 讀取周期開始時,兩條位線預充值為邏輯1, 隨後字線WL充高電平,使得兩個訪問控制晶體管M5與M6通路。第二步是保存在Q的值與位線BL的預充值相同,所以BL保持邏輯1,而Q與BL的預充值不同,使得BL經由M1與M5放電而變成邏輯0(即Q的高電平使得晶體管M1通路). 在位線BL一側,晶體管M4與M6通路,把位線連接到VDD所代表的邏輯1 (M4作為P溝道場效應管,由於柵極加了Q的低電平而M4通路). 如果儲存的內容為0, 相反的電路狀態將會使BL為1而BL為0. 只需要BL與BL有一個很小的電位差,讀取的放大電路將會辨識出哪條位線是1哪條是0. 敏感度越高,讀取速度越快。

寫入:

寫入周期開始時,把要寫入的狀態載入到位線。如果要寫入0,則設置BL為1且BL為0。隨後字線WL載入為高電平,位線的狀態被載入SRAM的基本單元。這是通過位線輸入驅動能力設計的比基本單元相對較弱的晶體管更為強壯,使得位線狀態可以覆蓋基本單元交叉耦合的反相器的以前的狀態。

————————————————————————————————————————————
4 馮·諾依曼結構
我們在3.1中討論過的觸發器可以進一步構成狀態機,例如我們可以用兩個按鈕和一個RS觸發器控制一個電機。當按鈕為01時,控制電機正轉,按鈕為10時,控制電機反轉,按鈕為00時,控制電機保持現有方向不動。此時這個控制組件就是狀態機。通過它,我們可以實現面對特定的用戶輸入,機器可以自動做出對應的輸出。狀態機將構成CPU中的控制單元
3.2中我們獲得了一個計算單元
3.3中我們獲得了一個存儲單元
加上我們最熟悉的輸入設備(滑鼠,鍵盤)和輸出設備(屏幕,音響),我們現在已經足夠搭建一個典型的馮諾依曼結構的計算機了:

連接各個單元的是

連接各個單元的是匯流排,數據和命令都以01二進位碼的形式,通過匯流排奔跑在各個單元之間。每當用戶輸入一個命令時(點擊一下滑鼠或者敲擊一下鍵盤),控制單元會接受這個命令,根據程序員已經寫好的決策方式(程序),決定從存儲器調用歷史數據,並將數據放入運算器中運算,最後的結果會在輸出設備上得到展現。
但是我們之前對於狀態機的討論中我們知道,控制器只能接受0和1的控制命令,意味著程序員寫程序時,需要挨個給每個狀態機的輸入變數和初始變數賦予0或1,因此寫程序會變成不斷敲擊0和1的一件事。這無疑是十分反人類的,我們需要更加接近自然語言的程序語言。
5彙編語言
我們討論一種最簡單的機器語言,如果我們用10110 來代表數據移動的操作(X86),某一個寄存器AL的編碼是000,那麼向AL寫入61(二進位為01100001)這個數這個操作,程序員需要這樣寫:
10110000 01100001
於是我們嘗試,把10110 翻譯成MOVE,把000翻譯成AL,這樣代碼就變成:
MOVE AL,01100001
這種用自然語言翻譯之後的語言,就是彙編語言。彙編語言是用自然語言對機器碼的一一翻譯。以便於閱讀和編寫。
6高級語言
彙編語言當然比機器語言的可讀性和可編寫性都好上不少,但無疑還是十分讓人蛋疼的,計算機科學家們又發明了諸如C語言等高級語言,它們的語法更加符合人的邏輯思維模式,而不是計算機的。編譯器負責將這些高級語言,翻譯成彙編語言,再翻譯成機器語言。
基於C語言或者JAVA這種編程語言,還有一些更加友好的可讀性強的腳本語言,例如WEB前端的Javascript,當然這些成熟的高級語言的區別將是一個繁複並超出我的能力範圍的討論,不展開了。天才的程序員們用這些語言,為我們編織了一個光怪陸奇又精彩紛呈的互聯網世界。

最後的話:
在整個電子工業中,封裝和復用的思想都貫穿其中,通過封裝底層模塊,讓上一層的工程師不需要將精力花在冗長複雜的底層物理實現上,可以專註於自己演算法和邏輯的推進。由於現代電子工業的快速發展,計算機計算能力的冗餘越來越多,我們越來越不需要去關心底層封裝的具體結構。當然了,對於一部分異常關注計算性能的方向,例如並行計算(計算量巨大)和嵌入式設計(有時微處理器計算能力有限),適當地關注底層邏輯實現,對編寫更加高效的代碼十分有幫助。


一般來說,問這個問題的和來參考的人肯定是完全沒有學習相關課程的。所以我儘可能簡單的從最基礎的開始。請聽我慢慢道來。

1.計算機怎麼認識0和1的?
首先你應該聽過二極體是什麼,這是邏輯電路中最常見的電子器件。
額。。。又扯上「邏輯電路」了:邏輯電路是以二進位為原理、實現數字信號邏輯運算和操作的電路。
要想短短几百字說清楚還真難。不過,這裡就看到「二進位」了,二進位就是問題中提到的0和1!而在實際電路中,0和1由低電平(低電壓)和高電平(高電壓)實現。非高即低,很容易實現。

回到邏輯電路,怎麼用邏輯電路實現我們想要的一些功能呢?(這些簡單功能就是計算機的基礎,各項簡單功能組合起來就能實現複雜的功能!)
首先,二極體具有單嚮導電性(原理就不說了,一下子很難懂的)。

好,這個你先記住,把二極體看做一個箭頭,電流只沿箭頭方向走。

好,這個你先記住,把二極體看做一個箭頭,電流只沿箭頭方向走。
然後,給你舉個例子。如果有個決定,你和你朋友只有兩個人都同意時才去執行。回到初中物理知識。

給你控制開關一,給你朋友控制開關二,都同意時才會把兩個開關都放下,使電路導通,燈泡點亮。這就是一個簡單的「與邏輯」。

給你控制開關一,給你朋友控制開關二,都同意時才會把兩個開關都放下,使電路導通,燈泡點亮。這就是一個簡單的「與邏輯」。
當然複雜的電路中並不是人去控制開關的,所以得用二極體來實現。下面這個電路實現的是同一個功能。(畫圖神馬的最折騰人了。。。)

當A,B都為高電平時(所謂的1),電源VCC的電流是不能通過D1,D2兩個二極體的(電流只能從高電壓處流到低電壓處)。所以電流只能流向L點,如果在L點接個電燈泡(實際上是發光二級管),就會被點亮了。

當A,B都為高電平時(所謂的1),電源VCC的電流是不能通過D1,D2兩個二極體的(電流只能從高電壓處流到低電壓處)。所以電流只能流向L點,如果在L點接個電燈泡(實際上是發光二級管),就會被點亮了。
還得繼續解釋,如果A,B中只要有一個為低電平(所謂的0),電流就可以通過了,就不會流向L點了,燈泡就不會亮了(為什麼,想像一下電流為水流,導線為水管,而D1,D2處的管子是很粗的(幾乎沒電阻)!水流過不會有阻礙。而L處的水管是很細的(因為接了電燈泡,有電阻),水流很難流過,即使通過也是很小的水流(電流),不足以點亮燈泡。更確切的應該用電壓去解釋,能力有限,只能這麼玩了。)
所以這個簡單的電路就能實現一個簡單的功能,而且電路能夠識別1和0了!

2.計算機能用1和0做什麼?
除了與門,邏輯電路中還有常見的或門,非門,或非門,與或非門等。(其中有些還要用到三極體,原理就跟上面大同小異了,只要了解的童鞋就不用管了)。
與門在電路圖中的符號:

當A=1,B=1時,L=1;(1代表高電平,0代表低電平)

當A=1,B=1時,L=1;(1代表高電平,0代表低電平)
當A=1,B=0時,L=0;
當A=0,B=1時,L=0;
當A=0,B=0時,L=0;

或門在電路圖中的符號:

當A=1,B=1時,L=1;

當A=1,B=1時,L=1;
當A=1,B=0時,L=1;
當A=0,B=1時,L=1;
當A=0,B=0時,L=0;

非門在電路圖中的符號:

當A=1時,L=0;

當A=1時,L=0;
當A=0時,L=1;

然後我們就可以用這些門電路相互組合去實現複雜的邏輯功能了。

好,有了上面這些知識,下面來個實用的:計算機怎麼做加法的?

就是上面那個電路就可以實現兩位二進位數的加法了。容易擴展為更多位的加法運算,然後依次類推,可以用門電路實現減法,乘法和除法等。這樣,不說是計算機,計算器的模型總出來了吧。


知乎有個毛病就是有許多答主喜歡長篇大論不說人話,現在我試圖用最簡單的話來說明這個原理:

1. 只有數字電路才基於0和1,或者說布爾邏輯進行工作。模擬電路的輸入是某個範圍內任意的電壓,輸出也是某個範圍內任意的電壓,輸入輸出是個連續函數的關係,最簡單的比如說放大器的電路;如果做過相關實驗的話也會熟悉用運算放大器搭建模擬計算電路的方法。模擬電路可以進行許多各種各樣的計算,加減乘除甚至乘方開方,輸入輸出都是用連續的電壓表示。

2. 模擬電路計算有個致命的缺點:輸出會受到輸入雜訊的影響,因而變得不穩定,不適用於嚴格的科學計算。元件的精度、老化程度也會影響計算的精度。產生這個缺點的原因是電子元件工作在線性區域,所以輸出對輸入的變化很敏感。

3. 正如上面所說的,電子元件工作在線性區時,輸出會對輸入的變化過於敏感,不適合精確計算。那麼反過來,電子元件工作在非線性區時,輸出對輸入的變化是不敏感的。一個典型的非線性電子元件電路有兩個這樣的非線性區,以共射接法的BJT晶體管為例:
輸入&<0.7V時,晶體管截止,輸出為最高電壓(假設是5V);
輸入&>0.75V時,晶體管進入飽和區,輸出為最低電壓(約為0V);
輸入介於兩者之間時,晶體管處於線性工作狀態,函數大概是5 - (Ui - 0.7) * 100,100是放大倍數,實際上一般會比100更大。在這段區域中輸出對於輸入是極端敏感的,不適合數字電路工作。
而前兩種狀態下,輸入在相當大的範圍(0 - 0.7V, 0.75 - 5V)中變化時,輸出都是幾乎不變的,也就是說輸出幾乎不受雜訊影響,非常適合數字電路工作。

4. 因為我們的元件普遍只有兩個非線性區,所以我們不可避免地用其中一個表示0,另一個表示1,而沒有其他的狀態去表示2或者3或者更多了。這並不是人類特別的喜歡二進位,而是受到了元件特性的限制。因為所有的變數都只有0和1兩個狀態,所以所有的邏輯都可以用布爾代數表示,這就構成了數字電路的基礎。二進位計算只是布爾代數邏輯的一個特例。

那麼你最後就應該明白了:計算機只能接受0和1兩種輸入是因為數字電路只能接受0和1兩種輸入,數字電路只能接受0和1兩種輸入是因為非線性電子元件只有兩個非線性區。


物理上只容易實現1和0,人類不得不將就著用。


隨手寫寫

#10-22更新
因為得到了贊同,想一想決定逐步把答案寫得更詳細一些。
因為沒有參考資料,全憑記憶打字,難免有所疏漏和不準確。
#

計算機所認識的0或1是信號的高低電壓。高低電壓即邏輯值(0或1)來自於晶元中邏輯電路的控制,主要由CMOS器件組成。CMOS的邏輯設計詳見:VLSI大規模集成電路基礎等課程(偏重基於CMOS的邏輯設計)。CMOS器件的工作原理詳見:半導體器件物理相關課程(偏重CMOS的器件特性和原理)。半導體器件物理的基礎來自半導體物理,主要是能帶理論。能帶理論的基礎是量子力學。(所以沒有量子力學就沒有現代計算機)

#10-22更新
CMOS的構造和邏輯實現原理 (懶得找圖,可以搜關鍵字看圖)
假定有一種邏輯的開關,開關的輸入信號為1則開關開啟,為0則開關關閉,開關連接輸出信號和地(0)。則輸入為1,則輸出為0;輸入為0,輸出為高阻(z,無邏輯值)。-&>叫做NMOS
另一種開關相反,輸入為0則開關開啟,為1開關關閉,開關連接輸出信號和電源(1)。則輸入為0,輸出為1;輸入為1,輸出高阻。-&>叫做PMOS
如果把NMOS和PMOS對稱的連接到一起,結果是:輸入為1,,輸出為0;輸入為0,輸出為1,總有確定的輸出值,避免了高阻的情況,即CMOS(C是對稱的意思)。在邏輯上實現了反向的功能,即非門(not gate)。
如果兩個NMOS串聯,PMOS並聯,則兩個輸入都為1,輸出為0;一個輸入為0,輸出為1,形成了NAND gate,再加一個NOT gate,就是AND gate。類似的可以搭建OR gate,進而搭建所有的邏輯功能。對於任意給定的輸入組合和輸出組合,總可以找到一個邏輯表達實現該功能(即數字邏輯電路設計中的卡諾圖)。在增加了電平和邊沿觸發的存儲單元(D觸發器等),就可以把邏輯分割成不同的部分用同步的時鐘來控制-&>形成logic + register的時序電路。CPU等IC都是這樣的電路。
CMOS是現代集成電路的主要基本結構,因為輸入和輸出之間沒有電流,功耗較小,易於大規模集成。現代的工藝(40nm/28nm/20nm/14m)也主要是在CMOS的結構上通過工藝等多方面的改進不斷縮小尺寸和降低功耗。至於如何在矽片上形成這樣的MOS結構涉及到半導體工藝的知識,這又是一個非常廣泛的範疇。

NMOS和PMOS的MOS指的是金屬場效應管,即靠輸入信號的電壓(柵極),把半導體材料中的載流子(半導體中可以導電的粒子,根據N型和P型分別是電子和空穴)吸引到特定的區域,形成一個可以導電的溝道,從而實現MOS管源極和漏極之間的導通。這就是開關為什麼能打開和關閉的原因。當然這是最簡單的介紹,其中有很多複雜的數學模型來分析(半導體器件物理的範疇)

半導體物理和量子力學的學得太早(03-04年),10年沒看,有點不記得……
下次有時間可以更新一些體系結構方面的內容
#

計算機的硬體體系結構基本上是這樣:
操作系統/編譯器 -&> 計算機體系結構(指令系統體系結構)-&> CPU/SOC設計、板級設計 -&> CMOS設計/EDA工具+數字邏輯 -&> 半導體器件物理 -&> 半導體物理 量子力學


我的這個回答針對的是小白,不叨擾專業人士。這裡沒有很專業的東西,不夠嚴謹,但有助於小白稍微理解一下計算機如何通過處理二進位信息來運轉。

1. 0和1組成的是二進位的數字,計算機內部處理的是0和1其實就是說計算機內部處理的是二進位數字

2. 計算機是電設備,整個工作中處理的電信號有兩個: 高電平和低電平(可以類比得理解為電容器的充電狀態和放點狀態),這兩個信號就對應了1和0,因此,計算機內部處理的都是二進位的0和1。

3. 計算機內有可以對二進位數進行運算與傳送的器件。比如二進位數的加法、一串二進位信息在內存與磁碟間的傳送等,都有相應的設備,保證了計算機可以執行對二進位的各種操作。

4. 任何可存儲及可處理的信息都可以用一串等價的二進位數表示。比如: 十進位的數字可以轉化為二進位的數字,一句話中的每一個字或字元都可以按照某種規則用固定的二進位數來表示(可以將這樣的二進位數理解為相應字或字元的代號),一段視頻也可以用一串二進位數來表示(視頻分為很多幀,每一幀中每個像素的值都可以對應於一個二進位數),同理,其他的各種信息(如音頻等)都可以用相應的一串二進位數表示。

5. 計算機連接的一些外部設備稱為外設(例如: 滑鼠、鍵盤、顯示器、印表機等)。計算機可以向外設傳輸二進位串,控制外設的工作,比如可以向印表機傳送要列印的內容,或向印表機傳送一段約定好的二進位串表示讓印表機開始列印;外設也可以向計算機傳輸二進位串,比如敲擊鍵盤會產生相應的高低電平,即對應的0、1串(高電平1低電平0),傳入電腦後,計算機便可以判斷出按下了哪個鍵。這樣便實現了計算機對外設的控制及雙方的信息傳送。

綜合以上幾點,計算機能夠通過處理高低電平的方式處理0、1二進位串,而所有的信息都可以等價地用相應的二進位串來表示,計算機內有對二進位串進行各種運算與處理的設備,計算機也可以通過傳送相應的二進位串來進行外部設備的控制從而實現輸入與輸出,這樣,在二進位的基礎上,計算機工作了起來 ^_^


我覺得各位有點沒答在點子上啊,雖然講了那麼多,也說出了是二極體、高低電平的根本原因,甚至把二進位運算都講了,但貌似沒什麼用啊。
因為,最開始造的計算機,它就是做十進位運算的!
ENIAC是十進位大家應該不陌生的吧。因為十進位是人最自然的思考和計算方式,計算機自然就那麼設計了。就是那個用真空管的年代,用十個真空管代表一位上的0~9,於是就十進位了,看,多麼浪費低效,但太符合人類正常思維方式了。自然而然就設計成那樣了。
不過後來兩位天才,圖靈和馮諾依曼改變了這種設計,提出了用二進位做基本運算。其實你學了不同進位的運算後,就會發現他們真的只是進位的不同,+-*/四則運算根本沒有區別,古代用的重量計量是16進位,時間至今還是12進位,這都沒有什麼關係。
改用電子管之後為什麼就用二進位了?這是因為二進位容易判斷。電子管使用電平來標識某一位的值,如上說的高電平代表1低電平代表0,這是用點子元器件很容易判定和區別的,因為它們之間的差別夠大,不會產生誤判。如果現在電子元器件的靈敏度足夠高,可以完全準確的判斷識別0.1V的電壓變動,那麼把0~5V分成10份,電壓每變化0.5V就代表十進位0~9中的一個值,那麼現代計算機也可以做成十進位的了。可惜,現在不能做到,或者即使可以以很高的準確度做到,只要它還會產生誤判,那麼對於計算機這種0錯誤容忍的系統來說它就不可用。
所以,其實是技術不允許做成十進位的。
但更重要的是,我還得強調,不同進位做數學運算根本沒有區別!「加一」對於所有的進位來說都是「加一」,因為「一」對於所有的進位來說都是「一」,是相等的,一致的,是統一定義的,它們之間的區別只是數到幾的時候產生進位罷了。


最簡單的理解:這是一個龐大的機關獸。(參見「秦時明月」,千萬不要當真!)
———原文在日報長評———
這個問題本身有個瑕疵:0和1指的是什麼?
1. 我大膽的猜測題主指的是彙編代碼。
高級代碼(C++)經過編譯後會轉化為彙編代碼傳遞給硬體,彙編是由一串特定長度的0和1組成。一般而言的64位計算機,就是指可以處理64位長度的彙編代碼。而這一串0和1本身,包含了微指令以及一些變數,根據所處的位置不同,0和1們組成了不同含義的命令。

然後就是題主所問的計算機如何讀懂0和1。以簡單的晶元來說(如MIPS),片上系統由controller和datapath組成(不知怎麼翻譯)。前者可以理解成公司的管理層,後者就是具體幹活的。controller接受了上文所術的微指令,就知道這個彙編代碼是什麼作用(比如「011001」代表讀取數據)。然後controller告訴datapath哪些模塊要工作,數據從哪條唯一的路走。你可以想像一下賽車,從起點到終點只能走一條路。最終,輸入的數據走過規定的路徑,被處理成期望的輸出值。類似的過程不斷上演,大量的數據經過處理後,我們就在顯示器上看到反饋的結果。


2. 如果題主認為0和1指的是高低電壓,那問題本身就不嚴謹了。
數字電路中認為有三種值:0、1和高電阻(在設計中還可認為有「不確定」狀態)。而真實的電路中沒有確切的高低電壓值,不同系統規定了不同的電壓範圍代表不同的值。你甚至可以把電壓分成十級,就得到了十進位。只能說現實是相對的,自然界沒有明確的0|1之別,人類設計出來的規則讓計算機識別了0|1。

3. 扯遠一些。硅技術之後的有力候選者--量子計算機。量子本身有多個疊加態,不只兩個,所以可以做到0、1、2、3……到時問題就變成了「計算機如何識別0、1、2、3?」


知識背景:VLSI Master
歡迎指正,謝謝讀到結尾。
25/10/14


何謂讀懂呢。在標準大氣壓、100攝氏度下水會沸騰,0.99倍標準大氣壓或者99攝氏度下就不會,那麼水有知覺么,能感覺到外界的環境,智能地決定自己沸騰還是不沸騰?同理。


本質上是電流在電路中的流動,匯合,分解,而最初的電流狀態來自手按鍵盤。我也一直思考過這個問題,硬體電路為什麼能識別數字呢,雖然只有0和1兩個數,也不可思議。後來,想明白了,是人手按鍵盤帶來的電路狀態改變,我們這個抽象的計算機世界,所有的所有都是來自人手按鍵盤帶來的電路狀態改變。這個電路狀態改變被存儲,因為是電路對電路,也很容易被識別


No,它根本不懂。就像算盤不懂你撥珠子時心中默念的口訣類似。但是這樣並不妨礙最後得出你想要的結果。


至於為什麼在它完全不懂的情況下,還能搞出點有用的東西,這是另一個問題。


這個問題,我必須回答一下,作為一個cs專業的學生。。。我到大二其實都不是很清楚,直到我遇到了一本神作。。。

閑話不多講,有一本神作!絕對的神作!Charles Petzold的《Code》,這本書可以說,下至5歲孩童,上至90歲老嫗,無論你是計算機小白,還是大神,都會從這本書中有所收穫。真是後悔沒早點看到這本書,讓我一個無比討厭自己專業的人,都開始熱愛這個偉大的創造。

ps:如果你真正想了解計算機的原理的話。。。我覺得沒人能比這本書講的更通俗了

http://book.douban.com/subject/1024570/

打個廣告哈:

今年港美股大牛市,如果你錯過15年A股,16年樓市,17年的大牛市就不要錯過了哈 盈透(美國合法券商)開戶鏈接https://snowballsecurities.com/open?r=62195 任何問題可以諮詢我


0 1對應到高低電平

基礎邏輯門電路實現電路的邏輯關係

邏輯門加上向前反饋就能實現狀態(時鐘)

然後就能實現操作了

23333


並不是計算機能讀懂0和1。

計算機是人造的機器,0和1也是人類的思維邏輯中兩個數字元號而已,因此,計算機「讀懂」0和1,是我們人類特意把它設計成這樣子的。


雖然這裡集中了很多乾貨,但是我還是想吐槽:計算機根本就不懂0和1。計算機什麼都不懂,全都是我們寫好的規則。它真的就只是個計-算-機


- ……………………這問題問得………………就好像你用手推了一下計算機,計算機應聲掉到地上,你會問為啥計算機能讀懂你手的動作嘛……………………計算機會對01序列做出反應也是一樣,只不過它反應得複雜了點是圖靈完全的而已……………………


計算機最底層應用二進位,所以問題不是計算機為什麼能讀懂1和0,而是我們限定它只能讀出0和1。
1、開關、通斷是自然界最普遍的現象,應用於計算機設計是最方便的。拿數字來說,在我們看來的1在計算機看來是00000001,在我們看來的2,在計算機看來是00000010.我們看來的A、B、C、D在計算機也有不同的編碼,具體查看ASCII編碼。
2、計算機讀懂0和1,靠的是不同的電壓水平,對於我們來說是0和1,對於它來說其實就是低電平和高電平,不同的低電平高電平串代表了不同的指令含義。
3、計算機的邏輯就是基於2進位建立的。一個位元組8位,是2的3次方,一個字母編碼1個位元組,一個漢字編碼2個位元組,一段指令編碼1個KB,1024個位元組。所以計算機的性能不光要看CPU的頻率,還要看他的內存和緩存數。


推薦閱讀:

CPU 的摩爾定律是不是因為 10 納米的限制已經失效了?10 納米之後怎麼辦?

TAG:計算機 | 計算機科學 |