Forum: FPGA, VHDL & Co. 1-Bit-Komparator als Komponente für n-Bit-Komparator


von Float (floatint)


Lesenswert?

Nabend,

ich muss für die UNI einen n-Bit-Komparator in VHDL realisieren. Dazu 
soll man zunächst einen 1-Bit-Komparator entwerfen, diesen dann als 
Komponente für den n-Bit-Komp. benutzen. Sowohl der 1-Bit, als auch der 
N-Bit haben jeweils einen Ausgang für größer, gleich, kleiner.

Der 1-Bit-Komp ist kein Problem. Im VHDL Programm für den n-Bit-Komp. 
bekomme ich ihn auch als Komponente eingebunden.

Was dann so aussieht:

library ieee;
use ieee.std_logic_1164.all;

ENTITY Komparator_N is
  generic (N:  integer  := 4);  -- Hier gewünschte Wortbreite
  port
  (
    E:  IN   std_logic; --1-bit-Komp arbeitet nur, wenn E=1
    A,B:  IN   std_logic_vector(N-1 downto 0);

    ZOUT:  OUT std_logic_vector(2 downto 0)

  );
END ENTITY Komparator_N;

ARCHITECTURE verhalten of Komparator_N is

--GRößer, GLeich, KLeiner Signal
SIGNAL Hi, Eq, Lo: std_logic_vector(N-1 downto 0);

    COMPONENT Komparator_1 is
    port
    (
      E,A,B:    IN  std_logic;
      Z2,Z1,Z0:  OUT std_logic
    );
    END COMPONENT Komparator_1;

BEGIN
SCHLEIFE: for i in 0 to N-1 GENERATE
    KOMP: Komparator_1 port map(E, A(i), B(i), Hi(i), Eq(i), Lo(i));
    END GENERATE SCHLEIFE;

end architecture verhalten;


Ab hier folgt nur noch Scheitern. Gedanklich finde ich das Ergebnis 
(Zahl A = Zahl B) am einfachsten, da ich im Prinzip den gestamten Vektor 
Eq(i) überprüfen muss, ob jede Stelle eine '1' ist. Aber hier scheitert 
es schon, weil ich es nicht gebacken kriege, jedes einzelne Bit des 
Vektors abzufragen.

Also prinzipiell so: Wenn Eq(N-1 downto 0) = 1, dann Ausgang GLEICH=1.

Brauche eure Hilfe. Nicht nur für den Vergleich ob gleich, sondern auch 
für größer und kleiner.

: Bearbeitet durch User
von Markus F. (mfro)


Lesenswert?

Tipp: Bits haben eine Wertigkeit.

Entsprechend dieser Wertigkeit fällt auch das Ergebnis aus. Der 
"gleich"-Fall ist der aufwendigste, aber auch der, um den Du dich am 
wenigsten kümmern musst.

von Float (floatint)


Lesenswert?

Markus F. schrieb:
> Tipp: Bits haben eine Wertigkeit.
>
> Entsprechend dieser Wertigkeit fällt auch das Ergebnis aus. Der
> "gleich"-Fall ist der aufwendigste, aber auch der, um den Du dich am
> wenigsten kümmern musst.

Oh man. Danke für den Tipp, ich habe den Wald vor lauter Bäumen nicht 
mehr gesehen.

Design funktioniert jetzt. Nachdem ich dein Tipp gelesen habe hat es 
keine 2 Minuten gedauert :)

Den Gleich-Fall habe ich einfach mit einem nur aus einsen bestehendem 
Hilfsvektor gelöst. Da ich keine "=" Operation beim std_logic_vector 
machen konnte, sonst ginge ja: Ausgang <= '1' WHEN Vector = (N-1);

Hier ein Auszug vom finalen Zustand:

BEGIN
  SCHLEIFE: for i in 0 to N-1 GENERATE
  KOMP: Komparator_1 port map(E, A(i), B(i), Hi(i), Eq(i), Lo(i));
  EqH(i) <= '1'; --Hilfsvektor
  END GENERATE SCHLEIFE;
--Größer
ZOUT(2) <= '1' WHEN Hi>Lo ELSE '0';

--Gleich
ZOUT(1) <= '1' WHEN Eq=EqH ELSE '0';

--Kleiner
ZOUT(0) <= '1' WHEN Lo>Hi ELSE '0';

end architecture verhalten;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Und wozu jetzt dein handgestrickter Komparator, wenn du hinterher noch 3 
gleich breite Komparatoren brauchst, um die "Hilfsvektoren" zu 
vergleichen?

