FIFO: Full und Empty

Gast #2675547
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.
#2675690
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.
#2675789
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.
Gast #2675865
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.
Gast #2678248
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ß.

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