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.
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.
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;
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'...
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.
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.
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.
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?
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.
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. :)
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.
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 ?
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 ;)
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 ;)
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.
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... :-/
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.
@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.
@ 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.
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.
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.
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.
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.