Voordat er begonnen kan worden aan de beschrijving van de ALU, moet eerst het hardware ontwerp gemaakt worden.
In wezen gebeurt hier niets spectaculairs. Alle mogelijks gevraagde bewerkingen worden allemaal berekend. Met behulp van een multiplexer wordt het gewenste resultaat uitgefilterd aan de uitgang aangelegd.
De basis-logische poorten, gearceerd in groen, zijn reeds besproken in het eerste hoofdstuk.
De ripple-carry adders voor het berekenen van de som en het verschil, gearceerd in geel, zijn het resultaat van de opdracht van hoofdstuk 2.
De vergelijkers (of comparatoren), gearceerd in rood, kunnen beschreven worden aan de hand van een demultiplexer zoals die gezien is in hoofdstuk 2.
Voor het shiften kan een extra woordje uitleg misschien wel helpen. Vaak kan het een hulp zijn om “er een tekeningetje bij te maken”. Neem, bijvoorbeeld, een shift-left-3 operatie.
Het gewenste resultaat is dat my_vector verschoven wordt met 3 plaatsen. De waarde die ingeschoven moet worden is ‘0’. Er zijn verschillende manieren om dit te beschrijven.
Expliciet
my_shifted_vector(0) <= '0';
my_shifted_vector(1) <= '0';
my_shifted_vector(2) <= '0';
my_shifted_vector(3) <= my_vector(0);
my_shifted_vector(4) <= my_vector(1);
my_shifted_vector(5) <= my_vector(2);
my_shifted_vector(6) <= my_vector(3);
my_shifted_vector(7) <= my_vector(4);
One-liner
my_shifted_vector <= my_vector(4 downto 0) & "000";
Generisch
zeroes <= (others => '0');
my_shifted_vector <= my_vector(7-3 downto 0) & zeroes(3-1 downto 0);
Indien het gewenste resultaat is dat my_vector verschoven wordt met 3 plaatsen naar rechts, met behoud van het teken; dan dient de sign-bit gekopieerd en ingeschoven te worden. Hiervoor kan een nieuwe vector gemaakt worden die volledige bestaat uit kopies van de tekenbit.
padding <= (others => my_vector(7));
my_shifted_vector <= padding(3-1 downto 0) & my_vector(7 downto 3);
Merk op dat bovenstaande beschrijving uitgaat van een declaratie (x downto y). Indien je liever werkt met (x to y), moet je de indices aanpassen.
De beschrijvingen hierboven leiden tot het correct berekenen van het gewenste resultaat. Dit wordt het datapad genoemd. Het deel van het ontwerp dat ervoor zorgt dat de juiste uitkomsten verschijnen en alle controle signalen juist staan, heet het controlepad.
ALUop | Resultaat |
---|---|
000 | x & y |
001 | x | y |
010 | x ^ y |
011 | x < y ? 1 : 0 (signed) |
011 | x < y ? 1 : 0 (unsigned) |
100 | x + y |
101 | x - y |
110 | x << y |
111 | x >> y (met tekenbehoud) |
111 | x >> y (zonder tekenbehoud) |