Forum: FPGA, VHDL & Co. FIFO: Full und Empty


von Dosmo (Gast)


Lesenswert?

Hallo,

ich hab gerade ein Verständnisproblem mit FIFOs. Ich benutze die FIFOs 
des CoreGenerators von Xilinx ISE 13.4.
Es geht darum, daß Datenworte aus einem FIFO in einen anderen kopiert 
werden sollen. Beide FIFOs sind "First Word Fall Through".

Mein Ansatz sah bisher so aus:
1
if ((quellfifo_empty = '0') and (zielfifo_full = '0')) then
2
  quellfifo_readenable <= '1';
3
  zielfifo_writeenable <= '1'; 
4
else
5
  quellfifo_readenable <= '0';
6
  zielfifo_writeenable <= '0'; 
7
end if;
Die Datensignale beider Fifos sind direkt verdrahtet (ohne Takt).

Wenn ich es jetzt richtig verstehe, ist es bei einem FWFT-FIFO aber so, 
daß "EMPTY" erst dann kommt, nachdem man das letzte Wort ausgelesen 
hat. In diesem Fall würde aber mit meinem Code "ReadEnable" und 
"WriteEnable" einen Takt zulange anstehen, richtig?
D.h. ich müßte korrekterweise "ALMOST_EMPTY" verwenden? Und 
"ALMOST_FULL"?
Danke.

von D. I. (Gast)


Lesenswert?

Was sagt die Simulation?

von Dosmo (Gast)


Lesenswert?

D. I. schrieb:
> Was sagt die Simulation?

Stützt meine Vermutung.

von Christian R. (supachris)


Lesenswert?

Dosmo schrieb:
> In diesem Fall würde aber mit meinem Code "ReadEnable" und
> "WriteEnable" einen Takt zulange anstehen, richtig?

Nur wenn das Code-Schnipsel oben aus einem getaktetem Prozess stammt. 
Ansonsten kannst du das (not) Empty des Quell-FIFOs direkt als Write 
Enable des Ziel-FIFOs benutzen. (Bei First Word Fall Through). Direkt 
nach der Taktflanke, die das Auslesen des letzten Wortes (was ja vorher 
schon anstand) auslöst, wird eben dieses Wort ja in den anderen FIFO 
geschrieben.

von Sigi (Gast)


Lesenswert?

Warum setzt du das 2. FIFO als "First Word Fall Through"?
Damit gehen dir ja die ersten BEIDEN Worte verloren.

von Christian R. (supachris)


Lesenswert?

Da geht nirgendwo was verloren. FWFT Mode bedeutet doch nur, dass das 
erste Datenwort schon anliegt, bevor das Read Enable gesetzt wird. Es 
kann also mit der ersten Taktflanke, zu der Read Enable aktiv ist, ins 
nächste Register übernommen werden. Beim Standard Mode müsste man dann 
erst das Wort in der 2. Flanke übernehmen. Verloren geht in beiden 
Fällen erst mal nichts.

von Dosmo (Gast)


Lesenswert?

Christian R. schrieb:
> Nur wenn das Code-Schnipsel oben aus einem getaktetem Prozess stammt.
> Ansonsten kannst du das (not) Empty des Quell-FIFOs direkt als Write
> Enable des Ziel-FIFOs benutzen. (Bei First Word Fall Through). Direkt
> nach der Taktflanke, die das Auslesen des letzten Wortes (was ja vorher
> schon anstand) auslöst, wird eben dieses Wort ja in den anderen FIFO
> geschrieben.

Ja, es ist in einem getakteten Prozeß.
In meiner Anwendung ist es nicht so simpel wie im Code-Schnipsel. Ich 
muß zuerst das Datenwort bewerten, dann darf ich es entweder kopieren 
oder muß es verwerfen, daher bietet sich FWFT an.
Mit "ALMOST_EMPTY" funktioniert jetzt es übrigens gut, aber mir fehlt 
einfach noch das intuitive Verständnis für diese 
Wann-hat-ein-Signale-welchen-Status-Sache.

von Dosmo (Gast)


Lesenswert?

Wen's interessiert:

Damit es wirklich korrekt funktioniert, mußte ich es letztendlich so 
machen:
1
if (      (     (quellfifo_readenable = '0' and quellfifo_empty       = '0')
2
            or  (quellfifo_readenable = '1' and quellfifo_almostempty = '0'))
3
      and (     (zielfifo_writeenable = '0' and zielfifo_full         = '0')
4
            or  (zielfifo_writeenable = '1' and zielfifo_almostfull   = '0')) ) then
5
   quellfifo_readenable <= '1';
6
   zielfifo_writeenable <= '1'; 
7
else
8
   quellfifo_readenable <= '0';
9
   zielfifo_writeenable <= '0'; 
10
end if;

Der Trick ist, daß man jenachdem, ob das RdEna/WrEna schon gesetzt ist 
oder nicht, "EMPTY"/"FULL" or "ALMOST_EMPTY"/"ALMOST_FULL" auswerten 
muß.

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.