每次回家開(kāi)燈時(shí)你有沒(méi)有想過(guò),用你按的簡(jiǎn)單開(kāi)關(guān)實(shí)際上能打造出復(fù)雜的 CPU 來(lái),只不過(guò)需要的數(shù)量會(huì)比較多,也就幾十億個(gè)吧。
偉大的發(fā)明
過(guò)去200年人類(lèi)最重要的發(fā)明是什么?蒸汽機(jī)?電燈?火箭?這些可能都不是,最重要的也許是這個(gè)小東西:這個(gè)小東西就叫晶體管,你可能會(huì)問(wèn),晶體管有什么用呢?實(shí)際上晶體管的功能簡(jiǎn)單到不能再簡(jiǎn)單,給一端通上電,那么電流可以從另外兩端通過(guò),否則不能通過(guò),其本質(zhì)就是一個(gè)開(kāi)關(guān)。就是這個(gè)小東西的發(fā)明讓三個(gè)人獲得了諾貝爾物理學(xué)獎(jiǎng),可見(jiàn)其舉足輕重的地位。無(wú)論程序員編寫(xiě)的程序多么復(fù)雜,軟件承載的功能最終都是通過(guò)這個(gè)小東西簡(jiǎn)單的開(kāi)閉完成的,除了神奇二字,我想不出其它詞來(lái)。
AND、OR、NOT現(xiàn)在有了晶體管,也就是開(kāi)關(guān),在此基礎(chǔ)之上就可以搭積木了,你隨手搭建出來(lái)這樣三種組合:
兩個(gè)開(kāi)關(guān)只有同時(shí)打開(kāi)電流才會(huì)通過(guò),燈才會(huì)亮
兩個(gè)開(kāi)關(guān)中只要有一個(gè)打開(kāi)電流就能通過(guò),燈就會(huì)亮
當(dāng)開(kāi)關(guān)關(guān)閉時(shí)電流通過(guò)燈會(huì)亮,打開(kāi)開(kāi)關(guān)燈反而電流不能通過(guò)燈會(huì)滅
天賦異稟的你搭建的上述組合分別就是:與門(mén),AND Gate、或門(mén),OR gate、非門(mén),NOT gate,用符號(hào)表示就是這樣:
道生一、一生二、二生三、三生萬(wàn)物最神奇的是,你隨手搭建的三種電路竟然有一種很amazing的特性,那就是:任何一個(gè)邏輯函數(shù)最終都可以通過(guò)AND、OR以及NOT表達(dá)出來(lái),這就是所謂的邏輯完備性,就是這么神奇。也就是說(shuō)給定足夠的AND、OR以及NOT門(mén),就可以實(shí)現(xiàn)任何一個(gè)邏輯函數(shù),除此之外我們不需要任何其它類(lèi)型的邏輯門(mén)電路,這時(shí)我們認(rèn)為AND、OR、NOT門(mén)就是邏輯完備的。這一結(jié)論的得出吹響了計(jì)算機(jī)革命的號(hào)角,這個(gè)結(jié)論告訴我們計(jì)算機(jī)最終可以通過(guò)簡(jiǎn)單的AND、OR、NOT門(mén)構(gòu)造出來(lái),這些簡(jiǎn)單的邏輯門(mén)電路就好比基因。
老子有云:道生一、一生二、二生三、三生萬(wàn)物,實(shí)乃異曲同工之妙。雖然,我們可以用AND、OR、NOT來(lái)實(shí)現(xiàn)所有的邏輯運(yùn)算,但我們真的需要把所有的邏輯運(yùn)算都用AND、OR、NOT門(mén)實(shí)現(xiàn)出來(lái)嗎?顯然不是,而且這也不太可行。
計(jì)算能力是怎么來(lái)的現(xiàn)在能生成萬(wàn)物的基礎(chǔ)元素與或非門(mén)出現(xiàn)了,接下來(lái)我們著手設(shè)計(jì)CPU 最重要的能力:計(jì)算,以加法為例。由于CPU只認(rèn)知 0 和 1,也就是二進(jìn)制,那么二進(jìn)制的加法有哪些組合呢:
0 + 0,結(jié)果為0,進(jìn)位為0
0 + 1,結(jié)果為1,進(jìn)位為0
1 + 0,結(jié)果為1,進(jìn)位為0
1 + 1,結(jié)果為0,進(jìn)位為1,二進(jìn)制嘛!
注意進(jìn)位一列,只有當(dāng)兩路輸入的值都是 1 時(shí),進(jìn)位才是 1 ,看一下你設(shè)計(jì)的三種組合電路,這就是與門(mén)啊,有沒(méi)有!再看下結(jié)果一列,當(dāng)兩路輸入的值不同時(shí)結(jié)果為1,輸入結(jié)果相同時(shí)結(jié)果為0,這就是異或啊,有沒(méi)有!
我們說(shuō)過(guò)與或非門(mén)是邏輯完備可以生萬(wàn)物,異或邏輯當(dāng)然不在話(huà)下,用一個(gè)與門(mén)和一個(gè)異或門(mén)就可以實(shí)現(xiàn)二進(jìn)制加法:上述電路就是一個(gè)簡(jiǎn)單的加法器,就問(wèn)你神奇不神奇,加法可以用與或非門(mén)實(shí)現(xiàn),其它的也一樣能實(shí)現(xiàn),邏輯完備嘛。
除了加法,我們也可以根據(jù)需要將不同的算數(shù)運(yùn)算設(shè)計(jì)出來(lái),負(fù)責(zé)計(jì)算的電路有一個(gè)統(tǒng)稱(chēng),這就是所謂的arithmetic/logic unit,ALU,CPU 中專(zhuān)門(mén)負(fù)責(zé)運(yùn)算的模塊,本質(zhì)上和上面的簡(jiǎn)單電路沒(méi)什么區(qū)別,就是更加復(fù)雜而已?,F(xiàn)在,通過(guò)與或非門(mén)的組合我們獲得了計(jì)算能力,計(jì)算能力就是這么來(lái)的。但,只有計(jì)算能力是不夠的,電路需要能記得住信息。
神奇的記憶能力到目前為止,你設(shè)計(jì)的組合電路比如加法器天生是沒(méi)有辦法存儲(chǔ)信息的,它們只是簡(jiǎn)單的根據(jù)輸入得出輸出,但輸入輸出總的有個(gè)地方能夠保存起來(lái),這就是需要電路能保存信息。電路怎么能保存信息呢?
你不知道該怎么設(shè)計(jì),這個(gè)問(wèn)題解決不了你寢食難安,吃飯時(shí)在思考、走路時(shí)在思考,蹲坑時(shí)在思考,直到有一天你在夢(mèng)中遇一位英國(guó)物理學(xué)家,他給了你這樣一個(gè)簡(jiǎn)單但極其神奇的電路:這是兩個(gè)NAND門(mén)的組合,不要緊張,NAND也是有你設(shè)計(jì)的與或非門(mén)組合而成的,所謂NAND門(mén)就是與非門(mén),先與然后取非,比如給定輸入1和0,那么與運(yùn)算后為0,非運(yùn)算后為1,這就是與非門(mén),這些不重要。比較獨(dú)特的是該電路的組合方式,一個(gè)NAND門(mén)的輸出是兩一個(gè)NAND門(mén)的輸入,該電路的組合方式會(huì)自帶一種很有趣的特性,只要給S和R段輸入1,那么這個(gè)電路只會(huì)有兩種狀態(tài):
要么a端為1,此時(shí)B=0、A=1、b=0;
要么a端為0,此時(shí)B=1、A=0、b=1;
不會(huì)再有其他可能了,我們把a(bǔ)端的值作為電路的輸出。此后,你把S端置為0的話(huà)(R保持為1),那么電路的輸出也就是a端永遠(yuǎn)為1,這時(shí)就可以說(shuō)我們把1存到電路中了;而如果你把R段置為0的話(huà)(S保持為1),那么此時(shí)電路的輸出也就是a端永遠(yuǎn)為0,此時(shí)我們可以說(shuō)把0存到電路中了。就問(wèn)你神奇不神奇,電路竟然具備存儲(chǔ)信息的能力了。
現(xiàn)在為保存信息你需要同時(shí)設(shè)置S端和R端,但你的輸入是有一個(gè)(存儲(chǔ)一個(gè)bit位嘛),為此你對(duì)電路進(jìn)行了簡(jiǎn)單的改造:這樣,當(dāng)D為0時(shí),整個(gè)電路保存的就是0,否則就是1。
寄存器與內(nèi)存的誕生現(xiàn)在你的電路能存儲(chǔ)一個(gè)比特位了,想存儲(chǔ)多個(gè)比特位還不簡(jiǎn)單,復(fù)制粘貼就可以了:我們管這個(gè)組合電路就叫寄存器,你沒(méi)有看錯(cuò),我們常說(shuō)的寄存器就是這個(gè)東西。你不滿(mǎn)足,還要繼續(xù)搭建更加復(fù)雜的電路以存儲(chǔ)更多信息,同時(shí)提供尋址功能,就這樣內(nèi)存也誕生了。寄存器及內(nèi)存都離不開(kāi)上一節(jié)那個(gè)簡(jiǎn)單電路,只要通電,這個(gè)電路中就保存信息,但是斷電后很顯然保存的信息就丟掉了,現(xiàn)在你應(yīng)該明白為什么內(nèi)存在斷電后就不能保存數(shù)據(jù)了吧。
硬件還是軟件?現(xiàn)在我們的電路可以計(jì)算數(shù)據(jù)、也可以存儲(chǔ)信息,但現(xiàn)在還有一個(gè)問(wèn)題,那就是盡管我們可以用AND、OR、NOT表達(dá)出所有的邏輯函數(shù),但我們真的有必要把所有的邏輯運(yùn)算都用與或非門(mén)實(shí)現(xiàn)出來(lái)嗎?這顯然是不現(xiàn)實(shí)的。這就好比廚師,你沒(méi)有聽(tīng)說(shuō)只專(zhuān)做一道菜的廚師然后酒店要把各個(gè)菜系廚師雇全才能做出一桌菜來(lái)吧!
中國(guó)菜系博大精深,千差萬(wàn)別,但制作每道菜品的方式大同小異,其中包括刀工、顛勺技術(shù)等,這些是基本功,制作每道菜品都要經(jīng)過(guò)這些步驟,變化的也無(wú)非就是食材、火候、調(diào)料等,這些放到菜譜中即可,這樣給廚師一個(gè)菜譜他就能制作出任意的菜來(lái),在這里廚師就好比硬件,菜譜就好比軟件。同樣的道理,我們沒(méi)有必要為所有的計(jì)算邏輯實(shí)現(xiàn)出對(duì)應(yīng)的硬件,硬件只需要提供最基本的功能,最終所有的計(jì)算邏輯都通過(guò)這些最基本的功能用軟件表達(dá)出來(lái)就好,這就是所謂的軟件一詞的來(lái)源,硬件不可變,但軟件可變,不變的是硬件但提供不同的軟件就能讓硬件實(shí)現(xiàn)全新的功能,無(wú)比天才的思想,人類(lèi)真的是太聰明了。
同樣一臺(tái)計(jì)算機(jī)硬件,安裝上word你就能編輯文檔,安裝上微信你就能讀到碼農(nóng)的荒島求生公眾號(hào)、安裝上游戲你就能玩王者農(nóng)藥,硬件還是那套硬件,提供不同的軟件就是實(shí)現(xiàn)不同的功能,每次打開(kāi)電腦使用各種App時(shí)沒(méi)有在內(nèi)心高呼一聲牛逼你都對(duì)不起計(jì)算機(jī)這么偉大的發(fā)明創(chuàng)造,這就是為什么計(jì)算機(jī)被稱(chēng)為通用計(jì)算設(shè)備的原因,這一思想是計(jì)算機(jī)科學(xué)祖師爺圖靈提出的。扯遠(yuǎn)了,接下來(lái)我們看下硬件是怎么提供所謂的基本功能的。
硬件的基本功讓我們來(lái)思考一個(gè)問(wèn)題,CPU怎么能知道自己要去對(duì)兩個(gè)數(shù)進(jìn)行加法計(jì)算,以及哪兩個(gè)數(shù)進(jìn)行加法計(jì)算呢?很顯然,你得告訴CPU,該怎么告訴呢?還記得上一節(jié)中給廚師的菜譜嗎?沒(méi)錯(cuò),CPU也需要一張菜譜告訴自己該接下來(lái)該干啥,在這里菜譜就是機(jī)器指令,指令通過(guò)我們上述實(shí)現(xiàn)的組合電路來(lái)執(zhí)行。
接下來(lái)我們面臨另一個(gè)問(wèn)題,那就是這樣的指令應(yīng)該會(huì)很多吧,廢話(huà),還是以加法指令為例,你可以讓CPU計(jì)算1+1,也可以計(jì)算1+2等等,實(shí)際上單單加法指令就可以有無(wú)數(shù)種組合,顯然CPU不可能去實(shí)現(xiàn)所有的指令。實(shí)際上CPU只需要提供加法操作,你提供操作數(shù)就可以了,CPU 說(shuō):“我可以打人”,你告訴CPU該打誰(shuí)、CPU 說(shuō):“我可以唱歌”,你告訴CPU唱什么,CPU 說(shuō)我可以做飯,你告訴CPU該做什么飯,CPU 說(shuō):“我可以炒股”,你告訴CPU快滾一邊去吧韭菜。
因此我們可以看到CPU只提供機(jī)制或者說(shuō)功能(打人、唱歌、炒菜,加法、減法、跳轉(zhuǎn)),我們提供策略(打誰(shuí)、歌名、菜名,操作數(shù),跳轉(zhuǎn)地址)。CPU 表達(dá)機(jī)制就通過(guò)指令集來(lái)實(shí)現(xiàn)的。
指令集指令集告訴我們 CPU 可以執(zhí)行什么指令,每種指令需要提供什么樣的操作數(shù)。不同類(lèi)型的CPU會(huì)有不同的指令集。指令集中的指令其實(shí)都非常簡(jiǎn)單,畫(huà)風(fēng)大體上是這樣的:
從內(nèi)存中讀一個(gè)數(shù),地址是abc
對(duì)兩個(gè)數(shù)加和
檢查一個(gè)數(shù)是不是大于6
把這數(shù)存儲(chǔ)到內(nèi)存,地址是abc
等等
看上去很像碎碎念有沒(méi)有,這就是機(jī)器指令,我們用高級(jí)語(yǔ)言編寫(xiě)的程序,比如對(duì)一個(gè)數(shù)組進(jìn)行排序,最終都會(huì)等價(jià)轉(zhuǎn)換為上面的碎碎念指令,然后 CPU 一條一條的去執(zhí)行,很神奇有沒(méi)有。接下來(lái)我們看一條可能的機(jī)器指令:這條指令占據(jù)16比特,其中前四個(gè)比特告訴CPU這是加法指令,這意味著該CPU的指令集中可以包含2^4也就是16個(gè)機(jī)器指令,這四個(gè)比特位告訴CPU該做什么,剩下的bit告訴CPU該怎么做,也就是把寄存器R6和寄存器R2中的值相加然后寫(xiě)到寄存器R6中。
可以看到,機(jī)器指令是非常繁瑣的,現(xiàn)代程序員都使用高級(jí)語(yǔ)言來(lái)編寫(xiě)程序,關(guān)于高級(jí)程序語(yǔ)言以及機(jī)器指令的話(huà)題請(qǐng)參見(jiàn)《你管這破玩意叫編程語(yǔ)言?》。
指揮家:讓我們演奏一曲現(xiàn)在我們的電路有了計(jì)算功能、存儲(chǔ)功能,還可以通過(guò)指令告訴該電路執(zhí)行什么操作,還有一個(gè)問(wèn)題沒(méi)有解決。
我們的電路有很多部分,用來(lái)計(jì)算的、用來(lái)存儲(chǔ)的,以最簡(jiǎn)單的加法為例,假設(shè)我們要計(jì)算1+1,這兩個(gè)數(shù)分別來(lái)自寄存器R1 和 R2,要知道寄存器中可以保存任意值,我們?cè)趺茨艽_保加法器開(kāi)始工作時(shí)R1和R2中在這一時(shí)刻保存的都是1而不是其它數(shù)?即,我們靠什么來(lái)協(xié)調(diào)或者說(shuō)靠什么來(lái)同步電路各個(gè)部分讓它們協(xié)同工作呢?就像一場(chǎng)成功的交響樂(lè)演離不開(kāi)指揮家一樣,我們的計(jì)算組合電路也需要這樣一個(gè)指揮家。負(fù)責(zé)指揮角色的就是時(shí)鐘信號(hào)。
時(shí)鐘信號(hào)就像指揮家手里拿的指揮棒,指揮棒揮動(dòng)一下整個(gè)樂(lè)隊(duì)會(huì)整齊劃一的有個(gè)相應(yīng)動(dòng)作,同樣的,時(shí)鐘信號(hào)每一次電壓改變,整個(gè)電路中的各個(gè)寄存器(也就是整個(gè)電路的狀態(tài))會(huì)更新一下,這樣我們就能確保整個(gè)電路協(xié)同工作不會(huì)這里提到的問(wèn)題?,F(xiàn)在你應(yīng)該知道CPU的主頻是什么意思了吧,主頻是說(shuō)一秒鐘指揮棒揮動(dòng)了多少次,顯然主頻越高CPU在一秒內(nèi)完成的操作也就越多。
大功告成現(xiàn)在我們有了可以完成各種計(jì)算的ALU、可以存儲(chǔ)信息的寄存器以及控制它們協(xié)同工作的時(shí)鐘信號(hào),這些統(tǒng)稱(chēng) Central Processing Unit,簡(jiǎn)稱(chēng)就是 CPU。
總結(jié)一個(gè)小小的開(kāi)關(guān)竟然能構(gòu)造出功能強(qiáng)大的 CPU ,這背后理論和制造工藝的突破是人類(lèi)史上的里程碑時(shí)刻,說(shuō) CPU 是智慧的結(jié)晶簡(jiǎn)直再正確不過(guò)。
本文從一枚開(kāi)關(guān)開(kāi)始講解了 CPU 構(gòu)造的基本原理,希望這篇對(duì)大家理解 CPU 有所幫助。
責(zé)任編輯:haq
-
開(kāi)關(guān)
+關(guān)注
關(guān)注
19文章
3142瀏覽量
93776 -
電路
+關(guān)注
關(guān)注
172文章
5954瀏覽量
172625 -
cpu
+關(guān)注
關(guān)注
68文章
10891瀏覽量
212460
原文標(biāo)題:你管這破玩意叫 CPU ?
文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論