Warum nicht einfach so:
--Größer
ZOUT(2) <= '1' WHEN A> B ELSE '0';
--Gleich
ZOUT(1) <= '1' WHEN A=B ELSE '0';
--Kleiner
ZOUT(0) <= '1' WHEN A<B ELSE '0';

Und wenn das Enable noch mit rein soll, dann einfach vor jede ELSE ein 
AND E='1'...

von Float (floatint)


Lesenswert?

Ich weiss, aber so lautet nun mal die Aufgabe.  Da geht's dann eher 
darum, dass man Komponenten Einbindung, Port mapping usw. verinnerlicht 
bzw. gehe ich stark davon aus.

Für den jetzigen Entwurf fällt mir nix anderes ein, als am Ende eben 
nochmal den Vergleich durchzuführen.

von VHDL hotline (Gast)


Lesenswert?

Taha M. schrieb:
> Ich weiss, aber so lautet nun mal die Aufgabe.

Wenn die Aufgabenstellung keine genaueren Angaben macht, kann man deine 
Lösung gelten lassen.

Taha M. schrieb:
> Für den jetzigen Entwurf fällt mir nix anderes ein,

Die Intention der Aufgabe ist möglicherweise, dass du den 
1-Bit-Komparator nicht n-mal instanziierst, sondern die Bits sequenziell 
vom MSB an durch einen 1-Bit Komparator schiebst. Aber ohne genaue 
Aufgabenstellung und Wissen, was ihr schon gelernt habt und anwenden 
sollt (FSM?) kann man das nicht sagen.

Taha M. schrieb:
> Da ich keine "=" Operation beim std_logic_vector
> machen konnte, sonst ginge ja: Ausgang <= '1' WHEN Vector = (N-1);

Ausgang <= '1' WHEN Vector = (others => '1');

sollte gehen. Für beliebige integer geht es auch, mit ein paar 
Typumwandlungen. Je nachdem, welche library du für std_logic verwendest.

von Markus F. (mfro)


Lesenswert?

Meiner Ansicht nach macht die Aufgabe, einen Komparator in VHDL zu 
bauen, nur dann wirklich Sinn, wenn man die Vergleichsoperatoren "=", 
">" und "<" nicht benutzen darf.

Sonst kann man den n-bit Komparator ja direkt hinschreiben und hat den 
1-Bit Komparator mit n=1 auch gleich mit erschlagen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus F. schrieb:
> Meiner Ansicht nach macht die Aufgabe, einen Komparator in VHDL zu
> bauen, nur dann wirklich Sinn, wenn man die Vergleichsoperatoren "=",
> ">" und "<" nicht benutzen darf.
Sehe ich auch so.

@Taha M:
Ist der Port oder sogar die ganze Komponente Komparator_1 so vorgegeben, 
oder hast du den/die selbst ausgeknobelt?

von J. S. (engineer) Benutzerseite


Lesenswert?

Markus F. schrieb:
> Meiner Ansicht nach macht die Aufgabe, einen Komparator in VHDL zu
> bauen, nur dann wirklich Sinn, wenn man die Vergleichsoperatoren "=",
> ">" und "<" nicht benutzen darf.

Dann braucht man aber irgendwann irgendwo ein "UND" und das ist aus 
logischer Sicht ein Vergleich.

Taha M. schrieb:
> ich muss für die UNI einen n-Bit-Komparator in VHDL realisieren.
An welcher Uni wird in welcher Vorlesung das gefordert?

Würde mich mal interessieren.

Entweder es soll auf weiterführende akademische Tiefen hinleiten, oder 
aber man hat wieder angefangen, so etwas zu fragen, weil den Studenten 
der Zusammenhang zur Boolschen Logik abhanden zu kommen droht.

von Float (floatint)


Lesenswert?

Ich bin berufsbegleitender Student in Hagen.
Zu der Aufgabe: Das Schema ist eigentlich relativ detailliert 
vorgegeben.

Für den Komparator soll es wie folgt ablaufen:

1. Wahrheitstabelle für einen 1-Bit Komp. der A und B auf größer, 
gleich, kleiner vergleicht und nur dann arbeitet, wenn ein 
Freigabesignal vorhanden ist.
2. Boolschen Gleichungen ermitteln.
3. Unter Einsatz dieser Gleichungen ein VHDL Prog. für den 1-Bit Komp 
schreiben.
4. Einen n-Bit Komp entwickeln, der den zuvor entwickelten 1-Bit Komp. 
als Komponente nutzt.

