ALU是算術邏輯單元,是CPU中重要的一部分,因為CPU本質上就是不斷重復最簡單的計算。而我們這一版CPU的ALU部分更為簡單,是一個只能做加法的ALU。
理論部分
我們需要一個能幫我們進行數學計算的電路設計。一旦打通了這一關,可以說你已經了解了計算機的全部,因為計算機所做的一切,就只有計算,更絕對一點說,計算的一切,也就只有加法。在這里我做一個大膽的假設,正在閱讀這篇文章的你已經知道了二進制的含義,那如何給自己做一個8位二進制數的加法計算器呢?它大概應該是這個樣子。
其實這不是一個新知識,我相信給你足夠的時間你一定會設計出來,你不妨在此暫停一段時間拿出一張紙試試。我們先從最簡單的一位數相加開始,如何設計出一個一位數相加的計算器呢?我們首先應該整理出這樣一張清晰的表,它列出了對每一種可能的輸入情況所對應的輸出結果,即 0+0=00;0+1=01;1+0=01;1+1=10,這種表叫做真值表。這里我們直接將進位也考慮進來。
加數A | 加數B | 加和輸出S | 進位輸出C1 |
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
有了真值表之后,我們就可以通過基本的邏輯運算來得到一個邏輯表達式。運算過程如下:
其中,加號(+)表示“或”運算,而輸入項之間省略的乘號則表示“與”運算。我們選出所有能使結果為1的輸入項組合,再進行取反操作和與運算,再使每項之間通過或運算相連。對此有疑惑的同學可以自己模擬一遍上面的運算過程,大概就能知道為什么要這么做了。
由運算結果我們得知,和就是異或門,進位就是與門。畫出來就是下面這個樣子,由於我們只考慮了向后進位,而沒有考慮前一個數的進位,因此我們稱這種裝置為半加器。
如果將前一個進位考慮進來,只需再多一個半加器就可以了,至於為什么進位輸出的加和沒有用半加器而是用了一個或門,請暫停一分鍾思考一下。這回我們已經建立好了一個完美的一位計算器,我們便可以自豪地稱之為全加器。
全加器的邏輯實現我們同樣可以用上面提到的真值表來完成。下面是全加器的真值表。
進位輸入C0 | 加數A | 加數B | 進位輸出C1 | 加和輸出S |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
對應的邏輯表達式如下:
一位計算器做出來之后,8位計算器就只需將全加器逐個拼起來即可,並且再次抽象整體,我們稱之為8位加法器。
OK,大功告成。我不知道你此時的感受如何,不知不覺我們連續進行了3次抽象(即把之前的器件封裝起來),有沒有深刻體會到之前所說的你必須開始習慣這種抽象。每當一個復雜的構造被裝進一個黑盒子里時,你便再也不要考慮里面的構造了,只要你做到了這一點,這三步的抽象便會是so easy。有了加法計算器,減法也就不是問題了,在本博客中將略去這部分內容,如果有興趣,可以去了解一下計算機是如何用補碼表示減法的,之后你會發現,減法就是加法。
實操部分
同8位的寄存器一樣,插在我們面包板上的ALU,同樣直接用一個集成電路實現,74LS283,以下為針腳圖:
- A1-A4:加數A
- B1-B4:加數B
- C0:進位輸入
- S1-S4:加和輸出
- C4:進位輸出
將兩個拼一起則就是一個8位的加法器,同之前做的寄存器(兩個)接在一起,輸出到總線端再接一個三態控制,就完成了整個電路。
這個加法器不像之前的寄存器,有控制是否存入數據的信號,它無論如何都直接將加和計算出並從輸出端輸出。我們開啟clk,手動將寄存器A(紅色燈泡)和B(藍色燈泡)設置幾個數,就會看到ALU輸出加和結果(黃色的燈泡,擠死了。。。)
參考視頻:eater.net