Jednostka arytmetyczno-logiczna - Arithmetic logic unit

Symboliczna reprezentacja jednostki ALU oraz jej sygnałów wejściowych i wyjściowych, wskazana strzałkami wskazującymi odpowiednio do lub z jednostki ALU. Każda strzałka reprezentuje jeden lub więcej sygnałów. Sygnały sterujące wchodzą z lewej strony, a sygnały stanu wychodzą z prawej; dane przepływają od góry do dołu.

W informatyce jednostka arytmetyczno-logiczna (ALU) jest kombinacyjnym układem cyfrowym, który wykonuje operacje arytmetyczne i bitowe na liczbach całkowitych binarnych . Jest to w przeciwieństwie do jednostki zmiennoprzecinkowej (FPU), która działa na liczbach zmiennoprzecinkowych . Jest podstawowym budulcem wielu typów układów obliczeniowych, w tym jednostki centralnej (CPU) komputerów, FPUs oraz procesory graficzne (GPU).

Dane wejściowe do jednostki ALU to dane, na których należy operować, zwane operandami oraz kod wskazujący operację, która ma zostać wykonana; wyjście jednostki ALU jest wynikiem wykonanej operacji. W wielu konstrukcjach ALU posiada również wejścia lub wyjścia stanu, lub oba, które przekazują informacje o poprzedniej operacji lub bieżącej operacji, odpowiednio, między ALU a zewnętrznymi rejestrami stanu .

Sygnały

Alu szereg wejść i wyjść sieci , które są przewody elektryczne wykorzystywane do przekazywania sygnałów cyfrowych pomiędzy ALU i układem zewnętrznym. Gdy jednostka ALU działa, obwody zewnętrzne przesyłają sygnały do ​​wejść ALU, a w odpowiedzi jednostka ALU wytwarza i przekazuje sygnały do ​​obwodów zewnętrznych przez swoje wyjścia.

Dane

Podstawowa jednostka ALU ma trzy równoległe magistrale danych składające się z dwóch argumentów wejściowych ( A i B ) oraz wyjścia wyniku ( Y ). Każda magistrala danych to grupa sygnałów, która przekazuje jedną binarną liczbę całkowitą. Zazwyczaj szerokości szyn A, B i Y (liczba sygnałów zawierających każdą szynę) są identyczne i odpowiadają natywnemu rozmiarowi słowa zewnętrznego obwodu (np. hermetyzującego CPU lub innego procesora).

Kod operacji

Opcode wejściowy jest LPT, który przekazuje do jednostki arytmetycznologicznej dostarczenie kodu wyboru operacji, która jest wartością Numeracja określająca żądanej operacji arytmetycznych lub logicznych być wykonywane przez jednostkę arytmetycznologiczną. Rozmiar kodu operacji (szerokość magistrali) określa maksymalną liczbę różnych operacji, które może wykonać jednostka ALU; na przykład czterobitowy kod operacyjny może określać do szesnastu różnych operacji ALU. Ogólnie rzecz biorąc, kod operacyjny ALU nie jest tym samym, co kod operacyjny języka maszynowego , chociaż w niektórych przypadkach może być bezpośrednio zakodowany jako pole bitowe w kodzie operacyjnym języka maszynowego.

Status

Wyjścia

Wyjściami stanu są różne indywidualne sygnały, które przekazują dodatkowe informacje o wyniku bieżącej operacji ALU. Jednostki ALU ogólnego przeznaczenia zwykle mają sygnały stanu, takie jak:

  • Carry-out , który przekazuje przeniesienie wynikające z operacji dodawania, pożyczenia wynikającego z operacji odejmowania lub bitu przepełnienia wynikającego z operacji przesunięcia binarnego.
  • Zero , co wskazuje, że wszystkie bity Y są zerem logicznym.
  • Negative , co oznacza, że ​​wynik operacji arytmetycznej jest ujemny.
  • Overflow , który wskazuje, że wynik operacji arytmetycznej przekroczył zakres liczbowy Y.
  • Parzystość , która wskazuje, czy parzysta czy nieparzysta liczba bitów w Y jest jedynką logiczną.

