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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.