ALU介紹
在計(jì)算機(jī)系統(tǒng)中,ALU(Arithmetic Logic Unit)是中央處理器的主要組成部分,它代表算術(shù)邏輯單元,執(zhí)行算術(shù)和邏輯運(yùn)算。它也稱為整數(shù)單元 (IU,integer unit),它是 CPU 或 GPU 內(nèi)的邏輯電路,是處理器中執(zhí)行計(jì)算的最后一個組件。它能夠執(zhí)行所有與算術(shù)和邏輯運(yùn)算相關(guān)的過程,例如加法、減法和移位運(yùn)算,包括布爾比較(XOR、OR、AND 和 NOT 運(yùn)算)。此外,二進(jìn)制數(shù)可以完成數(shù)學(xué)和按位運(yùn)算。ALU分為AU(算術(shù)單元)和LU(邏輯單元)。ALU 使用的操作數(shù)和代碼告訴它必須根據(jù)輸入數(shù)據(jù)執(zhí)行哪些操作。當(dāng) ALU 完成輸入處理后,信息被發(fā)送到計(jì)算機(jī)的內(nèi)存中。
圖2?ALU在四級流水中的示意圖
除了執(zhí)行與加法和減法相關(guān)的計(jì)算外,ALU 還可以處理兩個整數(shù)的乘法,因?yàn)樗鼈冎荚趫?zhí)行整數(shù)計(jì)算;因此,它的結(jié)果也是一個整數(shù)。但是,除法運(yùn)算通常不能由 ALU 執(zhí)行,因?yàn)槌ㄟ\(yùn)算可能會產(chǎn)生浮點(diǎn)數(shù)的結(jié)果。相反,浮點(diǎn)單元 (FPU,floating-point unit) 通常處理除法運(yùn)算;FPU 也可以執(zhí)行其他非整數(shù)計(jì)算。
浮點(diǎn)數(shù)的由來:用科學(xué)計(jì)數(shù)法的方式表示小數(shù)時,小數(shù)點(diǎn)的位置就變得「漂浮不定」了,這就是相對于定點(diǎn)數(shù),浮點(diǎn)數(shù)名字的由來。
圖2?浮點(diǎn)數(shù)示例
雖然 ALU 是處理器中的主要組件,但 ALU 的設(shè)計(jì)和功能在不同的處理器中可能會有所不同。例如,有些 ALU 設(shè)計(jì)為僅執(zhí)行整數(shù)計(jì)算,而有些則用于浮點(diǎn)運(yùn)算。一些處理器包含單個算術(shù)邏輯單元來執(zhí)行操作,而其他處理器可能包含許多 ALU 來完成計(jì)算。ALU 執(zhí)行的操作是:
邏輯運(yùn)算:邏輯運(yùn)算包括 NOR、NOT、AND、NAND、OR、XOR 等。
移位操作:它負(fù)責(zé)將位的位置向右或向左位移一定數(shù)量的位置,也稱為乘法運(yùn)算。
算術(shù)運(yùn)算:雖然它執(zhí)行乘法和除法,但這是指位加法和位減法。但是乘法和除法運(yùn)算的成本(邏輯復(fù)雜度和面積)更高。在乘法運(yùn)算中,加法可以用作除法和減法的替代。
ALU的信號
ALU 包含各種輸入和輸出連接,這使得外部電子設(shè)備和 ALU 之間可以投射數(shù)字信號。ALU 輸入從外部電路獲取信號,作為響應(yīng),外部電子設(shè)備從 ALU 獲取輸出信號。
數(shù)據(jù):ALU 包含三個并行總線,包括兩個輸入和輸出操作數(shù)。這三個總線處理的信號數(shù)量是相同的。
操作碼:當(dāng) ALU 將要執(zhí)行操作時,操作選擇碼描述了 ALU 將執(zhí)行哪種類型的運(yùn)算或邏輯運(yùn)算。
輸出:ALU 操作的結(jié)果由狀態(tài)輸出以補(bǔ)充數(shù)據(jù)的形式提供,因?yàn)樗鼈兪嵌鄠€信號。通常,諸如溢出、零、執(zhí)行、負(fù)數(shù)等狀態(tài)信號都包含在通用 ALU 中。當(dāng) ALU 完成每個操作時,外部寄存器包含狀態(tài)輸出信號。這些信號存儲在外部寄存器中,使它們可用于未來的 ALU 操作。
輸入:當(dāng) ALU 執(zhí)行一次操作時,狀態(tài)輸入允許 ALU 訪問更多信息以成功完成操作。此外,存儲的來自先前 ALU 操作的進(jìn)位被稱為單個“進(jìn)位”位。
圖3?ALU輸入輸出示意圖
ALU 是一種組合邏輯電路,這意味著它的輸出將隨著輸入變化而異步變化。在正常操作中,穩(wěn)定信號被施加到所有 ALU 輸入,當(dāng)信號通過 ALU 電路傳播足夠的時間(稱為“傳播延遲”)時,ALU 操作的結(jié)果出現(xiàn)在 ALU輸出。連接到 ALU 的外部電路負(fù)責(zé)確保 ALU 輸入信號在整個操作過程中的穩(wěn)定性,并在對 ALU 結(jié)果進(jìn)行采樣之前留出足夠的時間讓信號通過 ALU 傳播。
通常,外部電路通過向 ALU 的輸入施加信號來控制 ALU。通常,外部電路采用時序邏輯來控制 ALU 操作,該操作由頻率足夠低的時鐘信號來控制,以確保 ALU 輸出有足夠的時間在最壞情況下穩(wěn)定下來。
圖4?74181型四比特ALU
例如,CPU 通過將操作數(shù)從它們的源(通常是寄存器)路由到 ALU 的操作數(shù)輸入來開始 ALU 加法操作,而控制單元同時將值應(yīng)用于 ALU 的操作碼輸入,將其配置為執(zhí)行加法。同時,CPU 還將 ALU 結(jié)果輸出路由到將接收和的目標(biāo)寄存器。在 CPU 等待下一個時鐘時,允許 ALU 的輸入信號在下一個時鐘之前保持穩(wěn)定,通過 ALU 傳播到目標(biāo)寄存器。當(dāng)下一個時鐘到達(dá)時,目標(biāo)寄存器存儲 ALU 結(jié)果,并且由于 ALU 操作已經(jīng)完成,ALU 輸入可以設(shè)置為下一個 ALU 操作。
ALU 的配置
每個算術(shù)邏輯單元都包括以下配置:Instruction Set Architecture、Accumulator、Stack、Register-Register Architecture、Register - Stack Architecture、Register and ?Memory。
Accumulator:每個操作的中間結(jié)果都包含在累加器中,這意味著指令集架構(gòu)(ISA)并不復(fù)雜,因?yàn)橹恍枰4嬉晃弧Mǔ?,它們速度更快且不太?fù)雜,但使 Accumulator 更穩(wěn)定;需要編寫附加代碼以用適當(dāng)?shù)闹堤畛渌?。不幸的是,對于單個處理器,很難找到累加器來執(zhí)行并行性。累加器的一個例子是桌面計(jì)算器。
Stack:每當(dāng)執(zhí)行最新操作時,這些操作都會存儲在以自上而下順序保存程序的堆棧中,這是一個小寄存器。當(dāng)新程序被添加執(zhí)行時,它們會推送舊程序。
Register-Register Architecture:它包括 1 個目標(biāo)指令和 2 個源指令的位置,也稱為 3 - Register操作機(jī)。該指令集架構(gòu)必須更長,以存儲三個操作數(shù)、1 個目標(biāo)和 2 個源。運(yùn)算結(jié)束后,將結(jié)果寫回寄存器會很困難,而且字的長度也應(yīng)該更長。但是,如果在這個地方遵循寫會規(guī)則,可能會導(dǎo)致更多的同步問題。
Register - Stack Architecture:通常,寄存器和累加器操作的組合稱為寄存器 - 堆棧架構(gòu)。需要在寄存器堆棧架構(gòu)中執(zhí)行的操作被壓入堆棧頂部。它的結(jié)果保存在堆棧的頂部。借助反向拋光方法,可以分解更復(fù)雜的數(shù)學(xué)運(yùn)算。一些designer為了表示操作數(shù),使用二叉樹的概念。這意味著反向拋光方法對這些程序員來說很容易,而對其他程序員來說可能很困難。要執(zhí)行 Push 和 Pop 操作,需要創(chuàng)建新的硬件。
Register and Memory:在這種架構(gòu)中,一個操作數(shù)來自寄存器,另一個來自外部存儲器,因?yàn)樗亲顝?fù)雜的架構(gòu)之一。其背后的原因是每個程序都可能非常長,因?yàn)樗鼈冃枰4嬖谕暾膬?nèi)存空間中。該技術(shù)一般與Register-Register 技術(shù)相結(jié)合,實(shí)際上不能單獨(dú)使用。
ALU的功能
一算術(shù)運(yùn)算
加法:A 和 B 相加,和出現(xiàn)在 Y 和進(jìn)位。
進(jìn)位加法:A、B 和進(jìn)位相加,總和出現(xiàn)在 Y 和進(jìn)位處。
減法:從 A 中減去 B(反之亦然),差值出現(xiàn)在 Y 和進(jìn)位。對于此功能,結(jié)轉(zhuǎn)實(shí)際上是一個“借”指標(biāo)。這個操作也可以用來比較A和B的大?。辉谶@種情況下,處理器可能會忽略 Y 輸出,處理器只對操作產(chǎn)生的狀態(tài)位(特別是零和負(fù)數(shù))感興趣。
借位減法:借位(進(jìn)位)從 A 中減去 B(反之亦然),差值出現(xiàn)在 Y 和進(jìn)位(借出)處。
二進(jìn)制補(bǔ)碼:從零中減去 A(或 B),差值出現(xiàn)在 Y 處。增量計(jì)算:A(或 B)加 1,結(jié)果值出現(xiàn)在 Y。減量計(jì)算:A(或 B)減 1,結(jié)果值出現(xiàn)在 Y。
Pass through:A(或B)的所有位在Y處顯示為未修改。此操作通常用于確定操作數(shù)的奇偶校驗(yàn)或是否為零或負(fù)數(shù),或?qū)⒉僮鲾?shù)加載到處理器寄存器中。
二位邏輯運(yùn)算
AND:A 和 B 的按位與出現(xiàn)在 Y 處。
OR:A 和 B 的按位 OR 出現(xiàn)在 Y 處。
異或:A 和 B 的按位異或出現(xiàn)在 Y 處。
1 的補(bǔ)碼:A(或 B)的所有位都被反轉(zhuǎn)并出現(xiàn)在 Y 處。
三位移操作
ALU 移位操作導(dǎo)致操作數(shù) A(或 B)左移或右移(取決于操作碼),移位后的操作數(shù)出現(xiàn)在 Y。簡單的 ALU 通常只能將操作數(shù)移位一位,而更復(fù)雜的 ALU 使用桶形移位器允許他們在一次操作中將操作數(shù)移動任意位數(shù)。在所有單位移位操作中,移出操作數(shù)的位出現(xiàn)在進(jìn)位輸出;移入操作數(shù)的位的值取決于移位的類型。
算術(shù)移位:操作數(shù)被視為二進(jìn)制補(bǔ)碼整數(shù),這意味著最高有效位是“符號”位并被保留。
邏輯移位:將邏輯零移入操作數(shù)。這用于移動無符號整數(shù)。
循環(huán):操作數(shù)被視為循環(huán)位緩沖區(qū),因此其最低有效位和最高有效位有效相鄰。
進(jìn)位循環(huán):進(jìn)位位和操作數(shù)共同被視為位的循環(huán)緩沖區(qū)。
圖5? 八比特ALU位移計(jì)算示意圖