Po zakończeniu każdej operacji ALU, sygnały wyjściowe stanu są zwykle zapisywane w zewnętrznych rejestrach w celu udostępnienia ich dla przyszłych operacji ALU (np. w celu realizacji arytmetyki wielokrotnej precyzji ) lub do sterowania rozgałęzieniami warunkowymi . Zbiór rejestrów bitowych, w których przechowywane są stany wyjściowe, jest często traktowany jako pojedynczy, wielobitowy rejestr, który jest określany jako „rejestr stanu” lub „rejestr kodu warunku”.

Wejścia

Wejścia stanu umożliwiają udostępnienie dodatkowych informacji jednostce ALU podczas wykonywania operacji. Zazwyczaj jest to pojedynczy bit „przeniesienia”, który jest przechowywanym wykonaniem z poprzedniej operacji ALU.

Działanie obwodu

Kombinowanych logiczny zespół obwodów 74181 układu scalonego, który jest prosty czterobitowym ALU

ALU to kombinowany obwód logiczny , co oznacza, że ​​jego wyjścia będą się zmieniać asynchronicznie w odpowiedzi na zmiany na wejściu. Podczas normalnej pracy do wszystkich wejść ALU podawane są stabilne sygnały, a gdy minie wystarczająco dużo czasu (znanego jako „ opóźnienie propagacji ”), aby sygnały mogły się rozprzestrzenić przez obwody ALU, wynik działania ALU pojawia się na ALU wyjścia. Zewnętrzny obwód podłączony do jednostki ALU jest odpowiedzialny za zapewnienie stabilności sygnałów wejściowych jednostki ALU podczas całej operacji oraz za zapewnienie wystarczającego czasu na propagację sygnałów przez jednostkę ALU przed próbkowaniem wyniku jednostki ALU.

Ogólnie rzecz biorąc, obwody zewnętrzne sterują jednostką ALU, dostarczając sygnały do ​​jej wejść. Zazwyczaj obwód zewnętrzny wykorzystuje logikę sekwencyjną do sterowania działaniem jednostki ALU, która jest sterowana sygnałem zegarowym o wystarczająco niskiej częstotliwości, aby zapewnić wystarczająco dużo czasu na ustabilizowanie się wyjść jednostki ALU w najgorszych warunkach.

Na przykład, CPU rozpoczyna operację dodawania jednostek ALU, kierując operandy ze swoich źródeł (które zwykle są rejestrami) do wejść operandów jednostki ALU, podczas gdy jednostka sterująca jednocześnie stosuje wartość do wejścia kodu operacji jednostki ALU, konfigurując ją do wykonywania operacji dodawania. W tym samym czasie CPU również kieruje wynik ALU do rejestru docelowego, który otrzyma sumę. Sygnały wejściowe ALU, które są utrzymywane w stanie stabilnym do następnego zegara, mogą rozprzestrzeniać się przez ALU i do rejestru docelowego, podczas gdy procesor czeka na następny zegar. Kiedy nadejdzie następny zegar, rejestr docelowy przechowuje wynik ALU, a ponieważ operacja ALU została zakończona, wejścia ALU mogą być skonfigurowane do następnej operacji ALU.

Funkcje

Wiele podstawowych funkcji arytmetycznych i logicznych bitowych jest powszechnie obsługiwanych przez jednostki ALU. Podstawowe jednostki ALU ogólnego przeznaczenia zazwyczaj zawierają następujące operacje w swoim repertuarze:

Działania arytmetyczne

  • Dodaj : A i B są sumowane, a suma pojawia się w Y i przeprowadza się.
  • Dodaj z przeniesieniem : A, B i przeniesienie są sumowane, a suma pojawia się przy Y i przeniesieniu.
  • Odejmowanie : B jest odejmowane od A (lub odwrotnie), a różnica pojawia się w Y i przeprowadzaniu. W przypadku tej funkcji wykonanie jest faktycznie wskaźnikiem „pożyczenia”. Ta operacja może być również użyta do porównania wielkości A i B; w takich przypadkach wyjście Y może zostać zignorowane przez procesor, który jest zainteresowany tylko bitami stanu (zwłaszcza zerowymi i ujemnymi) wynikającymi z operacji.
  • Odejmij z pożyczką : B jest odejmowane od A (lub odwrotnie) z pożyczką (przeniesieniem), a różnica pojawia się w Y i wykonaniu (wypożyczenie).
  • Dopełnienie do dwójki (negacja) : A (lub B) jest odejmowane od zera, a różnica pojawia się na Y.
  • Przyrost : A (lub B) jest zwiększany o jeden, a wynikowa wartość pojawia się na Y.
  • Dekrementacja : A (lub B) zmniejsza się o jeden, a wynikowa wartość pojawia się w Y.
  • Przepuść : wszystkie bity A (lub B) wydają się niezmodyfikowane w Y. Ta operacja jest zwykle używana do określenia parzystości operandu lub czy jest zero czy ujemna, lub do załadowania operandu do rejestru procesora.

