今天我們將討論處理器。這可能是本系列中最復(fù)雜的內(nèi)容了。所以,一旦你理解了這些,你就完全掌握了。我們之前已經(jīng)制作了一個(gè)算術(shù)和邏輯單元(ALU),它接收二進(jìn)制數(shù)字并進(jìn)行計(jì)算。我們還制作了兩種類型的計(jì)算機(jī)存儲(chǔ)器:
現(xiàn)在是時(shí)候把這些組件整合起來(lái),構(gòu)建計(jì)算機(jī)的核心部分了,這就是中央處理單元(器)(Central Processing Unit),通常稱為CPU。 CPU的工作是執(zhí)行程序。像Microsoft Office、Safari或《半條命2》這樣的程序由一系列獨(dú)立的操作組成,被稱為指令,因?yàn)樗鼈儭爸甘尽庇?jì)算機(jī)該做什么。如果這些是數(shù)學(xué)指令,比如加法或減法,CPU會(huì)配置其ALU來(lái)執(zhí)行數(shù)學(xué)操作?;蛘咚赡苁谴鎯?chǔ)指令,在這種情況下,CPU會(huì)與內(nèi)存通信以讀取和寫入值。 CPU內(nèi)部有許多部件,我們將逐步構(gòu)建它的每個(gè)部分,重點(diǎn)放在功能模塊上,而不是每一根具體的導(dǎo)線。當(dāng)我們用一條線連接兩個(gè)組件時(shí),這只是所有必要導(dǎo)線的抽象表達(dá)。這種高級(jí)視圖被稱為微架構(gòu)。 首先,需要一些內(nèi)存。我們放入之前創(chuàng)建的RAM模塊。為了簡(jiǎn)化,我們假設(shè)它只有16個(gè)存儲(chǔ)位置,每個(gè)位置包含8位數(shù)據(jù)。 接著,為處理器提供四個(gè)8位寄存器,分別標(biāo)記為A、B、C和D,用于臨時(shí)存儲(chǔ)和處理數(shù)據(jù)。 我們已經(jīng)知道數(shù)據(jù)可以以二進(jìn)制值的形式存儲(chǔ)在內(nèi)存中,程序也可以存儲(chǔ)在內(nèi)存中。我們可以為每個(gè)CPU支持的指令分配一個(gè)ID。在這個(gè)示例中,前4位用于存儲(chǔ)操作代碼(opcode),后4位指定操作數(shù)據(jù)的位置——這可以是寄存器或內(nèi)存地址。 還需要兩個(gè)寄存器來(lái)完成CPU的構(gòu)建:
當(dāng)計(jì)算機(jī)首次啟動(dòng)時(shí),所有寄存器都初始化為0。 舉個(gè)例子,我們已經(jīng)在RAM中初始化了一個(gè)簡(jiǎn)單的計(jì)算機(jī)程序,我們將逐步講解它。 CPU的第一階段是取指令(Fetch Phase) 首先,我們將指令地址寄存器連接到RAM模塊。寄存器的值為0,因此RAM返回存儲(chǔ)在地址0的值——例如0010 1110。然后,這個(gè)值被復(fù)制到指令寄存器中。 接下來(lái)是指令解碼階段(Decode Phase),即確定指令的含義并準(zhǔn)備執(zhí)行。在此示例中,操作碼為0010,對(duì)應(yīng)于“LOAD A”指令,即將RAM中的值加載到寄存器A中。RAM地址是指令的最后四位1110(十進(jìn)制為14)。 指令由一個(gè)控制單元(Control Unit)解碼和解釋。像我們之前構(gòu)建的組件一樣,控制單元也是由邏輯門組成的。例如,要識(shí)別一條LOAD A指令,我們需要一個(gè)電路來(lái)檢查操作碼是否為0010,這可以用一些邏輯門來(lái)實(shí)現(xiàn)。 執(zhí)行階段(Execute Phase) 因?yàn)檫@是LOAD A指令,我們需要確保該值僅保存到寄存器A中,而不會(huì)寫入其他寄存器。為此,我們將RAM的數(shù)據(jù)線連接到所有四個(gè)寄存器的數(shù)據(jù)輸入端,同時(shí)使用LOAD_A檢查電路只使能寄存器A的寫入功能。這樣,我們成功地將RAM地址14中的值加載到了寄存器A中。 完成這條指令后,可以關(guān)閉所有連接線路,準(zhǔn)備從內(nèi)存中獲取下一條指令。為此,我們將指令地址寄存器的值加1,完成執(zhí)行階段。 其他指令 LOAD_A只是CPU可以執(zhí)行的眾多指令之一。不同的指令由不同的解碼電路處理,這些電路配置CPU的各個(gè)組件以執(zhí)行相應(yīng)的操作。 為了簡(jiǎn)化,我們將所有解碼電路封裝為一個(gè)單一的控制單元(Control Unit),這是一個(gè)新的抽象層次??刂茊卧愃朴跇?lè)團(tuán)的指揮,協(xié)調(diào)CPU的各個(gè)部分協(xié)同工作。 完成一次完整的取指-解碼-執(zhí)行循環(huán)后,就可以從取指階段重新開(kāi)始。例如,此時(shí)指令地址寄存器的值變?yōu)?,因此RAM返回地址1處的值——0001 1111。 在解碼階段,操作碼0001對(duì)應(yīng)于LOAD B指令,即將RAM中的值加載到寄存器B中。這次的內(nèi)存地址是1111(十進(jìn)制為15)。執(zhí)行階段中,控制單元配置RAM讀取地址15,并將寄存器B設(shè)置為接收數(shù)據(jù)。最終,我們將值00001110(十進(jìn)制為14)成功存儲(chǔ)到了寄存器B中。完成此循環(huán)后,再次將指令地址寄存器的值加1。 加法指令(ADD) 下一條指令有所不同。假設(shè)取回的指令是1000 01 00。操作碼1000表示加法指令(ADD)。與之前的指令不同,這條指令使用兩組2位數(shù)據(jù),而不是4位的RAM地址。2位可以編碼4種值,因此足以選擇4個(gè)寄存器中的任意一個(gè)。第一組2位是01,對(duì)應(yīng)于寄存器B;第二組2位是00,對(duì)應(yīng)于寄存器A。因此,這條指令的含義是將寄存器B中的值加到寄存器A中。 執(zhí)行這條指令需要將ALU集成到CPU中。控制單元負(fù)責(zé)選擇正確的寄存器作為輸入,并配置ALU執(zhí)行正確的操作。對(duì)于這條加法指令,控制單元使能寄存器B,并將其值傳遞給ALU的第一個(gè)輸入;同時(shí)使能寄存器A,并將其值傳遞給ALU的第二個(gè)輸入。ALU可以執(zhí)行多種操作,因此控制單元必須通過(guò)傳遞加法操作碼來(lái)配置ALU執(zhí)行加法操作。 計(jì)算結(jié)果不能直接寫回寄存器A,因?yàn)檫@樣會(huì)導(dǎo)致新值再次被輸入ALU,形成自加循環(huán)。為避免這種情況,控制單元使用一個(gè)內(nèi)部寄存器臨時(shí)保存ALU的輸出,關(guān)閉ALU后,再將值寫入目標(biāo)寄存器。在這個(gè)例子中,輸入值是3和14,因此結(jié)果是17(二進(jìn)制為00010001),現(xiàn)在已存儲(chǔ)在寄存器A中。最后,將指令地址寄存器的值加1,完成本次循環(huán)。 存儲(chǔ)指令(STORE_A) 下一條指令是0100 1101。解碼后發(fā)現(xiàn),操作碼0100表示STORE_A指令,目標(biāo)地址是RAM中的13。執(zhí)行時(shí),將地址發(fā)送到RAM模塊,并啟用RAM的寫入功能。同時(shí),啟用寄存器A的讀取功能,利用數(shù)據(jù)線將寄存器A中的值傳遞到RAM中指定的地址。這樣,就完成了第一段程序的運(yùn)行! 這段程序的功能是從內(nèi)存加載兩個(gè)值,將它們相加,然后將結(jié)果存儲(chǔ)回內(nèi)存。 通過(guò)逐步講解每一步,我手動(dòng)讓CPU完成了取指、解碼和執(zhí)行的各個(gè)階段。但每臺(tái)計(jì)算機(jī)內(nèi)部并沒(méi)有一個(gè)微型的“我”在手動(dòng)操作這些步驟。保持CPU按節(jié)奏運(yùn)行的責(zé)任交給了一個(gè)叫**時(shí)鐘(Clock)**的組件。 時(shí)鐘的作用 顧名思義,時(shí)鐘以精確且固定的時(shí)間間隔觸發(fā)電信號(hào)??刂茊卧褂眠@一信號(hào)推進(jìn)CPU的內(nèi)部操作,使所有部件保持同步——就像一艘羅馬戰(zhàn)船上的鼓手有節(jié)奏地?fù)艄?,確保每個(gè)劃槳手動(dòng)作一致,或者像節(jié)拍器一樣。 當(dāng)然,時(shí)鐘的速度不能太快,因?yàn)榧词故请娦盘?hào)也需要時(shí)間在電線上傳輸并穩(wěn)定下來(lái)。CPU執(zhí)行取指-解碼-執(zhí)行周期每一步的速度被稱為時(shí)鐘頻率(Clock Speed),用赫茲(Hertz)作為單位。一赫茲表示每秒完成一個(gè)周期。 早期CPU的發(fā)展 第一款單芯片CPU是1971年發(fā)布的Intel 4004,這是一款4位CPU。它的微架構(gòu)實(shí)際上和我們今天討論的例子非常相似。盡管它是第一款此類處理器,其時(shí)鐘頻率高達(dá)740千赫茲——也就是每秒740,000個(gè)周期。你可能覺(jué)得這已經(jīng)很快了,但和我們今天使用的處理器相比,它微不足道。1兆赫茲等于每秒1百萬(wàn)個(gè)時(shí)鐘周期,而你的電腦或手機(jī),其處理器的頻率無(wú)疑達(dá)到了幾千兆赫茲,也就是每秒數(shù)十億個(gè)時(shí)鐘周期。 超頻和降頻 你可能聽(tīng)說(shuō)過(guò)有人“超頻(overclocking)”他們的計(jì)算機(jī)。這是指通過(guò)修改時(shí)鐘信號(hào)來(lái)加快CPU的運(yùn)行速度,就像鼓手在戰(zhàn)船需要撞擊另一艘船時(shí)加快節(jié)奏一樣。芯片制造商通常設(shè)計(jì)CPU時(shí)會(huì)預(yù)留一些容差,以允許一定程度的超頻。但如果超頻過(guò)度,可能導(dǎo)致CPU過(guò)熱,或者信號(hào)跟不上時(shí)鐘節(jié)奏,從而出現(xiàn)錯(cuò)誤的結(jié)果。 雖然很少聽(tīng)到“降頻(underclocking)”,但它實(shí)際上非常實(shí)用。當(dāng)不需要CPU以全速運(yùn)行時(shí),比如用戶離開(kāi)計(jì)算機(jī)或者運(yùn)行的是一個(gè)負(fù)載較輕的程序,通過(guò)降低CPU速度可以節(jié)省大量電能。這對(duì)于依賴電池供電的設(shè)備(如筆記本電腦和智能手機(jī))尤為重要。 動(dòng)態(tài)頻率調(diào)整(Dynamic Frequency Scaling) 為了滿足不同需求,許多現(xiàn)代處理器可以根據(jù)負(fù)載情況增加或減少其時(shí)鐘頻率,這被稱為動(dòng)態(tài)頻率調(diào)整。這種技術(shù)在確保性能的同時(shí),顯著提高了能源效率。 總結(jié):完成CPU的構(gòu)建 隨著時(shí)鐘的加入,CPU構(gòu)建完成了?,F(xiàn)在,我們可以將其封裝成一個(gè)獨(dú)立的組件。這是又一個(gè)新的抽象層次!CPU和RAM通過(guò)地址線、數(shù)據(jù)線和使能線進(jìn)行通信。盡管我們?cè)O(shè)計(jì)的CPU是一個(gè)簡(jiǎn)化的例子,但其中討論的許多基本機(jī)制仍然可以在現(xiàn)代處理器中找到。 |
|
來(lái)自: 老胡說(shuō)科學(xué) > 《待分類》