Addierer

Xilinx Spartan3

Als nächstes entwerfen wir einen Addierer. Dieser erlaubt es uns zwei Zahlen zu addieren. Diese Schaltung gehe ich Schritt für Schritt durch, sprich erst entwerfe ich einen Halbaddierer und aus zwei Halbaddierern machen wir dann einen Volladdierer.

-> Der Halbaddierer:

Der 1-Bit Halbaddierer kann zwei Bits addieren und dabei das Ergebnis + ein Carry Bit ausgeben. Er ist die Grundschaltung für den späteren Volladdierer, dem Subtrahierer (eine Subtraktion ist ja im Prinzip nichts anderes als eine Addition mit dem negativen Wert einer Zahl) und auch für eine Multipliziereinheit (eine Multiplikation ist eine fortgesetzte Addition). Die Wahrheitstabelle für diese Schaltung sieht wie folgt aus:

ABQCarryOut
0000
0110
1010
1101

Als erstes erstellt ihr euch ein Projekt mit dem Namen Halbaddierer und in diesem Projekt erstellt ihr euch dann ein VHDL Modul, welches ihr ebenfalls Halbaddierer nennt.
Für die Eingänge vergebt ihr die Namen A und B und für die Ausgänge die Namen Q“ und CarryOut:

Addierer(1)

Nun muss die Logik beschrieben werden.
Carry Out wird immer dann gesetzt wenn A und B gesetzt werden, sprich es handelt sich dabei um eine einfache UND-Verknüpfung:

Für den Ausgang Q gilt:
Q ist immer dann High wenn entweder A oder B High sind.
Hier erkennt man, dass es sich um eine XOR-Verknüpfung handelt:

Damit wäre der Halbaddierer beschrieben und die Schaltung kann synthetisiert werden.
Für die Pins habe ich anschließend

CarryOut = P90
Q = P94
A = P85
B = P86

gewählt. Danach könnt ihr den Bitstream generieren und die Schaltung testen.
Diese Schaltung verwenden wir nun als Grundlage für die anderen Schaltungen.

-> Der 1-Bit Volladdierer:

Der nächste Schritt ist das erzeugen eines Volladdierers. Hierfür schauen wir uns erst einmal wieder die Wahrheitstabelle des Addierers an:

CarryInABQCarryOut
00000
00110
01010
01101
10010
10101
11001
11111

Jetzt legt ihr euch ein neues Projekt und VHDL Modul mit dem Namen Ein_Bit_Volladdierer an.
In diese Schaltung fügt ihr nun ein neues Modul mit dem Namen Halbaddierer ein.
Der Einfachheit halber könnt ihr einfach über Add Copy of Source das Halbaddierermodul aus dem vorherigen Schritt in das aktuelle Projekt kopieren:

Addierer(2)

Um das Modul nutzen zu können, müsst ihr es erst erzeugen.
Dafür fügt ihr im Modul Volladdierer diese Zeilen zwischen architecture und begin ein:

Anschließend wird das Modul noch instantiiert. Dies macht ihr, indem ihr zwischen begin und end folgendes einfügt:

Damit ruft ihr das Halbaddierer Modul auf und verlinkt die Anschlüsse A, B, Q und CarryOut des Halbaddierermoduls mit den angegebenen Signalen aus eurem Code.
In meinem Beispiel ist es E1, E2, CI und CO. Sie können aber auch X, Y, Z, A usw. genannt werden.
Es muss nur die Reihenfolge der Pins von dem verwendeten Modul beachtet werden.
Anhand der Wahrheitstabellen des Halb- und Volladdierers erkennt man, dass sich an den ersten vier Zeilen nichts geändert hat. Es ist lediglich die Option eines Carry In Eingangs hinzugefügt worden, welcher bei der nachfolgenden Logik berücksichtigt werden muss.
Im ersten Schritt wird das Ergebnis des Halbaddierers mittels einer XOR-Verknüpfung mit dem Carry In verknüpft:

Dadurch realisiere ich die Addition des Carry In Bits mit dem Ergebnis der beiden Eingänge (das Ergebnis des Halbaddierers).
Dieser Vorgang ist gleich dem Addieren des Übertrages bei der schriftlichen Addition.
Der zweite Schritt ist das generieren des Carry Out Bits. Dieses Bit ist immer dann High wenn zwei Bits mit einer logischen 1 addiert werden.
Als erstes definiere ich ein paar Zwischensignale für die Zwischenergebnisse:

Danach berechne ich die Ergebnisse:

Jetzt werden die ganzen Ergebnisse noch mittels Oder-Verknüpfung auf den CarryOut – Ausgang gelegt:

Jetzt ist die Schaltung fertig beschrieben.
Als Anschlusspins für die Schaltung habe ich folgende gewählt:

Q = P94
CarryOut = P90
CarryIn = P84
A = P85
B = P86

Wenn ihr die Schaltung nun synthetisiert und testet, sollte euer FPGA zwei 1-Bit Werte an den Eingängen A, B und CarryIn addieren und das Ergebnis an den Pins P94 und P90 ausgeben.

 

Dokumentation:

 

-> Zurück zum FPGA + VHDL Tutorial

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload CAPTCHA.