Bitowe operacje logiczne

  • AND : bitowe AND z A i B pojawia się w Y.
  • OR : bitowe OR z A i B pojawia się w Y.
  • Exclusive-OR : bitowe XOR A i B pojawia się w Y.
  • Uzupełnienie jedynkowe : wszystkie bity A (lub B) są odwrócone i pojawiają się w Y.

Operacje przesunięcia bitowego

Przykłady przesunięcia bitowego dla ośmiobitowej jednostki ALU
Rodzaj Lewo Dobrze
Przesunięcie arytmetyczne Obróć w lewo logicznie.svg Obróć w prawo arytmetycznie.svg
Przesunięcie logiczne Obróć w lewo logicznie.svg Obróć w prawo logicznie.svg
Obracać się Obróć w lewo.svg Obróć w prawo.svg
Obróć przez przeniesienie Obróć w lewo przez carry.svg Obróć w prawo przez carry.svg

Operacje przesunięcia ALU powodują przesunięcie operandu A (lub B) w lewo lub w prawo (w zależności od kodu operacji), a przesunięty operand pojawia się na Y. Proste jednostki ALU zazwyczaj mogą przesunąć operand tylko o jedną pozycję bitową, podczas gdy bardziej złożone jednostki ALU wykorzystują przesuwniki baryłkowe, które pozwalają im przesuwać operand o dowolną liczbę bitów w jednej operacji. We wszystkich jednobitowych operacjach przesunięcia, bit przesunięty poza operand pojawia się podczas wykonywania; wartość bitu przesuniętego do operandu zależy od rodzaju przesunięcia.

  • Przesunięcie arytmetyczne : operand jest traktowany jakoliczba całkowita uzupełnienia do dwóch , co oznacza, że ​​najbardziej znaczący bit jest bitem „znaku” i jest zachowywany.
  • Przesunięcie logiczne : logiczne zero jest przesunięte do operandu. Służy do przesuwania liczb całkowitych bez znaku.
  • Rotate : operand jest traktowany jako okrągły bufor bitów, więc jego najmniejsze i najbardziej znaczące bity efektywnie sąsiadują.
  • Rotate through carry : bit przeniesienia i operand są traktowane łącznie jako okrągły bufor bitów.

Aplikacje

Arytmetyka z wielokrotną precyzją

W obliczeniach arytmetycznych na liczbach całkowitych arytmetyka o wielokrotnej precyzji to algorytm operujący na liczbach całkowitych, które są większe niż rozmiar słowa ALU. Aby to zrobić, algorytm traktuje każdy operand jako uporządkowaną kolekcję fragmentów o rozmiarze ALU, ułożonych od najbardziej znaczącego (MS) do najmniej znaczącego (LS) lub odwrotnie. Na przykład w przypadku 8-bitowej jednostki ALU, 24-bitowa liczba całkowita 0x123456będzie traktowana jako zbiór trzech 8-bitowych fragmentów: 0x12(MS) 0x34, i 0x56(LS). Ponieważ rozmiar fragmentu dokładnie odpowiada rozmiarowi słowa ALU, ALU może bezpośrednio operować na tym „kawałku” operandu.

Algorytm wykorzystuje jednostkę ALU do bezpośredniego operowania na poszczególnych fragmentach operandów, a tym samym do generowania odpowiedniego fragmentu ("częściowego") wyniku o dużej precyzji. Każda część, po wygenerowaniu, jest zapisywana w powiązanym regionie pamięci, który został wyznaczony dla wyniku o wielokrotnej precyzji. Proces ten jest powtarzany dla wszystkich fragmentów operandów, aby wygenerować kompletny zbiór części, który jest wynikiem operacji wielokrotnej precyzji.

