Paritätsgenerator mit While-Schleife

OP #2827726
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!
OP
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??? :)
Moderator (Firma: Titel) Persönliche Seite
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
OP
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!
Gast
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.
OP
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?!
Moderator (Firma: Titel) Persönliche Seite
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
Gast
> 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.
Moderator (Firma: Titel) Persönliche Seite
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
Gast
@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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.