Aritmetisk logisk enhet

En aritmetisk logisk enhet (engelsk: arithmetic logic unit, forkortet ALU) er en elektronisk krets som utfører aritmetiske og logiske operasjoner. De er fundamentale byggeklosser i CPU-er og mange andre mikroprosessorer. Moderne CPU-er og GPU-er inneholder veldig kompliserte, og gjerne flere, ALU-er.
Matematikeren John von Neumann framla i 1945 konseptet med ALU-er i en rapport han skrev  om en ny datamaskin kalt EDVAC.


== Tidlig utvikling ==
Sammen med kollegaene sine, jobbet von Neumann i 1946 med å utvikle en datamaskin for Princeton Institute for Advanced Study. Denne ble prototypen for mange senere datamaskiner. Blant komponentene von Neumann mente at maskinen trengte, var en ALU.
Von Neumann hevdet at en ALU var en nødvendighet i en datamaskin, fordi det var hevet over all tvil at en de ville måtte utføre regneoperasjoner som addering, subtrahering, multiplisering og dividering. Han mente at det var naturlig at en datamaskin skulle ha spesialiserte «organer» for slike operasjoner.


== Tallsystemer ==
En ALU må behandle tall på med samme format som resten av den digitale kretsen. For moderne prosessorer vil dette innebære å bruke binært tallsystem med toerkomplement. Tidlige datamaskiner brukte mange forskjellige måter å representere tall på, inkludert enerkomplement, fortegnsbit, og til og med titallsystemet. ALU-er for hvert av disse systemene har forskjellig design.


== Praktisk virkemåte ==

De fleste operasjonene i en prosessor utføres av én eller flere ALU-er. En ALU får sine data fra registre, utfører operasjonen og skriver resultatet til et register. En kontrollenhet forteller ALU-en hva slags operasjon den skal utføre. Andre mekanismer sørger for å flytte data mellom registrene og minnet.


=== Enkle operasjoner ===
De fleste ALU-er kan utføre de følgende operasjonene:

Heltallsaritmetikk (addisjon, subtraksjon, og noen ganger multiplikasjon og divisjon, som er mer krevende)
Logiske operasjoner på enkeltbits (AND, NOT, OR og XOR)
Skift-operasjoner (bitene i et ord flytter seg mot venstre eller høyre, med eller uten bevaring av fortegn). Slike operasjoner kan ses på som multiplikasjon eller divisjon med 2.


=== Komplekse operasjoner ===
En ALU kan utformes til å beregne hva som helst, men jo mer kompliserte operasjoner den utfører, desto dyrere, større og mer strømkrevende blir den. Designerne må derfor finne et kompromiss hvor ALU-en er kraftig nok til å gjøre prosessoren rask, men ikke så innviklet at den blir upraktisk. Dersom man for eksempel skal kunne beregne kvadratroten av noe, vil ingeniøren som skal designe ALU-en ha følgende valg for å gjøre dette mulig:

Man kan lage en ekstremt komplisert ALU som kan regne ut kvadratroten av ethvert tall i ett enkelt trinn, altså i løpet av én klokkesyklus.
Man kan lage en veldig komplisert ALU som kan beregne kvadratroten av ethvert tall, men over flere trinn. Trinnene organiseres som et samlebånd slik at den starte på ytterlige tall før det første resultatet er klart. Den vil dermed kunne spytte ut resultater like fort som en ett-trinns ALU, selv om det vil ta litt tid før det første resultatet er klart.
Man kan lage en komplisert ALU som utfører beregningen over flere trinn. Disse trenger gjerne styring fra en komplisert kontrollenhet.
Man kan putte en enkel ALU i prosessoren og selge en separat prosessor, såkalt koprosessor, som kan brukes til å utføre de kompliserte beregningene.
Man kan la programvareutviklerne skrive sine egne algoritmer for å beregne kvadratroten av et tall.
Man kan skrive programvare som emulerer en koprosessor. Programvare vil da kunne benytte koprosessoren om denne finnes, men vil benytte emuleringen om en egnet koprosessor ikke er tilgjengelig.Valgene er sortert fra raskest og dyrest, til tregest og billigst. Selv den enkleste datamaskinen vil kunne utføre de mest kompliserte beregninger, men det vil ta dem lenger tid ettersom de vil måtte gjøre det over mange trinn.
Kraftige prosessor som Intels Core-prosessorer og AMDs AMD64 har valgt løsning 1 for enkle operasjoner, løsning 2 for vanlige, kompliserte operasjoner og løsning 3 for ekstremt kompliserte operasjoner. Dette er mulig fordi man kan bygge veldig kompliserte ALU-er i disse prosessorene.


=== Inndata og utdata ===
Inndataene til en ALU er de verdiene beregningene skal utføres på (kalt operander). En kode fra prosessorens kontrollenheten forteller hvilken operasjon som skal utføres. Utdataene er resultatet fra beregningen.
I mange ALU-design inkluderer inn- og utdataene også flere tilstandskoder som leses fra og skrives til et statusregister. Disse kodene signaliserer mente, overflyt, deling på null, osv. Fra en heltallsdivisjon vil det også være mulig å både kvotienten og resten som resultat.


=== ALU-er og FPU-er ===
En FPU (floating point unit) utfører også aritmetiske operasjoner på to tall, men for tall som er representert som flyttall, som er mye mer komplisert enn toerkomplementrepresentasjonen brukt i typiske ALU-er. For å utføre disse kompliserte beregningene inneholder en FPU flere kompliserte kretser, inkludert flere ALU-er.
En krets vil vanligvis bare bli kalt en ALU dersom den opererer på heltallsformater. Kretser som opererer på andre tallformater, som flyttall og komplekse tall, får navn som bedre beskriver deres arbeidsoppgaver.


== Litteratur ==
Hwang, Enoch (2006). Digital Logic and Microprocessor Design with VHDL. Thomson. ISBN 0-534-46593-5. 
Stallings, William (2006). Computer Organization & Architecture: Designing for Performance 7th ed. Pearson Prentice Hall. ISBN 0-13-185644-8. 


== Eksterne lenker ==
Simulering av en kompleks ALU i MATLAB