Ingenjör inom elektronik och datorteknik

Verilog ALU

Verilog ALU

Översikt

Det här är min implementation av en enkel aritmetik- och logikenhet (ALU). Den består av fyra olika block, där varje block utför en specifik funktion. Ett block kan väljas med ingången ”select” (S). Inom varje block kan en specifik operation väljas med ingången ”mode” (M). De tillgängliga operationerna i ALU:n visas i funktionstabellen nedan.

Jag designade denna ALU hierarkisk, och de mest övergripande modulerna visas i diagramet nedan. På den här sidan förklarar jag alla designnivåer, samt hur jag implementerade kretsen med hårdvarubeskrivande språk.

Grindar

Den lägsta nivån består av logiska grindar. Grindarna utgör den enklaste logiken och lägger grunden för alla andra moduler i kretsen. Nedan visas några av de grindar som jag använde i min design.

Kombinatorisk logik

Jag använde grindarna för att bygga kombinatoriska moduler, vars uppgift var att utföra någon väldigt simpel och specifik uppgift. Till exempel kunde det vara binär addition, shift-operationer eller logiska jämförelser som exempelvis AND.

Full adder

Ett av de mest grundlläggande logikblocken i en ALU är adderaren. Syftet med denna krets är att utföra simpel binär addition. Just denna design är speciellt användbar eftersom den kan kaskadkopplas för att utföra beräkningar av ett godtyckligt antal bitar.

En full adder består av två half adder-kretsar. Orsaken till detta är att en half adder saknar ingång för carry-biten, vilket gör att den inte kan kaskadkopplas.

Det kan kännas konstigt att carry-biten är hög trots att varken input a eller b är aktiv. Orsaken är dock att signalen blir inverterad ytterligare en gång när den färdas genom full adder-kretsen, vilket gör att den slutliga logiken blir densamma.

Block

Genom att använda de kombinatoriska logik-modulerna så designade jag så kallade block. Dessa beskriver funktionen av min ALU på en högre abstraktionsnivå.

Aritmetikblock

Aritmetikblocket har tre olika funktioner: addition, subtraktion och multiplikation. I binär logik så är en addition och en subtraktion nästan samma sak, skillnaden är att man för en subtraktion tar tvåkomplementet för ena talet för att göra det negativt. Detta görs i min ALU med bit 0 i mode-inputen.

I den här simuleringen har jag valt talen 5 och 3 som input. Mode är satt till M=10, vilket enligt funktionstabellen motsvarar multiplikation. Kretsen visar korrekt talet 15 vid sin output.

Shift- rotationsblock

Det finns fyra möjliga operationer i shift- rotationsblocket: rotate right, rotate left, shift right och shift left.

Det här kopplingsschemat har input 10101010 och M=01, vilket betyder att kretsen kommer utföra en rotate left-operation. Kretsen visar korrekt talet 01010101 vid sin output, vilket är det originella binärtalet roterat år vänster (med zero extension).

Komparatorblock

Komparatorblocket kan utföra jämförelser av följande typ: greater than, less than, equal och not equal.

Det här exemplet har input A=5 och B=5. Eftersom M=10 kommer kretsen utföra jämförelsen equal. Kretsens output är därför 1 (med zero extension).

Logikblock

Logikblocket jämför två binärtal med varandra enligt följande logiska operationer: AND, OR, NOT och XOR.

Kretsen är inställd på M=11, vilket enligt funktionstabellen innebär en XOR-operaion.

Komplett ALU

Den här modulen för samman alla kretsens delar. Man använder select-signalen för att välja vilket block man vill använda, och blockets funktion väljs med mode-signalen. Select-signalen styr multiplexers som ser till att rätt värde når fram till kretsens output.

Följande kopplingsschema visar en mycket hög abstraktion av hela kretsen. I just detta exempel så utför min ALU en subtraktion mellan talen 7 och 5.

Jag gjorde också en testbench för min ALU. Syftet med den var att testa många olika scenarion samtidigt så att jag enkelt kunde hitta fel. Denna testbench gjorde jag i programmet ModelSim.

© 2025 Emil Berg. All rights reserved.
No use or copying without permission.