www.mikrocontroller.net

Forum: FPGA, VHDL & Co. While Schleife Synthetisieren oder umgehen


Autor: Stefan K. (stefan82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
Ich habe folgenden Code zurecht gebastelt, um abwechselnd in zwei 
FiFo_Speicher zu schreiben. Nun sagt mir die ISE 10.1, dass die wait 
Anweisung innerhalb des Prozesses nicht synthetisierbar ist.
Im Buch VHDL-Synthese hies es nur "die Synthese von Prozessen mit dem 
while konstrukt" sei "noch nicht einheitlich implementiert".

Hat jemand nen Denk Anstoß für mich wie ich die while Schleife umgehen 
kann? Hab da grad irgendwie ne Denk-Blockade ... denk glaub ich ohnehin 
noch zu nahe an einer Hochsprache orientiert.

Meine vhdl source dazu:
CWRSLCT_proc : process 
begin
wait until (rising_edge(WR_Clk));
  if ((FFlag_A0 = '0') and (RDC_active_A0 = '0')) then    
    while (FFlag_A0 = '0') loop
      WRC_active_A0 <= '1';
      WRC_active_A1 <= '0';
      FIFOWR_ERR <= '0';
      DIN_A0 <= DIN;
      DIN_A1 <= (others => '0');
      WR_EN_A0 <= WR_EN;
      WR_EN_A1 <= '0';
      wait until (rising_edge(WR_Clk)); -- not accepted!?
    end loop;
    WRC_active_A0 <= '0';
    WRC_active_A1 <= '0';
  elsif ((FFlag_A1 = '0') and (RDC_active_A1 = '0')) then    
    while (FFlag_A1 = '0') loop
      WRC_active_A0 <= '0';
      WRC_active_A1 <= '1';
      FIFOWR_ERR <= '0';
      DIN_A0 <= (others => '0');
      DIN_A1 <= DIN;
      WR_EN_A0 <= '0';
      WR_EN_A1 <= WR_EN;
      wait until (rising_edge(WR_Clk));
    end loop;
    WRC_active_A0 <= '0';
    WRC_active_A1 <= '0';
  else 
    WRC_active_A0 <= '0';
    WRC_active_A1 <= '0';
    FIFOWR_ERR <= '1';
    DIN_A0 <= (others => '0');
    DIN_A1 <= (others => '0');
    WR_EN_A0 <= '0';
    WR_EN_A1 <= '0';
  end if;
end process CWRSLCT_proc;

Gruß und Dank,

Stefan

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 
  wait until (rising_edge(WR_Clk));
  :
      wait until (rising_edge(WR_Clk)); 
      :
      wait until (rising_edge(WR_Clk));
  :
Ja, sowas hinzuschreiben würde selbst ich mich nicht trauen.
Und ich traue mich einiges... ;-)

> die wait Anweisung innerhalb des Prozesses nicht synthetisierbar ist.
Doch. Aber es ist nur eine (in Zahlen: 1) pro Prozess synthetisierbar.
Warum? Die Wait-Anweisung ist nichts anderes, als eine in den Prozess 
hineingeschriebene Sensitiv-Liste. Und davon gibt es auch nur maximal 1 
pro Prozess.

Autor: Stefan K. (stefan82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok. Sry ... den allgemeinen Syntax für das VHDL While Construct habe ich 
mir aus dem VHDL-Synthese Buch abgeschrieben.

Wenn ich die zusätzlichen waits in den Loops nun raus nehme meckert ISE 
mit einem Loop Iteration Limit (64) rum. Wie komme ich denn nun daran 
wieder vorbei ... ?

VHDL und ISE bringen mich noch irgendwann um ...

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normalerweise implementiert man Schleifen als Zustandsmaschinen.
Wo ist deine Zustandsmaschine ?
"while" ist nicht synthetisierbar.
Zustand 1: Anfangswert setzen
Zustand 2: Operationen ausführen (Vorsicht: Alles parallel)
Zustand 3: Prüfen ob Endwert erreicht (Wenn nicht: Rücksprung)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weder FFlag_Ax noch RDC_active_Ax werden von diesem Prozess verändert. 
Sind das statische Signale?

Falls ja: lass die while-loop-Geschichte und die zusätzlichen wait 
einfach raus. Denn der Prozess (und damit auch die ganzen Abfragen) wird 
ja in jedem Takt durchlaufen...

Autor: Stefan K. (stefan82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es handelt sich leider nicht um statische Signale FFlag_Ax it das Full 
Flag des jeweiligen FiFos und das RDC_Active_Ax signalisiert einen 
laufenden Read Prozess auf dem jeweiligen FiFo.

Versuche gerade das in einer Statemachine zu kodieren, hab mir aber ein 
paar Latches eingefangen. Muß eigentlich wirklich jeder benannte 
"Ausgang" der Statemachine in jedem State aufgeführt werden?

Also wenn ich beispielsweise WR_En in Status S1 setzen will, muß ich 
dann den Zustand auch für alle anderen States einzeln eindeutig 
definieren?

Autor: Stefan K. (stefan82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, die obige Frage hat sich gerade erledigt, habs ausprobiert und mir 
das RTL Schematic mal angeguckt ... eigentlich ja auch logisch.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.