算術邏輯單元

算術邏輯單元。單個CPU、FPU 或 GPU 可能包含多個 ALU。ALU 的輸入包括需要運算的資料和表明了運算操作型別的指令碼。ALU 的輸出是其執行運算的結果。在許多的設計中，ALU 還帶有狀態輸入或輸出，可將其之前操作或當前操作的資訊在 ALU 和外部狀態暫存器間傳遞。訊號.一個 ALU 具有各種輸入和輸出網路，它們用於在 ALU 和外部電路之間傳送數字訊號。當 ALU 工作時，外部電路在 ALU 的輸入端輸入訊號，而 ALU 將產生運算結果，並將訊號透過其輸出端輸出至外部電路。資料.一個基本的 ALU 具有三個並行的資料匯流排，包括兩個輸入運算元的原生字長相同。操作碼."操作碼"透過並行匯流排輸入，它向 ALU 傳遞選擇的操作的資訊，該操作選擇碼是對 ALU 要執行的算術或邏輯運算的列舉。操作碼的長度。通常，ALU 的操作碼與機器語言的操作碼不同，儘管在某些情況下，它可以直接編碼為機器語言操作碼內的位欄位。狀態.輸出.ALU 的狀態輸出是各類單獨的訊號，補充表示了有關當前 ALU 操作結果的資訊。通用 ALU 通常具有以下狀態訊號：在 ALU 的操作結束後，狀態輸出訊號通常會被儲存在外部暫存器中，以使其可用於之後的 ALU 操作。儲存了狀態輸出的集合的位暫存器通常被視為一整個多位暫存器，稱為“狀態暫存器”或“條件程式碼暫存器”。輸入.狀態輸入使 ALU 在執行操作時可接收其他資訊。通常，這是單個“低位進位”，傳遞了來自上一級 ALU 操作的進位。電路操作.ALU 是組合邏輯電路。這意味著當輸入變化時，其輸出也將隨之變化。在正常的情況下輸入到 ALU 的訊號是穩定的，並且當經過足夠的時間訊號透過 ALU 中的電路傳播後，ALU 操作的結果就會出現在ALU上輸出。連線到 ALU 的外部電路負責確保 ALU 的輸入訊號在整個操作過程中是穩定的，並在對 ALU 的輸出進行取樣之前為訊號傳播預留足夠的時間。通常，外部電路透過將訊號施加到其輸入端來控制 ALU。外部電路往往採用順序邏輯來控制 ALU 的運作，該操作由足夠低頻率的時鐘訊號調整，以確保 ALU 的輸出在最壞情況下也有足夠的時間達到穩定。例如，在用 ALU 執行加法操作時，CPU 會將運算元路由到 ALU 的輸入，而控制單元會同時將一個值傳送至 ALU 的操作碼輸入，使其執行加法操作。同時，CPU 還將把 ALU 的計算結果輸出路由到用於接收該結果的目標暫存器。在 CPU 等待下一個時鐘期間，ALU 的輸入訊號需一直保持穩定，已使其透過 ALU 併到達目標暫存器。當下一個時鐘到達時，目標暫存器將儲存 ALU 結果，並且由於 ALU 操作已完成，因此此時可以為下一次 ALU 操作設定 ALU 輸入。功能.ALU 通常支援許多基本算術和按位邏輯函式。基本的通用 ALU 通常支援以下操作：移位操作.在不同的操作碼下，ALU 的移位操作可將運算元 A向左或向右移位，移位的結果將出現在 Y 處。簡單的 ALU 通常只能將運算元移位一位，而更復雜的 ALU 使用桶形移位器，在一次操作中可移位任意的位數。在一位的移位操作中，從運算元移出的位會被轉移到"進位"輸出中。而被移位到運算元中的數位取決於移位的型別，比如：應用.多倍精度運算.在整數算術計算中，多倍精度運算。由於片段的大小與該 ALU 字長完全匹配，因此可以直接對這幾個數進行操作。該演算法使用 ALU 直接對特定的運算元片段進行運算，從而生成多精度結果的相應片段。在運算元的每個片段被計算後，結果都將被儲存到對應的位置。對所有運算元片段重複此過程，將這些結果進行拼合，即可得到完整的運算結果。對於算術運算，該演算法首先對運算元的最低位片段進行運算，從而生成最低位對應的結果和進位。隨後將該結果儲存至某個指定的位置，而處理器通常會儲存 ALU 狀態輸出中的進位。然後，該演算法繼續計算每個運算元片段集合的下一個片段，並對這些片段呼叫 ALU 操作，並將先前 ALU 操作的進位一起輸入，從而產生另一個更高位的片段和進位。重複此過程，直到處理完所有運算元片段為止，從而在儲存位置中得到完整的運算結果。對於移位運算，運算元片段處理的順序取決於移位方向。在左移操作中，首先對最低位片段進行處理，因為必須用低位片段左移的溢位位來得到該運算的最低位。類似地，在右移操作中應首先對運算元的最高位進行處理。對於按位邏輯運算。複雜運算.儘管可以將ALU設計於執行復雜的功能，但在許多情況下，由此導致的更高的電路複雜性，成本，功耗和更大的尺寸使其不切實際。因此，ALU通常限於可以以非常高的速度執行的簡單功能，而為了執行復雜的運算，外部處理器電路則需要將一系列簡單的ALU操作進行編排。例如，在ALU的複雜程度不同的情況下，可以透過多種方式來計算數字的平方根：上面的實現從最快和最昂貴的到最慢和最便宜的過渡，在這幾種情況下都可完成平方根的計算，但是結構更加簡單的 ALU 的計算時間往往更長，因為需要執行多步操作。實現.ALU 通常是一個獨立的積體電路，也可能是一個更加複雜的 IC 的一部分。在後一種情況下，ALU 一般由VHDL、Verilog或其他硬體描述語言編寫，並透過綜合該程式碼來例項化其電路。例如，以下 VHDL 程式碼描述了一個功能非常簡單的8位ALU：entity alu isport ( -- 該 ALU 對外部電路的介面A : in signed(7 downto 0); -- 運算元 AB : in signed(7 downto 0); -- 運算元 BOP : in unsigned(2 downto 0); -- 運算指令Y : out signed(7 downto 0)); -- 運算結果end alu;architecture behavioral of alu isbegincase OP is -- 解碼運算指令並執行計算操作when "000" =&gt; Y  Y  'X');end case;end behavioral;歷史.馮·諾伊曼在1945年的一份關於新型計算機EDVAC的基礎的報告中提出了 ALU 的概念。在整個資訊時代的初期，電子電路的成本，尺寸和功耗都相對較高。因此，儘管所有序列計算機和許多早期計算機都具有一個簡單的 ALU，但它一次只能處理一個數據位，而程式設計師們使用更長的字長。最早的具有多個分立單位 ALU 電路的計算機是1948年的 Whirlwind I，它使用了16個這樣的“數學單元”，以使其能夠對16位資料進行操作。1967年，快捷半導體推出了第一款用積體電路實現的 ALU，名為 Fairchild 3800，由一個帶累加器的八位 ALU 構成。隨後，其他積體電路 ALU 也相繼出現，包括4位 ALU，如 Am2901 和 74181。這些裝置通常具有“位片”功能，這意味著它們可以輸出“超前進位”的訊號，從而有助於使用多個 ALU 晶片相互連線以構成字長更寬的 ALU。這些裝置迅速流行起來，並廣泛用於位片微型計算機。1970年代初，微處理器開始出現。雖然電晶體變得越來越小，但裸晶的尺寸並不足以放下全字寬的 ALU。因此，一些早期的微處理器採用了位數更少的 ALU，每條指令因而需要多個週期來執行。比如當時流行的Zilog Z80，它使用4位 ALU 執行8位加法運算。後來，正如摩爾定律預測的那樣，電晶體的尺寸進一步縮小，在微處理器上構建更寬的 ALU 從而也變得可行。現代的積體電路中電晶體的尺寸比早期微處理器的小-{}-幾個數量級，從而可以配備高度複雜的 ALU。如今，許多現代ALU的字寬更寬，體系結構的提升能使它們能夠在單個時鐘週期內執行需要早期 ALU 進行多次運算才能完成的操作。