Hallo, ich habe den folgenden VHDL-Code vorliegen: Library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity PAR_GEN is port( CLK: in std_logic; D: in std_logic ; Q: out std_logic; START,STOP: in boolean); end PAR_GEN; architecture RTL of PAR_GEN is attribute syn_looplimit: integer; attribute syn_looplimit of check: label is 1000; begin process(clk) variable PAR: boolean; begin if rising_edge(clk) then if START then PAR := false; check: while not STOP loop Q <= D; if D = '1' then PAR := not PAR; end if; end loop check; end if; if PAR then Q <= '1'; else Q <= '0'; end if; end if; end process; end RTL; Leider gibt mir der Synopsys-Compiler, trotz der Looplimit-Direktive die Fehlermeldung: "While loop is not terminating? You can set the maximum number of loop iterations with the syn_looplimit attribute -- attach it to the loop label" aus. Könnt ihr einen Fehler erkennen? Ich weiß, dass die Verwendung der While-Schleife problematisch ist, allerdings soll dies ein Beispiel für die Verwendung solch einer Schleife ein, daher müsste sie drin bleiben ;). Habe ich es richtig verstanden, dass die Abbruchbedingung zum Zeitpunkt der Kompilierung als Konstante vorliegen muss? Ich verstehe nämlich das grundsätzliche Problem des Compilers in diesem Fall nicht, da er doch aus dieser Beschreibung eine FSM erzeugen können müsste, die halt im Zustand STOP = true stopt?? Vielen Dank für eure Hilfe im Voraus!
Der Compiler muss darus Logik und Register machen, und bei einer Endlosschleife kann er das nicht. Wie auch, er kann das ja nicht parallel aufrollen.
Ich versteh grad nicht, was die while-Schleife in dem Code überhaupt machen soll.
Als Denkanstoß: in dieser Beschreibung muss die Schleife in einem (in Zahlen 1) und zudem in jedem Takt fertig sein... Woher kommen START und STOP? Wofür soll das ein Beispiel sein und wo muss der Code drinbleiben?
Georg A. schrieb: > Ich versteh grad nicht, was die while-Schleife in dem Code überhaupt > machen soll. Die While-Schleife soll, solange das Stopbit nicht gesetzt ist, den Eingang mit dem Ausgang verbinden und bei jeder eins die Parität setzen bzw. nicht setzen. Es wird dabei eine gerade Parität zugrunde gelegt.
Lothar Miller schrieb: > Als Denkanstoß: in dieser Beschreibung muss die Schleife in einem (in > Zahlen 1) und zudem in jedem Takt fertig sein... > > Woher kommen START und STOP? > Wofür soll das ein Beispiel sein und wo muss der Code drinbleiben? Start und Stop werden extern herangeführt. Der Code ist ein Beispiel eines Kurses für FPGA-Grundlagen. Leider bringt dein Anstoß kein Stein bei mir ins Rollen :( Wird die getaktete if-Schleife an der falschen stelle geschlossen? Oder muss ich das mit wait-until machen????....ah moment...wait until am Anfang des Prozesses und dann weiter unten noch einmal? Damit er sich einfach nur synchronisiert und nicht alles in einem Takt ausführen muss? Holzweg? Ja/Nein??? :)
> Die While-Schleife soll, solange das Stopbit nicht gesetzt ist, den > Eingang mit dem Ausgang verbinden und bei jeder eins die Parität setzen > bzw. nicht setzen. Nö. Da hat jemand was an VHDL überhaupt gar nicht verstanden.
Christian Klingler schrieb: > Leider bringt dein Anstoß kein Stein bei mir ins Rollen :( Ich probiers nochmal: Die ganze Schleife wird auf einmal komplett in der Zeit 0ps abgearbeitet. Und das genau bei der steigenden Flanke des Taktimpulses... Christian Klingler schrieb: > solange das Stopbit nicht gesetzt ist Also kommen START und STOP zeitlich nacheinander? Dann kann die Schleife niemals funktionieren. Weil sie ja in der Zeit 0 abgearbeitet wird. Kurz: Alles, was in einem CPLD/FPGA zeitlich nacheinander abgearbeitet wird, muss irgendwie als Zustandsautomat (Finite State Machine, FSM) realisiert werden. Schon ein Zähler (wie viele Bits sind da gekommen) ist eine simple FSM. Georg A. schrieb: > Da hat jemand was an VHDL überhaupt gar nicht verstanden. Ja, da ist noch ausschliesslich die Softwaredenkweise im Spiel. Das ist, wie wenn du Fussball-Spielregeln auf Tennis anwenden willst (sind ja beides Ballspiele)... 1. Vergiss die Software-Denkweise: du beschreibst Hardware 2. Besorg dir VHDL-Synthese von Reichardt&Schwarz und lies das mal 3. Mache einfache Übungen und sieh dir den RTL-Schaltplan dazu an
Du wirst es nicht glauben, aber die While-Schleife ist genau aus diesem Buch übernommen! Seite 42.... Edit: Mit der Wait-until Anweisung funktioniert es auch :)
Verstehe ich das nun richtig, die While-Schleife konnte nicht funktionieren, da innerhalb eines Taktschrittes alle Inputs vorhanden sein müssten, damit der Compiler daraus eine FSM inferieren kann. In diesem Fall kann er es nicht, weil er keine endliche Anzahl von Iterationen erkennen und somit die Zustände nicht klar defininieren kann. Benutze ich nun eine wait until Anweisung, einmal zu Beginn des Processes sowie vor der end loop Anweisung, so findet keine Abarbeitung innerhalb eines Taktes statt, sondern nur eine Synchronisation? Stimmt das so? Warum muss aber die zweite wait until Anweisung explizit vor der end loop Anweisung platziert werden, da ansonsten der bereits angesprochene Fehler auftritt? Danke im Voraus!
Was ich bei VHDL gelernt habe sind 2 Basics: Es gibt nur ein einziges rising_edge(). Nimm keine weiteren waits etc. Alles was in der realen Welt zeitlich abläuft und sich ändert, braucht eine State Machine. Mit diesen Reduzierungen bin ich als Anfänger sehr gut gefahren. Weiterer Anfängertipp: Variablen sind böse. Benutze nur Signale! Das macht das Leben für einen Anfänger einfacher.
Wenn ich den Code aus dem Buch richtig verstanden habe, müssen hier jedoch zwei benutzt werden, damit der Prozess nicht innerhalb eines Taktes ausgeführt wird, oder? Denn der Prozess startet sobald er die steigende Flanke erkannt hat und läuft dann bis zur nächsten wait-Anweisung durch. Dort wird er solange suspendiert, bis die nächste steigende Flanke erkannt wurde. Ein Signal kann ich in diesem Fall doch aufgrund des Aktualisierungsproblems nicht verwenden?!
Christian Klingler schrieb: > Du wirst es nicht glauben, aber die While-Schleife ist genau aus diesem > Buch übernommen! Seite 42.... Die sieht da aber ganz anders aus als der oben gepostete Quelltext! > Edit: Mit der Wait-until Anweisung funktioniert es auch :) Klar: man kann nicht eine Sensitivliste und (eines oder mehrere) wait in einem Prozess verwenden! > Edit: Mit der Wait-until Anweisung funktioniert es auch :) In meinem Exemplar vom Buch steht handschriftlich von mir reingeschrieben: "Geht nicht mit XST!" Und am Ende dieses Abschnitts steht im Buch dann auch: "Mit diesem Beispiel ... sind die Grenzen für synthesegerechten Code nach IEEE ... erreicht." Und mit grenzwertigem VHDL Code ist es auch so: der eine Synthesizer kanns, der andere nicht, der dritte nur halb... Ich verwende neue Konstrukte nur, wenn mehrere Synthesizer das können. Christian Klingler schrieb: > Wenn ich den Code aus dem Buch richtig verstanden habe, müssen hier > jedoch zwei benutzt werden, damit der Prozess nicht innerhalb eines > Taktes ausgeführt wird, oder? Ja, aber ich sags mal so: VERGISS DIESEN CODE SCHNELLSTMÖGLICH. Christian Klingler schrieb: > damit der Compiler daraus eine FSM inferieren kann. Du glaubst nicht, wie wenig der Synthesizer kann. Die Grenz liegt etwa da: http://www.lothar-miller.de/s9y/archives/47-wait-im-Prozess.html
> Denn der Prozess startet sobald er die steigende Flanke erkannt hat und > läuft dann bis zur nächsten wait-Anweisung durch. Dort wird er solange > suspendiert, bis die nächste steigende Flanke erkannt wurde. Ein Prozess started nicht er IST.
Dann erst einmal vielen Dank für die Hilfe! Gut, ich vergesse den Code ganz schnell wieder! Hättest du denn eine Idee für eine nette, einfache Alternative, in der die While-Schleife Anwendung findet?
Warum muss es ein while sein? In meinen ganzen Designs ist nicht eines. Ich benutze while nur in Testbenches.
Weil die Kursseite "Sequentielle Anweisungen - Die While-Schleife" heißt. Es wäre dann etwas befremdlich, wenn im Code keine vorkommen würde, oder? ;)
Christian Klingler schrieb: > Es wäre dann etwas befremdlich, wenn im Code keine vorkommen > würde, oder? ;) Dann nimm die while-Schleife doch einfach dort, wo sie der Rest der Welt auch nimmt: in einem kombinatorischen Prozess. Aber nicht zur Ablaufsteuerung, wo alle anderen eine FSM nehmen. > Hättest du denn eine Idee für eine nette, einfache Alternative, > in der die While-Schleife Anwendung findet? http://www.lothar-miller.de/s9y/archives/55-Finde-das-MSB.html http://www.lothar-miller.de/s9y/archives/78-Bubblesort.html http://www.lothar-miller.de/s9y/archives/73-Wurzel-in-VHDL.html
@Christian: wenn du nur irgendein Beispiel für einen while-Schleife programmieren möchtest, ohne bestimmten Anwendungszweck, dann mach einfach die Eingangsdaten von einem Paritätsgenerator parallel statt seriell, dann sind die Grenzen fest, und du kannst bequem mit ner while-Schleife über die über die Eingangsbits drumrumschleift die Parität ausrechnen.
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.