W operacjach arytmetycznych (np. dodawanie, odejmowanie) algorytm rozpoczyna od wywołania operacji ALU na fragmentach LS operandów, tworząc w ten sposób zarówno bit częściowy LS, jak i bit wykonania. Algorytm zapisuje część do wyznaczonej pamięci, podczas gdy maszyna stanu procesora zwykle przechowuje bit realizacji w rejestrze stanu ALU. Algorytm następnie przechodzi do następnego fragmentu kolekcji każdego operandu i wywołuje operację ALU na tych fragmentach wraz z zapisanym bitem przeniesienia z poprzedniej operacji ALU, tworząc w ten sposób inny (bardziej znaczący) częściowy i bit wykonania. Tak jak poprzednio, bit przeniesienia jest zapisywany w rejestrze stanu, a część zapisywana jest w wyznaczonej pamięci. Proces ten powtarza się, dopóki wszystkie fragmenty operandu nie zostaną przetworzone, co skutkuje kompletnym zbiorem części składowych w pamięci, które składają się na wynik arytmetyczny o dużej precyzji.

W operacjach przesunięcia o wielokrotnej precyzji kolejność przetwarzania fragmentów operandu zależy od kierunku przesunięcia. W operacjach przesunięcia w lewo fragmenty są najpierw przetwarzane LS, ponieważ bit LS każdej części, który jest przenoszony za pośrednictwem zapisanego bitu przenoszenia, musi być uzyskany z bitu MS wcześniej przesuniętego w lewo, mniej znaczącego argumentu. Odwrotnie, argumenty operacji są przetwarzane MS najpierw w operacjach przesunięcia w prawo, ponieważ bit MS każdej części musi być uzyskany z bitu LS wcześniej przesuniętego w prawo, bardziej znaczącego argumentu.

W bitowych operacjach logicznych (np. logiczne AND, logiczne LUB) fragmenty operandu mogą być przetwarzane w dowolnej kolejności, ponieważ każda częściowa zależy tylko od odpowiednich fragmentów operandu (przechowywany bit przeniesienia z poprzedniej operacji ALU jest ignorowany).

Złożone operacje

Chociaż jednostkę ALU można zaprojektować do wykonywania złożonych funkcji, wynikająca z tego większa złożoność obwodu, koszt, zużycie energii i większy rozmiar sprawiają, że w wielu przypadkach jest to niepraktyczne. W konsekwencji jednostki ALU są często ograniczone do prostych funkcji, które mogą być wykonywane z bardzo dużymi prędkościami (tj. bardzo krótkimi opóźnieniami propagacji), a zewnętrzny obwód procesora jest odpowiedzialny za wykonywanie złożonych funkcji poprzez orkiestrację sekwencji prostszych operacji ALU.

Na przykład obliczanie pierwiastka kwadratowego z liczby może być zaimplementowane na różne sposoby, w zależności od złożoności jednostki ALU:

  • Obliczenia w jednym zegarze : bardzo złożona jednostka ALU, która w jednej operacji oblicza pierwiastek kwadratowy.
  • Rurociąg obliczenia : grupa prosty ALU, który oblicza kwadratowego w etapach pośrednich wyników z przechodzących przez ALU rozmieszczone fabrycznej linii produkcyjnej . Ten obwód może akceptować nowe operandy przed zakończeniem poprzednich i daje wyniki tak szybko, jak bardzo złożone ALU, chociaż wyniki są opóźnione o sumę opóźnień propagacji stopni ALU. Aby uzyskać więcej informacji, zobacz artykuł dotyczący instrukcji potokowania .
  • Obliczenia iteracyjne : prosta jednostka ALU, która oblicza pierwiastek kwadratowy w kilku krokach pod kierunkiem jednostki sterującej .

Powyższe implementacje przechodzą od najszybszych i najdroższych do najwolniejszych i najmniej kosztownych. Pierwiastek kwadratowy jest obliczany we wszystkich przypadkach, ale procesory z prostymi jednostkami ALU potrzebują więcej czasu na wykonanie obliczeń, ponieważ konieczne jest wykonanie wielu operacji na jednostkach ALU.

Realizacja

