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


von Stefan K. (stefan82)


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:
1
CWRSLCT_proc : process 
2
begin
3
wait until (rising_edge(WR_Clk));
4
  if ((FFlag_A0 = '0') and (RDC_active_A0 = '0')) then    
5
    while (FFlag_A0 = '0') loop
6
      WRC_active_A0 <= '1';
7
      WRC_active_A1 <= '0';
8
      FIFOWR_ERR <= '0';
9
      DIN_A0 <= DIN;
10
      DIN_A1 <= (others => '0');
11
      WR_EN_A0 <= WR_EN;
12
      WR_EN_A1 <= '0';
13
      wait until (rising_edge(WR_Clk)); -- not accepted!?
14
    end loop;
15
    WRC_active_A0 <= '0';
16
    WRC_active_A1 <= '0';
17
  elsif ((FFlag_A1 = '0') and (RDC_active_A1 = '0')) then    
18
    while (FFlag_A1 = '0') loop
19
      WRC_active_A0 <= '0';
20
      WRC_active_A1 <= '1';
21
      FIFOWR_ERR <= '0';
22
      DIN_A0 <= (others => '0');
23
      DIN_A1 <= DIN;
24
      WR_EN_A0 <= '0';
25
      WR_EN_A1 <= WR_EN;
26
      wait until (rising_edge(WR_Clk));
27
    end loop;
28
    WRC_active_A0 <= '0';
29
    WRC_active_A1 <= '0';
30
  else 
31
    WRC_active_A0 <= '0';
32
    WRC_active_A1 <= '0';
33
    FIFOWR_ERR <= '1';
34
    DIN_A0 <= (others => '0');
35
    DIN_A1 <= (others => '0');
36
    WR_EN_A0 <= '0';
37
    WR_EN_A1 <= '0';
38
  end if;
39
end process CWRSLCT_proc;

Gruß und Dank,

Stefan

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


Lesenswert?

1
 
2
  wait until (rising_edge(WR_Clk));
3
  :
4
      wait until (rising_edge(WR_Clk)); 
5
      :
6
      wait until (rising_edge(WR_Clk));
7
  :
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.

von Stefan K. (stefan82)


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

von Hans-Werner (Gast)


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)

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


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

von Stefan K. (stefan82)


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?

von Stefan K. (stefan82)


Lesenswert?

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

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.