計算機用二進制存儲數(shù)字的目的是為了計算,而計算的過程是由“算術邏輯單元”來完成的。
那什么是算術邏輯單元?
算術邏輯單元(Arithmetic and Logic Unit)簡稱ALU,就是負責實現(xiàn)計算機里的多組算術運算和邏輯運算的組合邏輯電路。
看看上面這個實物,圖片中是最著名的ALU——英特爾74181,1970年發(fā)布,當時它是第一個完全被封裝在單個芯片里的完整ALU,對人們來說這是一個驚人的工程。
今天,讓我們一起用布爾邏輯門來構建一個簡單的與74181功能相同的ALU電路吧。
在構建ALU之前,我們要知道ALU電路包含2個單元,一個是算術單元和一個是邏輯單元。
我們先從算術單元開始,算術單元負責計算機中所有的數(shù)字操作,比如加減法,當然它還會做一些其他簡單的事,比如給某個數(shù)字加1,這叫增量運算。
在算術單元中,我們會用到AND,OR,NOT和XOR邏輯門,最簡單的加法電路,就是有2個二進制的輸入:A和B,還有1個就是輸出,即兩個二進制數(shù)字的和。
假設A和B都是只有一個bit,即0或1,那A和B的運算就只有下列四種可能的組合:
0+0=0
1+0=1
0+1=1
1+1=10
提醒一下,在二進制里,1代表true,0代表false,所以這組輸入和輸出的前三種可能與XOR門的邏輯關系是一樣。
第四中輸入組合,顯然1+1≠2,因為在二進制里是沒有2的,所以結果是0,將1進位到下一位,和為二進制的“10”,對于XOR門的輸出,只對了一部分,即1加1,輸出0,這個時候,我們只需要一根額外的線來代表進位,即只有當輸入是1和1時,進位才是“true”。
針對上面出現(xiàn)的問題,我們可以把AND門加到電路中,即當兩個輸入都為“true”時,輸出才為“true”,這樣就組成了“半加器”電路。
如果你想處理大于1+1的情況,就需要“全加器”(full adder),全加器比半加器復雜點,它有3個bit的輸入:A、B、C,所以最大可能輸入為:1+1+1,總和1,進位1,因此需要兩條輸出線,即進位線與總和線。
其實,我們也可以用半加器來實現(xiàn)全加器的功能,先用半加器將A和B相加,然后把C輸入到第二個半加器中,最后用一個OR門檢查進位是不是true就可以了。
現(xiàn)在,我們可以做一個兩個8 Bit進行相加的電路,這兩個8 bit分別為A和B,看下圖:
我們從A和B的第一位開始相加,第一位分別稱為A0和B0,因為只有2個數(shù),所以用一個半加器就可以,我們將它倆的和稱為Sum0,考慮到A1和B1相加的時候可能會有A0和B0相加的進位,就會有3個數(shù),所以從A1和B1相加開始就得用全加器,然后依次類推,搞定8個bit的相加,這叫 “8位脈動進位加法器”。
請注意:A7和B7的全加器有“進位”輸出,如果它倆相加有輸出進位,代表數(shù)字A和B相加,和超過了8位,這叫“溢出”(overflow)。如果想避免溢出,就得加更多全加器,然后相加16或32位數(shù)字,這就會讓溢出更難發(fā)生,但缺點是每次進位都要一點時間向前移動。
簡單的ALU沒有專門的電路去處理乘法和除法,而是用多次加法實現(xiàn)乘法運算,比如:可以將12加5次來實現(xiàn)12乘以5。
當然,不用去擔心我們現(xiàn)在的筆記本和手機,因為他們有更好的處理器,可以專門做乘法的算術單元哦。
關于算術單元我們說的很多了,現(xiàn)在,我們來說一下ALU的另一半:邏輯單元。邏輯單元執(zhí)行的是邏輯操作,像之前討論過的AND,OR和NOT操作,當然也可以執(zhí)行簡單的數(shù)值測試,比如檢查數(shù)字的正負。
上圖是檢查ALU的輸出是否為0的電路,用了一堆OR門來檢查其中一位是否為1,哪怕只有一個Bit (位)是1,我們就可以肯定那個數(shù)字肯定不是0,然后用一個NOT門取反,所以只有輸入的數(shù)字為0時,輸出才為1。
到此,我們已經(jīng)對ALU進行了一個高層次的概括,甚至做了幾個主要組件,比如脈動進位加法器,雖然只是巧妙的將一大堆邏輯門連在了一起。我們再回到開始時說的ALU,英特爾74181,它只有4位輸入,而我們剛才介紹的是8位輸入,是74181的兩倍哦!
雖然我們沒有做出ALU實物,但是我們應該已經(jīng)對ALU有了整體的概念,它的誕生打開了通向更強大電腦的大門。
由于ALU在市面的應用越來越多,工程師們?yōu)榱朔奖?,就用了一個看起來很像大“V”的符號來代表它。
一個4位的ALU需要很多邏輯門,一個8位的ALU需要的邏輯門肯定更多,我們工程師肯定不想在這里浪費很多時間,那就出現(xiàn)了一種便于ALU執(zhí)行所需要的操作代碼,這個后面有機會再詳細介紹給大家。
ALU除了輸出計算結果外,還會輸出一系列標志(Flag),這個標志代表特定狀態(tài)的1位(bit)輸出,例如,如果我們相減兩個數(shù)字,結果為0,我們的零測試電路就會將零標志設為True(1),這在確定兩個數(shù)字是否相等時是非常有用的。
當然這個標志位也可以用來判斷數(shù)字的大小和是否出現(xiàn)溢出等,如果使用的ALU越好,它的標志也會更多,但剛說的這3個標志是ALU普遍會用到的。
責任編輯:pj
-
計算機
+關注
關注
19文章
7494瀏覽量
87981 -
加法電路
+關注
關注
0文章
10瀏覽量
8159 -
ALU
+關注
關注
0文章
33瀏覽量
13101 -
華秋DFM
+關注
關注
20文章
3494瀏覽量
4527
發(fā)布評論請先 登錄
相關推薦
評論