While Schleife Synthetisieren oder umgehen

#1310507
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
Moderator (Firma: Titel) Persönliche Seite #1310526
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.
Gast #1310571
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)
#1310724
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren