Magnitude Komparator

Xilinx Spartan3

Als nächstes erstellen wir einen Magnitude Komparator. Dieser Komparator ist in der Lage zwei Zahlen zu vergleichen und zu entscheiden was gilt:
A > B, A < B oder A = B

-> Der 1-Bit Magnitude Komparator:

Um die Funktion eines Magnitude Komparator verstehen, beginne ich mit einem 1-Bit Magnitude Komparator.
Dieser besitzt folgende Wahrheitstabelle:

BAA > BA = BA < B
00010
01100
10001
11010

Als erstes erstellt ihr ein Projekt und ein Sourcefile. Dieses Projekt nennt ihr Ein_Bit_Magnitude_Komparator.
Im Sourcefile von der Schaltung gebt ihr anschließend zwei 1-Bit Eingänge und drei 1-Bit Ausgänge an.
In der Architektur formuliert ihr anschließend die Wahrheitstabelle aus:

Die Signale P1, P2 und P3 sind nur Zwischenspeicher und die Bedingungen können auch problemlos in eine Zeile geschrieben werden:

An Q1 liegt ein High Signal an, sobald A größer ist als B, an Q3 eins wenn B größer ist als A und wenn keine der Bedingungen zutrifft, führt Q2 ein High Signal.
Dies ist auch schon die ganze Logik in dem Komparator.
Wenn die Schaltung fertig synthetisiert und implementiert wurde sollte es etwa so aussehen (die grüne LED signalisiert A = B, LED2 aus A > B und LED1 aus B > A, die beiden linken untersten Pins sind die Eingänge für die 1-Bit Zahlen):

Magnitude_Komparator(1)
Magnitude_Komparator(2)

-> Der 4-Bit Magnitude Komparator:

Nun erweitern wir die Schaltung etwas. Wir generieren aus vier einzelnen 1-Bit Magnitude Komparatoren einen 4-Bit Magnitude Komparator.
Hierfür wird erst mal wieder ein neues Projekt mit dem Namen Vier_Bit_Magnitude_Komparator angelegt und anschließend werden zwei Sourcefiles hinzugefügt: eines für den 4-Bit Komparator und eines für den 1-Bit Komparator.
Dem Sourcefile für den 4-Bit Komparator fügt ihr zwei 4-Bit Eingänge und drei 1-Bit Ausgänge hinzu, dem für den 1-Bit Komparator zwei 1-Bit Eingänge (hier für das Sourcefile des 4-Bit Komparators):

Vier_Bit_Magnitude_Komparator(4)

Das ganze sieht dann fertig so aus:

Magnitude_Komparator(3)

Anschließend wird eine Komponente für den 1-Bit Magnitude Komparator erzeugt

und instantiiert:

Mit jeder Instanz werden zwei Bits der beiden Eingangsbusse verglichen und das Ergebnis wird in AB für A > B, in E für A = B oder in BA für B > A gespeichert.
Als nächstes wird geprüft ob A > B ist:

Die Zahl A ist dabei größer als die Zahl B, wenn das niederwertigste Bit der Zahl A größer ist als das der Zahl B und alle anderen Bits gleich sind

oder wenn das zweite Bit der Zahl A größer ist als als das der Zahl B und alle anderen Bits außer dem ersten

gleich sind. Das erste Bit kann dabei ignoriert werden, da es nur die Wertigkeit 1 besitzt und nicht zum Ergebnis beiträgt.
Hierzu ein kleines Beispiel was dies etwas verdeutlicht:

Zahl A: 1010
Zahl B: 1001

Es werden nun das zweite und das erste Bit miteinander vergleichen.
Dabei stellt sich raus, das Zahl A größer ist als B (weil 10 > 01).
Dasselbe Ergebnis bekommen wir aber auch wenn wir nur die beiden zweiten Bits vergleichen (1 > 0).
Das selbe Schema verwende ich für das dritte Bit, außer das dort die ersten beiden niedrigsten Bits ignoriert werden.
Im letzten Schritt wird geprüft ob das vierte Bit der Zahl A größer ist als das der Zahl B.
Sobald eine der vier Bedingungen zutrifft, führt das Signal P1 einen High-Pegel.
Für Zahl B passiert das selbe:

Damit zwei Zahlen gleich sind, müssen alle Bits der beiden Zahlen identisch sein.
Dies überprüfe ich so:

Anschließen werden die Signale ausgegeben:

Jetzt kann die Schaltung synthetisiert, implementiert und überprüft werden.
Wenn alles korrekt ist, sieht das Ergebnis so aus wie auf dem Foto:

Magnitude_Komparator(5)
Magnitude_Komparator(6)

Die vier untersten Pins sind die Eingänge für Zahl B und die vier Pins dadrüber sind die Eingänge für Zahl A.
Die grüne LED signalisiert wieder das beide Zahlen gleich sind und die roten das die eine bzw. die andere Zahl größer ist.

 

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.