Das Design wird dann am Wochenende auf ein FPGA (DE2 Altera) geladen. 
Die binären Ausdrücke werden dann mittels Schalter auf dem Board 
eingestellt und die Ausgänge des Komps. mittels LED visualisiert.

Zusätzlich müssen wir auch einen n-Bit-Subtrahierer aus einem 1-Bit 
Subtrahierer entwickeln. Ablauf ist ähnlich.

Aus der Aufgabenstellung für den Komp. ist nicht ersichtlich, ob n 
Instanzen generiert werden müssen, oder ob der binäre Ausdruck bitwise 
durch "einen" 1-bit-comp. geschleift wird. Wenn letzteres der Fall sein 
sollte, wäre mein Programm natürlich falsch.

Ich weiss aber auch ehrlich gesagt nicht, wie ich das so realisieren 
müsste, dazu reichen meine Kenntnisse in VHDL noch nicht aus.

Ich hab das ganze mal mit sequenziellem Design versucht, aber innerhalb 
eines Process konnte ich kein port mapping an der Komponente machen.

Ich bräuchte quasi sowas wie:
1. Generiere einen 1-Bit-Comp. und tu die ports mappen.
2. Angefangen vom MSB: Spuckt der 1-Bit-Comp. ein "größer", dann brich 
die Schleife direkt ab und gebe direkt "Zahl ist größer" aus. Spuckt er 
"kleiner", dann ist die Zahl kleiner. Spuckt er "gleich", dann springe 
zurück und vergleiche MSB-1.

In einer For-Generate Schleife konnte ich das nicht tun, weil ich die 
Schleife nicht unterbrechen kann. In einer For-Loop Schleife, die ich 
unterbrechen kann, die aber nur im Process funktioniert, weil 
sequentiell, kann ich aber kein port mapping an Komponenten machen.

Es gibt bestimmt einen Weg, ich habs aber nicht hinbekommen. :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Taha M. schrieb:
> Das Schema ist eigentlich relativ detailliert vorgegeben.
Du braucht eine Idee, wie du die Aufgabe mit einer Hardware-Schaltung 
lösen würdest und beschreibe diese Schaltung mit VHDL. Denn dafür ist 
diese HardwareBESCHREIBUNGssprache da.

Also vergiss zuallererst den Begriff "Programmieren" im Zusammenhang mit 
VHDL.

> In einer For-Loop Schleife, die ich unterbrechen kann
Eine for-Schleife in VHDL kann nicht "abgebrochen" werden. Alle 
"Schleifendurchläufe" sind immer in der Hardware da. Es wird lediglich 
Logik erzeugt, die diesen "Abbruch" über einen Prioritätsencoder 
erzeugt.

Taha M. schrieb:
> 1. Wahrheitstabelle für einen 1-Bit Komp. der A und B auf größer,
> gleich, kleiner vergleicht und nur dann arbeitet, wenn ein
> Freigabesignal vorhanden ist.
Erweitere diese Ports um Eingangssignale für größer, gleich und kleiner. 
Dann kannst du das Ergebnis von oben nach unten durchreichen und am LSB 
herauspurzeln lassen.

von Float (floatint)


Lesenswert?

Ich muss zugeben es fällt mir schwer mich von C bzw. C++ zu lösen, aber 
das wird schon.

Zu der Porterweiterung: Ich darf der 1Bit Komponente keinen Eingang oder 
Ausgang hinzufügen. Oder meinst du, dass ich den N-Bit Komparator um 
diese Eingänge erweitern sollte ?

von Markus F. (mfro)


Lesenswert?

Jürgen S. schrieb:
> Dann braucht man aber irgendwann irgendwo ein "UND" und das ist aus
> logischer Sicht ein Vergleich.

Yo, aber man muss den Denkapparat dazu benutzen, dafür die richtige 
Stelle zu finden.

Und das is ja immer eine gute Sache ;)

von Markus F. (mfro)


Lesenswert?

Taha M. schrieb:
> Zusätzlich müssen wir auch einen n-Bit-Subtrahierer aus einem 1-Bit
> Subtrahierer entwickeln.

Bei der Aufgabenstellung scheint sich tatsächlich jemand was gedacht zu 
haben.

Hier soll sich wohl die Erkenntnis einstellen, daß der n-Bit-(Grössen-) 
Komparator tatsächlich nichts anderes ist als ein Addierwerk. So gesehen 
hast Du am falschen Ende der Aufgabe angefangen ;)

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Markus F. schrieb:
> Bei der Aufgabenstellung scheint sich tatsächlich jemand was gedacht zu
> haben.

