Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| informatyka:podstawy-dzialania-komputera:jednostka_arytmetyczno-logiczna [2024/05/11 17:23] – created kawcix | informatyka:podstawy-dzialania-komputera:jednostka_arytmetyczno-logiczna [2024/05/11 23:21] (current) – kawcix | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== 10 Jednostka arytmetyczno-logiczna ====== | ====== 10 Jednostka arytmetyczno-logiczna ====== | ||
| + | |||
| + | **Jednostka arytmetyczno-logiczna** (z ang. arithmetic and logical unit lub arithmetic logic unit, ALU) – układ cyfrowy, wykonujący operacje arytmetyczne (takie jak dodawanie, odejmowanie itp.), operacje logiczne na dwóch liczbach oraz operacje jednoargumentowe, | ||
| + | |||
| + | Typowa ALU ma dwa wejścia odpowiadające parze argumentów i jedno wyjście na wynik. Operacje jakie prowadzi to: | ||
| + | * operacje logiczne AND, OR, NOT, XOR, | ||
| + | * dodawanie, | ||
| + | * przesunięcia bitowe o jeden bit, stałą liczbę bitów, czasem też o zmienną liczbę, | ||
| + | * często też, odejmowanie, | ||
| + | * dość często mnożenie i czasem dzielenie/ | ||
| + | |||
| + | Przyczyną dla której operacje te grupuje się w ALU jest to, że bramek logicznych potrzebnych do zaimplementowania wszystkich operacji z zestawu: dodawanie (z przeniesieniem i bez), odejmowanie (z przeniesieniem i bez), negacja liczby, zwiększanie i zmniejszanie o 1, AND, OR, NOT, XOR jest niewiele więcej od zaimplementowania samego dodawania. Szybkie mnożenie wymaga znacznie więcej, a dzielenie jeszcze więcej bramek w porównaniu do tych operacji. | ||
| + | |||
| + | ===== Historia: Architektura von Neumanna ===== | ||
| + | |||
| + | Matematyk John von Neumann zaproponował model ALU w 1945 roku, kiedy to sporządził spis założeń dla nowego komputera EDVAC (z ang. Electronic Discrete Variable Automatic Computer, czyli elektroniczny komputer maszynowy o zmiennych nieciągłych). Później w 1946 r. pracował ze swoimi kolegami nad stworzeniem komputera dla Princeton Institute of Advanced Studies (IAS). Komputer IAS stał się prototypem dla wielu późniejszych komputerów. W swoim projekcie von Neumann nakreślił, | ||
| + | |||
| + | Von Neumann stwierdził, | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== Przykład " | ||
| + | |||
| + | (wzięty z https:// | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Mamy w nim w sumie 8 wejść. | ||
| + | |||
| + | X i Y które są naszymi liczbami. W zależności od implementacji mogą być one np 16 bitowe każda. (ja jeśli zbuduje to w aplikacji logisim zrobię po prostu tak że są 1 bitowe ( co nie ma sensu przy dodawaniu bo 1 + 1 da mi 0, bo odrzucamy carry ale tak dla prostoty) | ||
| + | |||
| + | Mamy 6 bitów sterujących: | ||
| + | |||
| + | **zx** - zero x (zeruje nam x) | ||
| + | |||
| + | **nx** - negate x ( neguje nam x) | ||
| + | |||
| + | **zy** - zero y (zeruje nam y) | ||
| + | |||
| + | **ny** - negate y ( neguje nam y) | ||
| + | |||
| + | **f** - wybiera nam operację dodawania x + y (również odejmowania, | ||
| + | |||
| + | **no** - negate output ( neguje nam wyjście) | ||
| + | |||
| + | Aby zrozumieć implementację, | ||
| + | |||
| + | najpierw wybór możliwośći wyzerowania wejść | ||
| + | |||
| + | input false zawsze ma wartość 0 bo to pomiędzy nią, a jednym inputem wybieramy. Jeśli input to 0 i wyzerujemy go - to dalej zero | ||
| + | |||
| + | {{: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Następnie kolejnym multiplekserem wybieramy czy " | ||
| + | |||
| + | {{: | ||
| + | |||
| + | wykonujemy operacje and i dodawanie half adderem ( [[informatyka: | ||
| + | |||
| + | Multiplekserem z pomocą f znowu wybieramy jaka operacja ma pojawić się na wyjściu | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Następnie możliwość zanegowania wyjścia już po wykonaniu wszystkich operacji | ||
| + | |||
| + | {{: | ||
| + | |||
| + | implementacja tego ALU z 16 bitowymi wejściami W HDL | ||
| + | |||
| + | https:// | ||
| + | |||
| + | < | ||
| + | |||
| + | CHIP ALU { | ||
| + | WEJŚCIE | ||
| + | x[16], y[16], | ||
| + | zx, // Czy wyzerować wejście x? | ||
| + | nx, // Czy zanegować wejście x? | ||
| + | zy, // Czy wyzerować wejście y? | ||
| + | ny, // Czy zanegować wejście y? | ||
| + | f, // Czy wykonać dodawanie (1) czy operację AND (0)? | ||
| + | no; // Czy zanegować wyjście? | ||
| + | |||
| + | WYJŚCIE | ||
| + | out[16], // Wynik operacji, 16 bitów | ||
| + | |||
| + | |||
| + | CZĘŚCI: | ||
| + | // Zerowanie wejścia | ||
| + | Mux16(a=x, b=false, sel=zx, out=x1); | ||
| + | Mux16(a=y, b=false, sel=zy, out=y1); | ||
| + | |||
| + | // Negacja wejścia | ||
| + | Not16(in=x1, | ||
| + | Mux16(a=x1, b=nx1, sel=nx, out=x2); | ||
| + | Not16(in=y1, | ||
| + | Mux16(a=y1, b=ny1, sel=ny, out=y2); | ||
| + | |||
| + | // Wykonywanie funkcji | ||
| + | And16(a=x2, b=y2, out=aAndB); | ||
| + | Add16(a=x2, b=y2, out=aPlusB); | ||
| + | Mux16(a=aAndB, | ||
| + | |||
| + | // Negacja wyjścia | ||
| + | Not16(in=out0, | ||
| + | Mux16(a=out0, | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | </ | ||
| + | |||