cpu的電路是如何一步步設計出來的

工业原理
9粉絲
2026年6月8日
這麼小的一塊CPU芯片,是如何執行復雜的程序代碼的呢?
首先代碼通過計算機編譯後,會解析成彙編指令,彙編指令接着會被翻譯成二進制。
這些二進制最終會被存入計算機的內存中。
爲了便於理解,我們將其中一行彙編指令簡化成這樣。
指令的意思就是,夾載內存地址爲1101位置的數據,
然後將夾載的數據存入CPU的R1寄存器裏面。
爲了將內存數據傳入到寄存器,
我們需要使用數據總線與寄存器連接起來,
同時還需要提供一個地址總線,告訴寄存器從內存哪個位置讀取數據,
外加一根讀取標誌和一根寫入標誌來控制讀寫。
現在我們再來執行這行指令,只需將讀取標誌激活,
地址值爲1000位置的數據就會被讀取到。
由於指令是存入到R2寄存器裏面,
所以只需將R2寄存器的寫入標誌打開,數據就能存入進來了。
除了從內存讀取數據到寄存器,
反過來我們還可以將寄存器的數據存到內存,
比如這條指令,意思就是將寄存器R1位置的數據,
存儲到內存地址爲0110的位置,
所以寄存器R1的讀取標誌首先要打開,
然後根據地址值0110找到內存位置,
接着將內存的寫入標誌打開,
R1位置的數據就成功寫入到內存地址爲0110的位置了。
現在有個問題,這些讀寫標誌和數據總線都是如何控制的呢?
對於CPU寄存器的讀寫標誌,
可以使用兩個解碼器來解決,
向解碼器輸入不同的二進制值,會激活不同的輸出線,
問題是解碼器的輸入值從哪裏來呢?
答案就隱藏在這些彙編指令中。
前面說過,彙編指令最終會被解析成二進制數據,
我們將二進制的前兩位拆開,
其中00代表算術運算,
接下來的兩位是操作碼,
00代表加法運算,
10代表減法運算,
接着第五和第六位,
以及第七和第八位,
分別代表從哪兩個寄存器取值。
如果前兩位不是00,
那麼就不是算術運算,
比如01代表的是加載指令,
而10則代表存儲指令,
這兩個指令的第三和第四位代表的是
加載或存儲數據所需的寄存器,
最後四位代表要加載或存儲數據的內存地址。
接着我們將二進制的前兩位作爲值,
輸入到一個解碼器中,
這個解碼器用於選擇具體要執行的操作,
上面的四根線分別代表算術運算,
加載數據,存儲數據,
以及控制流,
根據二進制前兩位的不同,
會分別激活不同的操作。
剛纔說過,
對於存儲指令,
第三四位代表的是存入哪個寄存器,
所以這兩位二進制,
剛好可以連接到上面兩個解碼器,
用於選擇具體的寄存器。
但是有個問題,
當輸入01時,
R1的讀取和寫入標誌都被激活了,
也就是圖中黃色的線。
問題是讀取和寫入標誌只能有一個被激活,
所以爲了解決這個問題,
我們需要在它們中間加上語門電路,
同時將下面解碼器的加載和存儲輸出線,
分別連接到語門電路。
對於存儲指令,
存儲輸出線會激活,
又由於01會激活這個解碼器的第二根線,
所以這個語門的兩個輸入端都被激活了。
語門電路的特性是隻要兩個輸入端都被激活,
輸出端就會被激活,
所以最終只有R1讀取標誌被激活了,
然後根據不同的值,
可以激活不同的寄存器。
對於加載指令,
也是一樣的道理。
到這裏,
就剩下指令的最後4位沒有解釋了。
這4位對應內存的地址總線,
比如0110,
對應內存中的1100,
1101,
現在我們將加載數據線與內存的讀取線相連接,
那麼加載數據線激活時,
內存的讀取線也會激活,
所以最終內存0110位置的數據,
會被存儲到寄存器R0裏面。
如果指令是存儲指令,
那麼存儲數據線會與內存的寫入線相連接,
從而激活內存的寫入標誌,
所以最終會將R2寄存器裏面的數據,
存儲到內存地址爲1111的位置。
需要注意的是,
執行指令之前,
指令本身也是需要加載到一個特定的寄存器的,
稱爲指令寄存器。
另外解碼器這邊的電路其實是可以進一步簡化的,
我們可以將上面的兩個解碼器改爲一個,
達到的目的是一樣的。
到這裏,
如何加載和存儲數據我們已經講清楚了,
那寄存器拿到數據後,
是如何進行算術運算的呢?
爲了方便理解,
我們先將加載和存儲數據的這部分電路隱藏掉,
然後引入一個算術邏輯單元。
關於算術邏輯單元,
前幾期視頻已經講解過,
這裏就簡單過一下。
算術邏輯單元接收兩個輸入值,
然後根據操作碼的不同,
比如如果操作碼爲00,
那麼代表加法,
算術邏輯單元內部就會做相應的加法運算,
從而將最終結果輸出出來。
對於算術運算指令,
第三第四位的二進制就代表操作碼,
所以我們可以將這兩位傳輸給算術邏輯單元的操作碼。
對於算術邏輯單元的兩個輸入,
我們可以直接與寄存器的總線相連接,
但是這樣一來,
算術邏輯單元就只能固定死與寄存器R1和R3交互了。
爲了更加靈活,
我們可以設計成根據不同的輸入值,
可以選擇不同的寄存器,
然後內部電路這麼連接,
這樣一來,
我們就實現了一個多路附用器。
爲了便於理解,
我們將多路附用器封裝起來,
同時爲了方便查看,
我們將不同的寄存器,
以不同的顏色表示,
然後將兩個多路附用器連接到計算邏輯單元的兩個輸入端,
接着每個寄存器再與兩個多路附用器分別相連,
同時將算術輸出線與寄存器的讀取標誌線相連接,
而算術指令的後4位01和11,
可以作爲兩個多路附用器的輸入,
從而將R1和R3的數據,
發送到算術邏輯單元,
由於算術指令的操作碼10代表減法,
所以算術邏輯單元就會對獲取的兩個數據,
做減法運算,
最終得到輸出結果,
當然這個電路做了非常大的簡化,
然後將前面的加載和存儲電路加入進來,
再加入其他電路,
然後將整個電路再封裝起來,
這就組成了一個控制單元,
接着將算術邏輯單元與控制單元關聯起來,
控制單元裏面有一個存儲指令的指令寄存器,
同時還有一個地址寄存器,
旁邊的這些是記錄狀態的,
可以先不管,
到這裏其實我們就設計了一個簡單的CPU,
在CPU通電後,
所有的寄存器裏面的默認值都是0,
所以寄存器裏面的值需要從內存裏面進行獲取,
由於地址寄存器的初始值爲0000,
所以控制器會從內存地址爲0000的位置拿到指令,
然後存入指令寄存器中,
接着指令寄存器內部的電路就會解析指令寄存器中的指令,
解析後指令的意思是,
從內存中1110的位置獲取所需數據,
然後存入到20寄存器,
執行完後,
指令寄存器的值會增加1,
得到0001,
然後控制器就會從內存地址爲0001的位置拿到指令,
然後繼續存入指令寄存器,
接着還是一樣解析指令,
指令意思是從內存地址爲1111的位置拿到數據,
然後存入21寄存器中,
接着地址寄存器的值繼續增加到0010,
繼續將數據從內存拿到指令寄存器,
解析後,
是一個算數運算指令,
指令的意思是,
將20和21寄存器的數據進行相加,
所以控制器會激活20和21寄存器的讀取標誌,
從而將數據發送給算數邏輯單元,
算數指令的操作碼00代表加法,
所以算數邏輯單元就會進行加法運算,
最終將結果計算出來,
並存儲到一個臨時的寄存器中,
臨時寄存器會將數據複製到20寄存器內,
接着地址寄存器的值增加到0011,
然後根據這個地址值,
將指令繼續存入指令寄存器,
解析後指令意思爲,
將20裏面的數據存儲到內存地址爲1101的位置上,
最終控制器會按照這個地址值,
將計算結果存入內存,
到這裏,一次簡單的CPU運算才真正計算完成。