Die Überlegungen des Referenten der Nachholschule Hagen in Ehren, aber 
wer braucht das? Das Verständnis für solche Details haben die richtigen 
Studenten einschlägiger Fachbereiche und benötigen es in der Praxis 
überhaupt nicht.

Das Level solcher Ansätze war das der PAL Programmierung Ende der 80er. 
Schon in den 90ern hat man mit Gleichungen gearbeitet und es den Rechner 
optimieren lassen. Mit VHDL wird nur noch + und - hingeschrieben = 
"programmiert" und keine Hardware mehr beschrieben. Kein Mensch macht 
das mehr so. Seit 20 Jahren nicht mehr.

Und seit 10 Jahren werden für die Rechnungen COREs eingesetzt, für die 
einer nicht mal mehr die gesamten Details von +,-,*,: wissen und 
programmieren muss, sondern er kopiert einfach einen CORE rein, bzw. 
lässt es MATLAB machen.

Dort und nur dort gibt es noch Arbeitsbedarf und Personalbedarf.

Nacktes VHDL als baremetal wird immer weniger gefragt. Wozu dort Leute 
ausbilden? Es gibt heute schon mehr, als genug, die das nicht einsetzen 
können.

Und gar diese rudimentäre Logik zum Rechnen brauchen heute allerhöchsten 
noch ein paar Chipdesigner, die einen ADDER oder SUBBER als pipeline 
bauen möchten, damit sie einen COPRO zuammenstricken können, der als 
CORE in ihre ASIC-LIB fließt. Dazu muss man schon gar keinen ausbilden. 
Vollkommen nutzlos.

Aber ein Blick auf die Karte zeigt das Problem: Hagen liegt im 
Sauerland. Da haben sie das mit dem modernen Software-Denken noch nicht 
so drauf, wie mir scheint.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus F. schrieb:
> tatsächlich nichts anderes ist als ein Addierwerk.
Dann sollte der "Addier-Komparator" aber wenigstens noch einen 
Übertragseingang haben. Denn die beiden Eingänge, die er hat, taugen 
bestenfalls für einen Halbaddierer.
Bestenfalls könnte man den Enable Eingang als Übertrag verwenden. Das 
wäre aber böse Obfuscation... :-/

von Markus F. (mfro)


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #6065225:
> Da haben sie das mit dem modernen Software-Denken noch nicht
> so drauf, wie mir scheint.

Na, schlägt das Wetter auf die Laune heute, oder was?

Wenn "modernes Software-Denken" bedeutet, dass man seinen Werkzeugkasten 
an Grundlagen nicht mehr beherrschen muss, kann's mir gestohlen bleiben.

von Float (floatint)


Lesenswert?

@Weltbester FPGA. Das ganze als Humbug zu bezeichnen finde ich nicht 
korrekt. Nach deiner Logik bräuchte man dann kaum noch was zu vertiefen, 
da es so oder so für so gut wie alles eine Software oder Maschine gibt.

Mir hat die Aufgabe jedenfalls geholfen, etwas mehr in VHDL 
einzusteigen.

von Sven J. (sven_j838)


Lesenswert?

@ Weltbester FPGA: Zum einen liegt Hagen nicht im Sauerland und zum 
anderen kommt der Dozent nicht aus Hagen. Also, wenn man keine Ahnung 
hat, einfach mal ...
Ach ja, wir Studenten können am wenigsten für die ausgewählten Aufgaben.

von S. R. (svenska)


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #6065225:
> Die Überlegungen des Referenten der Nachholschule Hagen
> in Ehren, aber wer braucht das?

Du bist bestimmt auch der Meinung, man müsse Ortskenntnis nicht 
erwerben, weil gibt ja Google Maps? Oder lesen lernen, weil gibt ja 
Youtube und Wikipedia mit Sprachausgabe?

Aber du warst sicherlich auch nie Anfänger.

Taha M. schrieb:
> In einer For-Generate Schleife konnte ich das nicht tun,
> weil ich die Schleife nicht unterbrechen kann.

Du kannst aber die Vergleichsausgänge so verknüpfen, dass du einen 
Ausgang dann ignorierst, wenn es bereits ein früheres Ergebnis gibt.

Wenn du zwei Vektoren "0xxxxx" und "1xxxxx" miteinander vergleichst, 
dann steht das Ergebnis nach dem ersten Bit bereits fest, alle weiteren 
Vergleiche musst du ignorieren. Wenn beim letzten Bit noch kein Ergebnis 
vorhanden ist, dann müssen die Eingänge gleich sein.

