Forum: FPGA, VHDL & Co. Paritätsgenerator mit While-Schleife


von Christian K. (mortiferus)


Lesenswert?

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!

von user (Gast)


Lesenswert?

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.

von Georg A. (georga)


Lesenswert?

Ich versteh grad nicht, was die while-Schleife in dem Code überhaupt 
machen soll.

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


Lesenswert?

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?

von Christian K. (mortiferus)


Lesenswert?

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.

von Christian K. (mortiferus)


Lesenswert?

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??? :)

von Georg A. (georga)


Lesenswert?

> 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.

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


Lesenswert?

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

von Christian K. (mortiferus)


Lesenswert?

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 :)

von Christian K. (mortiferus)


Lesenswert?

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!

von PittyJ (Gast)


Lesenswert?

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.

von Christian K. (mortiferus)


Lesenswert?

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?!

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


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

> 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.

von Christian K. (mortiferus)


Lesenswert?

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?

von PittyJ (Gast)


Lesenswert?

Warum muss es ein while sein?
In meinen ganzen Designs ist nicht eines.
Ich benutze while nur in Testbenches.

von Christian K. (mortiferus)


Lesenswert?

Weil die Kursseite "Sequentielle Anweisungen - Die While-Schleife" 
heißt. Es wäre dann etwas befremdlich, wenn im Code keine vorkommen 
würde, oder? ;)

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


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.