晶片現在做到哪一步了?
我們有了256位元組的RAM,有了暫存器、匯流排。我們把CPU框圖展現出來(紅框表示已經做完的部分):
R0\R1\R2\R3是4個通用功能暫存器。TMP\ACC是一個關鍵器件(馬上揭曉)的輸入、輸出暫存器。其中ACC透過匯流排既做輸入,也做輸出。ACC全稱“accumulate ”。
現在我們的晶片還只能支援“透過匯流排讀寫暫存器、記憶體”,其他什麼都幹不了。下面我們就給它加上最關鍵的功能:ALU。
ALU
ALU全稱“arithmetic and logic unit”(算數運算和邏輯運算單元)。
算數運算:加、減、乘、除、左移、右移。(卷積等複雜的數學運算,我們這個晶片就不支援了。DSP晶片乾的就這活兒)。
邏輯運算:大於、小於、等於、非、或、與、異或。(同樣也不支援集合運算等複雜邏輯運算。熱門的NPU晶片就能做複雜的邏輯運算)。
有了ALU,晶片才算有了“能力”,要不然晶片只能讀、寫記憶體,那還要它幹啥。
1位加法
從最簡單的問題出發,我們先看下如何完成1位的加法。
先只考慮:0+0=0,0+1=1,1+1=0。很容易想到如下電路:
1+1=0的同時,還要產生一個進位。我們得把產生的進位考慮進去,再加一個輸出表示是否有進位:
0+0=0,我們只考慮了最低位計算的情況,如果是高位計算,低位有進位怎麼辦?再加一個輸出表示低位是否有進位:
完事。是不是很easy,從簡單到複雜。我們會一直遵循這個方法解決問題。
8位加法
8位加法就簡單了,並聯我們的1位加法電路。把前一個的移位輸出作為下一個的輸入。
左移
這個貌似最簡單。無腦畫電路圖:
其他數學運算
減、乘、除最後都可以用乘法和位移運算搞定。大家可以隨便找本計算機教科書來參考。
邏輯運算
都有現成的閘電路可以使用。只不過資料寬度記得是8(匯流排的資料寬度)。
組合所有運算電路
ALU可以支援多種運算,那種運算實際生效呢?還記得我們用4X16譯碼器選擇RAM中的位元組。同樣我們可以利用譯碼器作為開關位,選中那種運算實際生效。