Mal dir das mal als Schaltung auf Papier auf und schreibe es dann in 
VHDL nochmal hin.

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Taha M. schrieb:
> @Weltbester FPGA. Das ganze als Humbug zu bezeichnen finde ich nicht
> korrekt. Nach deiner Logik bräuchte man dann kaum noch was zu vertiefen,
> da es so oder so für so gut wie alles eine Software oder Maschine gibt.
Falsch gedacht und noch falsch geschlussfolgert.

Vertiefung ist gut, aber die liegt hier nicht vor. VHDL ist in dem Fall 
eines Komparators auf Algo-Ebene nichts anderes als Mathematik, also 
Beschreibung! Deshalb reiten Viele, wie z.B. Lothar so oft auf dem 
Aspekt Beschreibungssprache herum.

Mit mit einer funktionellen Beschreibung kann man keinen 1-Bit 
Komparator beschreiben. Wenn, dann müsste dessen Funktion durch low 
level Gleichungen und letztlich durch die Funktion von Transistoren 
beschrieben werden. VHDL als höhrere Sprache zu verwenden, um etwas 
unterhalb von VHDL zu beschreiben, ist also widersinnig.

Das müsste dein Dozent erkennen und euch erklären. Da ich aber aus 
praktischer Erfahrung weiß, wer dort Dozent macht, wundert mich das 
nicht.

Das Hagener Modell ist ja vorwiegend für solche Leutchen gedacht, die es 
im normalen, an richtigen Hochschulen vorgegebem Lerntempo nicht 
schaffen, den Stoff zu folgen, sondern etwas länger brauchen. Denen 
serviert man es dann auch etwas einfacher. Und da in diesem Modell so 
viel Geld nicht zu machen ist, verirren sich dort hin auch nur die 
Dozenten, welche an umliegenden Universitäten nicht bekommen haben, aber 
aus unerfindlichen Gründen, in der deutschen Valachei leben wollen.

Sven J. schrieb:
> @ Weltbester FPGA: Zum einen liegt Hagen nicht im Sauerland
Ich zitiere dir mal Wikipedia:
"Hagen wird oft als „das Tor zum Sauerland“ bezeichnet." Es ist also 
kurz davor. Faktisch liegt Hagen zwischen so großartigen Orten wie Olpe 
und Siegen, wahre highlights menschlichen Dasein.

> und zum anderen kommt der Dozent nicht aus Hagen.
Das wundert mich nicht.

von Fitzebutze (Gast)


Lesenswert?

Und auch wenn's die Klugscheisser 100fach runterbeten: VHDL ist eine 
Programmiersprache. Punkt.
Aber ja, man kann damit HW simulieren und synthetisieren.
Ansonsten empfehle ich das erste Kapitel der GHDL-Dokumentation oder die 
Grundlagen von Turing.

von Float (floatint)


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #6104765:
> Mit mit einer funktionellen Beschreibung kann man keinen 1-Bit
> Komparator beschreiben. Wenn, dann müsste dessen Funktion durch low
> level Gleichungen und letztlich durch die Funktion von Transistoren
> beschrieben werden. VHDL als höhrere Sprache zu verwenden, um etwas
> unterhalb von VHDL zu beschreiben, ist also widersinnig.


Wer behauptet denn, dass das Sinn und Zweck der Aufgabe war ? Es ging 
lediglich darum - zumindest für uns Studierende - sich etwas mit VHDL 
vertrauter zu machen. Grundlagen mit dem Arbeiten der Software, 
nebenläufige Schleifen, Komponenteneinbindung, Syntax, Pin-Belegungen, 
Ansteuerung usw.

Weltbester FPGA-Pongo schrieb im Beitrag #6104765:
> Das Hagener Modell ist ja vorwiegend für solche Leutchen gedacht, die es
> im normalen, an richtigen Hochschulen vorgegebem Lerntempo nicht
> schaffen, den Stoff zu folgen, sondern etwas länger brauchen. Denen
> serviert man es dann auch etwas einfacher.

Keine Ahnung an welcher Hochschule du warst/bist und von welchem Modell 
du sprichst, aber "wir" studieren "berufsbegleitend."
Dass wir neben einer min. 40Std./Woche Arbeit mit teilweise 
Rufbereitschaft, neben Familie und Kindern pro Semester "nur" 78% von 
dem, was ein "normaler" Vollzeitstudent pro Semester abarbeiten soll 
durchrattern, ist alles andere als "dem normalen Tempo nicht folgen 
können."

Keine Ahnung auf was du dich verkrampfst und warum du daraus eine 
Grundsatzdiskussion machst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.