Unterlagen zu Versuch 3
Unterlagen zu Versuch 3
Unterlagen zu Versuch 3
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
IL<br />
IS<br />
VS<br />
PRAKTIKUM ZUR<br />
VORLESUNG<br />
Rechnergesteuerte Systeme 2<br />
VERSUCH 3<br />
ADDITIONSSCHALTUNGEN UND ALU<br />
Name: Matrikelnummer:<br />
Vorname: Gruppennummer:<br />
Betreuer: Datum:<br />
Universität Duisburg-Essen<br />
Fak. 5, Abt. IIMT, Institut für<br />
Informationstechnik (IT)<br />
Verteilte Systeme (VS)<br />
© Dr.-Ing. Heinz-Dieter Hümmer<br />
Universität Duisburg-Essen<br />
Fak. 5, IIMT, IT/VS
Praktikum <strong>zu</strong> RgS 2 <strong>Versuch</strong> 3: ADDITIONSSCHALTUNGEN UND ALU<br />
Hinweise<br />
• Arbeiten Sie den anliegenden Vorbereitungstext sorgfältig durch.<br />
• Lösen Sie die im Vorbereitungstext gestellten Aufgaben und bringen Sie Ihre Ergebnisse <strong>zu</strong>m <strong>Versuch</strong>stermin<br />
mit.<br />
• Beantworten Sie <strong>zu</strong>m Antestat die folgenden Fragen.<br />
Vorbereitende Fragen<br />
1. Geben Sie die logischen Gleichungen eines Volladdierers wieder. Minimieren Sie die Gleichungen<br />
möglichst unter Zuhilfenahme der Antivalenzverknüpfung (xor)!<br />
2. Nach welcher Zeit kann bei einem Volladdierer wie in Abb. 1 von einem stabilen Ergebnis ausgegangen<br />
werden, wenn alle Gatter die gleiche Verzögerung T besitzen?<br />
3. Warum wurden in der Simulation unter 2.2.1 die binären Zahlen „0001“ und „1111“ an die Eingänge<br />
angelegt?<br />
4. Erklären Sie in einem kurzen Satz worin der prinzipielle Unterschied in der Übertragslogik zwischen<br />
einem Ripple-Carry-Addierer und einem Carry-Look-Ahead-Addierer liegt.<br />
5. Führen Sie im 8 bit Zweierkomplement folgende Operationen schrittweise durch: 2 – 3 ; 5 - 2<br />
6. Welche Dezimalzahlen stellen die untere bzw. obere Grenze im 8 bit Zweierkomplement dar?<br />
7. Vervollständigen Sie folgende for-Schleife <strong>zu</strong>r Realisierung eines 8-bit breiten Ripple-Carry-Addierers<br />
(ohne Betrachtung der Zeitverzögerungen):<br />
for ... loop<br />
...<br />
end loop;<br />
Verwenden Sie dabei folgende Variablen:<br />
a,b : std_logic_vector(8 downto 0); --Operanden<br />
e : std_logic_vector(8 downto 0); --Ergebnis<br />
c : std_logic_vector; --carry<br />
Inhalt<br />
1 Einleitung ..............................................................................................................................3<br />
2 Additionsschaltungen............................................................................................................3<br />
2.1 Volladdierer.....................................................................................................................3<br />
2.2 Ripple-Carry-Addierer .....................................................................................................4<br />
2.2.1 Simulationsergebnis..................................................................................................5<br />
2.3 Carry-Look-Ahead Addierer ............................................................................................5<br />
2.4 Aufgabe 1 .......................................................................................................................6<br />
3 Arithmetisch-logische Einheit(ALU) eines Prozessors ..........................................................7<br />
3.1 Der Signaltyp std_logic .................................................................................................7<br />
3.2 Schnittstelle und Verhalten der ALU ...............................................................................7<br />
3.3 Aufgabe 2 .......................................................................................................................9<br />
Entwurfsempfehlungen .........................................................................................................9<br />
Universität Duisburg-Essen; Fakultät 5; Abt. IIMT; Inst. Informationstechnik (IT), Verteilte Systeme (VS) Seite 2
Praktikum <strong>zu</strong> RgS 2 <strong>Versuch</strong> 3: ADDITIONSSCHALTUNGEN UND ALU<br />
1 Einleitung<br />
In diesem <strong>Versuch</strong> sollen einleitend zwei Varianten eines mehrstelligen, binären Addieres vorgestellt<br />
werden; daran anschließend wird auf den Entwurf einer kompletten arithmetischen logischen Einheit<br />
(ALU) eingegangen.<br />
2 Additionsschaltungen<br />
2.1 Volladdierer<br />
Wie schon aus den vorherigen <strong>Versuch</strong>en bekannt ist, kann ein Volladdierer aus zwei Halbaddieren aufgebaut<br />
werden; <strong>zu</strong>r Erinnerung ist in Abbildung Abb. 1 das Schaltbild eines solchen Konstruktes dargestellt.<br />
ai<br />
bi<br />
ci<br />
Halbaddierer 1<br />
=1<br />
&<br />
Halbaddierer 2<br />
Abb. 1: Schaltbild eines Volladdierers<br />
Dem in Abb. 1 dargestellten Volladdierer entspricht das folgende VHDL-Modell (Datenfluss), das auf die<br />
einzelnen logischen Gleichungen aufbaut. Aufgrund der <strong>zu</strong>gewiesenen Gatterverzögerungszeit – die<br />
Zeitkonstante totzeit – kommt dieses Modell den realen Komponenten sehr nahe.<br />
entity volladdierer is<br />
port(a,b,c_i: in bit; s,c_o: out bit);<br />
end volladdierer;<br />
architecture verhalten of volladdierer is<br />
constant totzeit: time := 10 ns; --Zeitkonstante<br />
signal x,y,z: bit;<br />
begin<br />
s
Praktikum <strong>zu</strong> RgS 2 <strong>Versuch</strong> 3: ADDITIONSSCHALTUNGEN UND ALU<br />
2.2 Ripple-Carry-Addierer<br />
Durch die Verkettung von mehreren Volladdierern entsteht ein mehrstelliger Addierer: ein sog. Ripple-<br />
Carry-Addierer. Dieser erfüllt zwar die mathematischen Anforderungen, ist aus technischer Sicht jedoch<br />
keine befriedigende Lösung aufgrund der "seriellen" Fortpflan<strong>zu</strong>ng (ripple, dahinplätschern) des Carry-<br />
Bits. Durch diese serielle Verkettung der Stufen entsteht ein langer Signal-Pfad und bedenkt man, dass<br />
jedes Gatter eine „Gatterverzögerung“ hat – auf die hier nicht weiter eingegangen wird –, so wird deutlich,<br />
dass diese Verschaltung bei großen Wortlängen ungünstig ist. Anhand der nächsten VHDL Modelle<br />
soll dieses Verhalten verdeutlicht werden. Hier wurde mit einzelnen Volladdierern ein 4-bit breiter Addierer<br />
konstruiert, der wie in der folgenden graphischen Darstellung Abb. 2 verschaltet ist.<br />
cin<br />
cout<br />
c4<br />
Σ<br />
a3<br />
s3<br />
b3<br />
cin<br />
cout<br />
Abb. 2: Schaltbild des Ripple-Carry-Addierers<br />
Um einen mehrstelligen (hier vierstellig) Addierer im strukturellen Entwurfstil <strong>zu</strong> kreieren, setze man den<br />
Volladdierer als component ein. Jede dieser mehrfach verwendeten Komponente erhält einen eigenen<br />
Namen (Instanziierung der Komponente). Die Verknüpfung der Ein- und Ausgänge der Instanzen mit<br />
den lokal deklarierten Signalen, die sogenannte Netzliste, ist im folgenden Programmcode aufgeführt.<br />
entity rc_addierer is<br />
port(al,bl: in bit_vector (3 downto 0);<br />
sl: out bit_vector (3 downto 0);<br />
c_ol: out bit);<br />
end rc_addierer;<br />
architecture struktur of rc_addierer is<br />
signal x0, x1, x2, x3: bit:='0';<br />
a2 b2<br />
component volladdierer is<br />
port(a,b,c_i: in bit; s,c_o: out bit);<br />
end component;<br />
-- Instanziierung der Komponenten<br />
for VA0: volladdierer use entity mywork.volladdierer(verhalten);<br />
for VA1: volladdierer use entity mywork.volladdierer(verhalten);<br />
for VA2: volladdierer use entity mywork.volladdierer(verhalten);<br />
for VA3: volladdierer use entity mywork.volladdierer(verhalten);<br />
Σ<br />
begin -- Netzliste<br />
VA0: volladdierer port map(a=>al(0),b=>bl(0),c_i=>x0,s=>sl(0),c_o=>x1);<br />
VA1: volladdierer port map(a=>al(1),b=>bl(1),c_i=>x1,s=>sl(1),c_o=>x2);<br />
VA2: volladdierer port map(a=>al(2),b=>bl(2),c_i=>x2,s=>sl(2),c_o=>x3);<br />
VA3: volladdierer port map(a=>al(3),b=>bl(3),c_i=>x3,s=>sl(3),c_o=>c_ol);<br />
end struktur;<br />
s2<br />
a1 b1<br />
Universität Duisburg-Essen; Fakultät 5; Abt. IIMT; Inst. Informationstechnik (IT), Verteilte Systeme (VS) Seite 4<br />
cin<br />
cout<br />
Σ<br />
s1<br />
c0 = 0<br />
cin<br />
cout<br />
Σ<br />
a0 b0<br />
s0
Praktikum <strong>zu</strong> RgS 2 <strong>Versuch</strong> 3: ADDITIONSSCHALTUNGEN UND ALU<br />
2.2.1 Simulationsergebnis<br />
Werden nun zwei 4-bit breite Bitmuster - "0001" und "1111" - an die Eingänge al und bl gelegt - sie<br />
waren <strong>zu</strong>vor mit dem Muster "0000" belegt -, so ergibt sich folgendes Diagramm (Abb. 3):<br />
Abb. 3: Graphische Darstellung der beschriebenen Simulation.<br />
Hier wurde die Bitmuster so gewählt, dass die maximale Verzögerungszeit von 80 ns deutlich <strong>zu</strong> sehen<br />
ist. Erklären lässt sich das Verhalten wie folgt: Im ersten Volladdierer, ist das Carry-Ausgangssignal<br />
nach 20 ns stabil, da an dessem Carry-Eingang ständig eine Null anliegt und das AND-Gatter des zweiten<br />
Halbaddierers (siehe Abb.1) nie eine Eins am Ausgang führen kann. Die restliche Verzögerungszeit<br />
ergibt sich aus der Summe aller Verzögerungszeiten der Gatter im Carry-Bit Signalpfad, also<br />
3*2*totzeit. Summiert man sie auf, ergeben sich die 80 ns Gesamtverzögerungszeit.<br />
2.3 Carry-Look-Ahead Addierer<br />
Die Problematik der großen Durchlaufzeiten läßt sich durch anders konzipierte Addierer umgehen. Als<br />
ein Beispiel soll hier ein Carry-Look-Ahead Addierer vorgestellt werden. Dieser besitzt eine separate, an<br />
die Wortbreite angepasste Logik, wie in der nächsten Abbildung Abb. 4 <strong>zu</strong> sehen ist.<br />
c3<br />
>1<br />
a2 b2<br />
&<br />
g2<br />
=1<br />
p2<br />
=1<br />
s2<br />
a1 b1<br />
&<br />
Abb. 4: Schaltbild eines 3-bit breiten Carry-Look-Ahead Addierers.<br />
Universität Duisburg-Essen; Fakultät 5; Abt. IIMT; Inst. Informationstechnik (IT), Verteilte Systeme (VS) Seite 5<br />
=1<br />
=1<br />
c2 g1p1c1<br />
s1<br />
>1 >1<br />
& & &<br />
& &<br />
&<br />
a0 b0<br />
&<br />
g0<br />
=1<br />
p0<br />
=1<br />
s0<br />
c0<br />
c0=0
Praktikum <strong>zu</strong> RgS 2 <strong>Versuch</strong> 3: ADDITIONSSCHALTUNGEN UND ALU<br />
Dargestellt wird ein 3-bit breiter Carry-Look-Ahead Addierer (CLA): Die jeweils identischen Module haben<br />
den Übertragseingang c, die Additionseingänge a und b und liefern mit dem Signal s das Ergebnis.<br />
Abweichend vom vorherigen Modell besitzen sie jedoch noch zwei weitere Ausgänge, nämlich<br />
p: Propagate und<br />
g: Generate.<br />
Diese tragen die notwendige Information für den Übertrag: g signalisiert, ob im Modul ein Übertrag erzeugt<br />
wird und p, ob ein Carry-Bit des vorherigen Moduls an das nächste Modul übertragen wird. Die<br />
Ausgangsignale sind definiert durch:<br />
g(i) := a(i) and b(i)<br />
p(i) := a(i) xor b(i)<br />
s(i) := p(i) xor c(i)<br />
Das jeweilige Carry-Bit c(i+1) als Stellenübertrag des Moduls an der Stelle i mit i > 0 errechnet sich <strong>zu</strong>:<br />
c(i+1) := g(i) or (p(i) and c(i))<br />
Um die Verzögerung durch die rekursive Form der obigen Gleichung <strong>zu</strong> vermeiden, wird für jeden Übertragseingang<br />
eine eigene Logik aufgebaut (siehe Abb. 4). Dieser parallele, zweistufige Aufbau von UND-<br />
ODER Verknüpfungen ermöglicht eine gleich bleibende Verzögerung, unabhängig von der Wortbreite,<br />
jedoch erkauft durch einen größeren Schaltungsaufwand. Die einzelnen Übertragsgleichungen der jeweiligen<br />
Positionen zeigt das auf und sie werden wie folgt ausgedrückt:<br />
c(0) := 0 -- festgelegt<br />
c(1) := g(0) -- schon gekürzt<br />
c(2) := g(1) or (p(1) and g(0))<br />
c(3) := g(2) or (p(2) and g(1)) or (p(2) and p(1) and g(0))<br />
2.4 Aufgabe 1<br />
Entwerfen Sie einen 4-bit breiten CLA mit einer generellen Gatterverzögerungszeit von 10 ns und vergleichen<br />
Sie die maximale Antwortzeit des CLA mit der des Ripple-Carry-Addierers anhand einer<br />
Testbench.<br />
Universität Duisburg-Essen; Fakultät 5; Abt. IIMT; Inst. Informationstechnik (IT), Verteilte Systeme (VS) Seite 6
Praktikum <strong>zu</strong> RgS 2 <strong>Versuch</strong> 3: ADDITIONSSCHALTUNGEN UND ALU<br />
3 Arithmetisch-logische Einheit(ALU) eines Prozessors<br />
Das vorrangige Thema der kommenden <strong>Versuch</strong>e dieses Praktikums ist der Entwurf eines kleinen Prozessors.<br />
Die grundlegende Architektur eines Prozessors, die Von-Neumann-Architektur, wird dabei als<br />
bekannt vorausgesetzt und daher in den <strong>Versuch</strong>sanleitungen nicht weiter theoretisch betrachtet. Der<br />
Entwurf des Prozessors soll in kleinen Schritten erfolgen und daher werden in den einzelnen <strong>Versuch</strong>en<br />
wesentliche Bestandteile des Prozessors mit wohldefinierten Schnittstellen vorgestellt und deren Realisierung<br />
als VHDL-Modell <strong>zu</strong> Aufgabe gestellt. Diese hier mehr pragmatische Vorgehensweise verzichtet<br />
<strong>zu</strong>nächst bewusst darauf, sich auf ein starres Gesamtkonzept (Maschinentyp, Befehlssatz u.s.w.) für<br />
den Prozessor fest <strong>zu</strong> legen. Statt dessen wird mit dem Entwurf der ALU, der arithmetisch-logischen<br />
Einheit des Prozessors, begonnen.<br />
3.1 Der Signaltyp std_logic<br />
Bevor auf die Einzelheiten der ALU eingegangen wird, soll <strong>zu</strong>nächst ein neuer Datentyp vorgestellt werden,<br />
der für möglichst alle Signale und Variablen in allen <strong>zu</strong>m Prozessorentwurf gehörenden VHDL-<br />
Modellen <strong>zu</strong> verwenden ist:<br />
std_logic bzw. std_logic_vector aus dem Package ieee.std_logic_1164 (IEEE Standard 1164-<br />
1993).<br />
Im Gegensatz <strong>zu</strong>m bisher verwendeten Typ bit mit den Logikwerten ’0’ und ’1’ erlaubt das Package<br />
std_logic die Modellierung von weiteren, für die reale Hardware typischen Logikwerten (sog.9-wertiges<br />
Logikmodell), die in der folgenden Tabelle (Tabelle 1) aufgelistet sind.<br />
Wert Bedeutung Verwendung<br />
'U' Nicht initialisiert Nicht initialisiertes Signal im Simulator „unknown“<br />
'X' Undefiniert Simulator erkennt mehr als einen aktiven Signaltreiber (Buskonflikt)<br />
'0' Starke logische '0' Entspricht '0' eines bit-Signals<br />
'1' Starke logische '1' Entspricht '1' eines bit-Signals<br />
'Z' Hochohmig 'Z' Tri-state Ausgang<br />
'W' Schwach unbekannt Simulator erkennt Buskonflikt zwischen 'L' und 'H' „weak“<br />
'L' Schwache logische '0' Ausgang mit Pull-Down Widerstand (Open Source)<br />
'H' Schwache logische '1' Ausgang mit Pull-Up Widerstand (Open Drain)<br />
'-' Don’t Care Logik<strong>zu</strong>stand bedeutungslos; kann <strong>zu</strong>r Minimierung verwendet werden<br />
Tabelle 1: Wertevorrat von std_logic<br />
Signalwerte wie 'X' und 'Z' werden erst im Zusammenhang mit bidirektionalen Bussen interessant,<br />
wenn Fälle behandelt werden, in denen z.B. mehrere Treiber (Signalquellen) auf den Signalbus schreibend<br />
<strong>zu</strong>greifen. In solchen Fällen müssen Buskonflikte erkannt und aufgelöst werden. Im Zusammenhang<br />
mit der ALU entstehen solche Schwierigkeiten nicht, aber trotzdem empfiehlt es sich auch beim<br />
Entwurf der ALU das Package std_logic <strong>zu</strong> verwenden, um im gesamten Prozessorentwurf einen<br />
durchgehend direkt kompatiblen Signaltyp <strong>zu</strong> haben und auf Konvertierungsfunktionen verzichten <strong>zu</strong><br />
können.<br />
3.2 Schnittstelle und Verhalten der ALU<br />
Die ALU eines Prozessors stellt die Recheneinheit<br />
für arithmetische und logische Operationen dar. Sie<br />
erzeugt aus den beiden gegebenen Operanden A<br />
und B durch rein kombinatorische Logik das<br />
Operationsergebnis E (siehe Abb. 5). Über die<br />
Steuerleitungen S werden die einzelnen Funktionen<br />
der ALU ausgewählt. Außer dem Ergebnis E liefert<br />
die ALU sog. Statussignale (Flags), die einige<br />
Eigenschaften des Operationsergebnisses<br />
anzeigen.<br />
Universität Duisburg-Essen; Fakultät 5; Abt. IIMT; Inst. Informationstechnik (IT), Verteilte Systeme (VS) Seite 7<br />
S<br />
A B<br />
ALU<br />
E<br />
Abb. 5<br />
Statussignale
Praktikum <strong>zu</strong> RgS 2 <strong>Versuch</strong> 3: ADDITIONSSCHALTUNGEN UND ALU<br />
Folgende Rahmendaten seien nun <strong>zu</strong>r Realisierung einer einfachen ALU im Hinblick auf die Aufgabenstellung<br />
dieses <strong>Versuch</strong>es gegeben:<br />
Die Breite der Datenbusse (jeweils A, B und E) sei 8 bit.<br />
Die Breite der Steuerbusses (S) sei 3 bit.<br />
Die Anzahl der <strong>zu</strong>r ALU gehörenden Steuerleitungen (hier 3) verrät, wie viele Operationen die ALU maximal<br />
ausführen kann. Folgende acht Operationen (Tabelle 2) seien nun gefordert:<br />
Nr. Operation Mnemonic Codierung Kurzerläuterung Statussignale<br />
(Verwendete Operanden) C Z<br />
0 Reserviert 000<br />
offen lassen für evtl.<br />
spätere Verwendung<br />
0 *<br />
1 Addition ADD 001 A + B → E * *<br />
2 Subtraktion SUB 010 A – B → E * *<br />
3 Bitweise Konjunktion AND 011 A ∧ B → E 0 *<br />
4 Bitweise Disjunktion OR 100 A ∨ B → E 0 *<br />
5 Bitweise Negation NOT 101 ¬A → E 0 *<br />
6 Logisches Links-Schieben SLL 110 A > 1 → E<br />
siehe Erläuterung unten<br />
* *<br />
Tabelle 2: ALU-Operationen<br />
Die in der Spalte „Codierung“ stehenden Werte werden über die Steuerleitungen an die ALU gelegt, um<br />
die entsprechende Operation aus<strong>zu</strong>wählen. Die am weitesten rechts stehende Spalte zeigt, welche Statussignale<br />
bei den jeweiligen Operationen gesetzt werden müssen. Die Zeichen in dieser Spalte haben<br />
folgende Bedeutung:<br />
C : Übertrag (carry), der z.B. bei einer Addition über die höchstwertige Stelle hinaus entstehen<br />
kann<br />
Z : Zero Flag, wird auf ’1’ gesetzt, falls das Ergebnis gleich Null ist<br />
0 : Flag löschen<br />
* : Flag gemäß dem Ergebnis setzen<br />
Die folgenden Abbildungen machen die Arbeitsweise der Schiebe-Operationen deutlich:<br />
SLL : shift left logically: Das Datenwort wird um eine Stelle in Richtung höherer Wertigkeit<br />
verschoben. Danach wird in die niedrigstwertige Stelle (LSB: Least Significant Bit) eine<br />
'0’ geschrieben. Das höchstwertige Bit (MSB: Most Significant Bit) wird als Übertrag (C:<br />
Carry) festgehalten.<br />
C<br />
MSB ... LSB '0’<br />
SRA : shift right arithmetically: Das Datenworte wird um eine Stelle in Richtung niedrigerer<br />
Wertigkeit verschoben. Danach wird die niedrigstwertige Stelle (LSB) als Carry ausgegeben.<br />
Das höchstwertige Bit (MSB) behält seinen Wert, damit das Vorzeichen erhalten<br />
bleibt.<br />
C<br />
MSB ... LSB<br />
Bei den Operationen Addition und Subtraktion soll die ALU Daten in der 8-bit Zweierkomplement-<br />
Darstellung verarbeiten.<br />
Universität Duisburg-Essen; Fakultät 5; Abt. IIMT; Inst. Informationstechnik (IT), Verteilte Systeme (VS) Seite 8
Praktikum <strong>zu</strong> RgS 2 <strong>Versuch</strong> 3: ADDITIONSSCHALTUNGEN UND ALU<br />
3.3 Aufgabe 2<br />
Erstellen Sie einen VHDL-Modellentwurf der ALU, der die oben beschriebenen Spezifikationen erfüllt.<br />
Die Schnittstelle der ALU sei durch die Tabelle 3 festgelegt. Überprüfen Sie anschließend Ihr ALU-<br />
Modell anhand einer Testbench.<br />
Anschluss[Breite] Richtung Typ<br />
s[3] Eingang std_logic_vector<br />
a[8], b[8] Eingang std_logic_vector<br />
e[8] Ausgang std_logic_vector<br />
cflg, zflg Ausgang std_logic<br />
Tabelle 3: Schnittstelle der ALU<br />
Als Hilfestellung <strong>zu</strong>r Verhaltensbeschreibung der ALU seien folgende Empfehlungen gegeben:<br />
Entwurfsempfehlungen<br />
• Zur Verwendung von std_logic bzw. std_logic_vector und <strong>zu</strong>r eventuellen Nut<strong>zu</strong>ng der<br />
arithmetischen Operatoren sind folgende Zeilen vor der betreffenden entity <strong>zu</strong> platzieren:<br />
library ieee;<br />
use ieee.std_logic_1164.all;<br />
use ieee.std_logic_unsigned.all;<br />
• Zeitverzögerungen brauchen nicht modelliert <strong>zu</strong> werden.<br />
• Als Orientierungshilfe <strong>zu</strong>r Erstellung der Architektur sei folgende Vorlage gegeben:<br />
architecture arch of alu is<br />
begin<br />
operate_alu: process(s, a, b) is<br />
subtype vectorType is std_logic_vector(7 downto 0);<br />
variable evar : vectorType; --temporäre Variable<br />
variable carry : std_logic;<br />
procedure add(x,y :in vectorType; sum :out vectorType; c_out :out std_logic) is<br />
variable c : std_logic := '0'; --temporäre Variable,<br />
variable res : vectorType := (others => '0'); --mit Initialisierung<br />
begin<br />
...<br />
sum := res;<br />
c_out := c;<br />
end add;<br />
begin<br />
evar := x"00"; --Initialisierung im Hex-Format, z.B. x"f2" entspricht "11110010"<br />
...<br />
case s is --Verzweigung in die verschiedenen arithm. und log. Operationen<br />
when "001" => --add<br />
add(a,b,evar,carry); --Aufruf der Prozedur mit Parametern<br />
when "010" => --sub<br />
...<br />
when "011" => --and<br />
evar := a and b;<br />
...<br />
when others => null;<br />
end case;<br />
...<br />
e