Jednostka ALU jest zwykle implementowana jako samodzielny układ scalony (IC), taki jak 74181 , lub jako część bardziej złożonego układu scalonego. W tym drugim przypadku, jednostka ALU jest zazwyczaj tworzona przez syntezę z opisu napisanego w VHDL , Verilog lub innym języku opisu sprzętu . Na przykład poniższy kod VHDL opisuje bardzo prostą 8-bitową jednostkę ALU:

entity alu is
port (  -- the alu connections to external circuitry:
  A  : in signed(7 downto 0);   -- operand A
  B  : in signed(7 downto 0);   -- operand B
  OP : in unsigned(2 downto 0); -- opcode
  Y  : out signed(7 downto 0));  -- operation result
end alu;

architecture behavioral of alu is
begin
 case OP is  -- decode the opcode and perform the operation:
 when "000" =>  Y <= A + B;   -- add
 when "001" =>  Y <= A - B;   -- subtract
 when "010" =>  Y <= A - 1;   -- decrement
 when "011" =>  Y <= A + 1;   -- increment
 when "100" =>  Y <= not A;   -- 1's complement
 when "101" =>  Y <= A and B; -- bitwise AND
 when "110" =>  Y <= A or B;  -- bitwise OR
 when "111" =>  Y <= A xor B; -- bitwise XOR
 when others => Y <= (others => 'X');
 end case; 
end behavioral;

Historia

Matematyk John von Neumann zaproponował koncepcję ALU w 1945 roku w raporcie na temat podstaw nowego komputera zwanego EDVAC .

Koszt, rozmiar i zużycie energii przez obwody elektroniczne były stosunkowo wysokie w okresie niemowlęctwa ery informacji . W związku z tym wszystkie komputery szeregowe i wiele wczesnych komputerów, takich jak PDP-8 , miały prostą jednostkę ALU, która działała na jednym bicie danych na raz, chociaż często przedstawiały programistom szerszy rozmiar słowa. Jednym z najwcześniejszych komputerów z wieloma dyskretnymi jednobitowymi obwodami ALU był Whirlwind I z 1948 roku , który wykorzystywał szesnaście takich „jednostek matematycznych”, aby umożliwić działanie na słowach 16-bitowych.

W 1967 Fairchild wprowadził pierwszy ALU zaimplementowany jako układ scalony, Fairchild 3800, składający się z ośmiobitowego ALU z akumulatorem. Wkrótce pojawiły się inne układy scalone ALU, w tym czterobitowe ALU, takie jak Am2901 i 74181 . Urządzenia te były zazwyczaj zdolne do „ bit slice ”, co oznacza, że ​​posiadały sygnały „carry look forward”, które ułatwiały użycie wielu połączonych ze sobą chipów ALU do stworzenia jednostki ALU o szerszym rozmiarze słowa. Urządzenia te szybko stały się popularne i były szeroko stosowane w minikomputerach typu bit-slice.

Mikroprocesory zaczęły pojawiać się na początku lat siedemdziesiątych. Chociaż tranzystory stały się mniejsze, często brakowało miejsca na matrycę dla jednostki ALU o pełnej szerokości słowa, w wyniku czego niektóre wczesne mikroprocesory wykorzystywały wąską jednostkę ALU, która wymagała wielu cykli na instrukcję języka maszynowego. Przykładem może być popularny Zilog Z80 , który wykonywał ośmiobitowe dodatki z czterobitowym ALU. Z biegiem czasu geometrie tranzystorów uległy dalszemu skurczeniu, zgodnie z prawem Moore'a , i stało się wykonalne budowanie szerszych jednostek ALU na mikroprocesorach.

Współczesne tranzystory z układami scalonymi (IC) są o rzędy wielkości mniejsze niż te stosowane we wczesnych mikroprocesorach, co umożliwia dopasowanie bardzo złożonych ALU do układów scalonych. Obecnie wiele nowoczesnych jednostek ALU ma szerokie słowa i ulepszenia architektoniczne, takie jak przesuwniki beczkowe i mnożniki binarne, które pozwalają im wykonywać w jednym cyklu zegara operacje, które wymagałyby wielu operacji na wcześniejszych jednostkach ALU.

Jednostki ALU mogą być realizowane jako układy mechaniczne , elektromechaniczne lub elektroniczne , aw ostatnich latach prowadzone są badania nad biologicznymi jednostkami ALU (np. na bazie aktyn ).

Zobacz też

Bibliografia

Dalsza lektura

Linki zewnętrzne