Xilinx Built-in FIFO

OP #5737405
Hallo,

im FIFO-IP-Core kann man einstellen wann der Core sagt er sei voll. Wie 
im Bildchen ist der derzeit eingestellt und ich habe dazu folgende 
Frage:

Wenn der "Füllstand" größer ist als 122907, dann wir mit ein full 
ausgegeben, aber es ist ja noch Platz. Kann ich trotzdem solange weiter 
schreiben bis der tatsächlich voll ist oder werden keine neuen Werte 
angenommen sobald das full Flag ausgegeben wird?

Danke!
Angehängte Dateien:
Gast
Gustl B. schrieb:

> Kann ich trotzdem solange weiter
> schreiben bis der tatsächlich voll ist oder werden keine neuen Werte
> angenommen sobald das full Flag ausgegeben wird?

Ohne das jetzt für Xilinx und für diese Spezielle Fifo dediziert zu 
kennen, üblicherweise kann man immer in eine FIFO schreiben, auch wenn 
sie übervoll ist. Dann wird eben das älteste Datum überschrieben.
Digikundler schrieb:
> Ohne das jetzt für Xilinx und für diese Spezielle Fifo dediziert zu
> kennen, üblicherweise kann man immer in eine FIFO schreiben, auch wenn
> sie übervoll ist. Dann wird eben das älteste Datum überschrieben.

Davon würde ich jetzt eher nicht ausgehen. Die meisten FIFOs dürften 
eher den Write-Response aussetzen, bis wirklich geschrieben wurde.

Das prog_full wird üblicherweise ein reines Info-Signal sein. Der FIFO 
verhält sich trotzdem normal, als gäbe es dieses Signal nicht. Ebenso 
beim prog_empty.

Diese Signale dienen üblicherweise dazu, den FIFO nicht bei einer freien 
Zelle direkt wieder zu füllen, sondern damit zu warten, bis x Zellen 
frei sind. Falls Bursts günstiger sind als einzelne Zugriffe.
OP
Fein, genau darum geht es mir nämlich, ich will einen Burst schreiben 
und derzeit unterbreche ich den sofort wenn der FIFO voll sagt, wenn 
aber noch einige Einträge frei sind kann ich diesen Burst fertig 
schreiben.
Gast
Samuel C. schrieb:
> Davon würde ich jetzt eher nicht ausgehen. Die meisten FIFOs dürften
> eher den Write-Response aussetzen, bis wirklich geschrieben wurde.

Warum?
Der Fifo ist es doch Titte welches Datum verloren geht; wer seine Daten 
nicht abholt hat eben Pech gehabt. Und FIFO's zum synchronisieren über 
verschiedene Clock Domains, vermeidet mensch "grenzüberschreitende" 
Signale so weit wie möglich.
Weil das nicht-deterministisches Verhalten erzeugen würde, das in den 
meisten Anwendungen unerwünscht sein dürfte.

Selbstverständlich gibt es FIFOs, die das so machen. Für ernsthafte 
Anwendungen wird sowas aber hoffentlich nicht eingesetzt.
(Firma: www.elpra.de) Persönliche Seite
Ich verwende den FIFO Generator normalerweise nie sondern verwende die 
Unimacro Library von Xilinx. Dann hat man doch ein paar mehr Freiheiten, 
allerdings auch mehr Aufgaben wie das Reset und Enable Handling.

Ich schaetze auch mal, dass das am Ende nicht das Full Flag ist, sondern 
das Almost Full Flag. Das verwendet man praktisch wie ein Full Flag, hat 
jedoch die Gewissheit, dass noch ein paar Daten ins FIFO passen bevor es 
ueberlaeuft.

Eine gaengige Anwendung ist z.B. wenn ich einen Datenstream aus einem 
DDR Memory anfordere und ich Zeit brauche den Stream sauber zu 
terminieren. Das geht nicht immer abrupt (z.B. weil der Speicher Arbietr 
das nicht zulaesst) und so vermeide ich den Verlust von "Nachzuegler" 
Daten.

Meine Empfehlung: Generiere mal die FIFO Core Sourcen und schau mal an 
wie das FIFO instanziert wird. Wahrscheinlich wird mit dem Full Flag das 
Almost Full Flag verknuepft, das laesst sich super easy rausfinden und 
dann hast du auch Gewissheit.
Gast
Samuel C. schrieb:
> Weil das nicht-deterministisches Verhalten erzeugen würde, das in den
> meisten Anwendungen unerwünscht sein dürfte.

Andersrum ,also die FIFO blockiert write, ist es genauso 
undeterministisch…

Ich sag der Fifo Schreib! und sie tuts nicht ;-( ..
--
Hab mal a bisserl bei Xilinx recherchiert:

"Conceptually, a FIFO always behaves like a shift register, but with 
independent control of write and read operation."

-> schreiben geht immer, weils lesen nicht interessiert ("independent 
control of write and read ")

", the FULL flag tells the user that no more write operation should be 
started."


nach:
https://forums.xilinx.com/t5/PLD-Blog-Archived/FIFOs-A-Tutorial-Description/ba-p/16959
Gast
Samuel C. schrieb:
> Der Guide für den FIFO Generator
> 
(https://www.xilinx.com/support/documentation/ip_documentation/fifo_generator/v13_1/pg057-fifo-generator.pdf)
> wiederum sagt, dass ein write bei einem vollen FIFO ignoriert wird und
> die Inhalte nicht zerstört (S.22).

Ah, wieder was gelernt.

>Exakt, aber was bedeutet voll? Dass das Flag das sagt, oder dass er
>wirklich voll ist?

irgendwo schreibt xilinx das das flag resp der zugrundeliegende 
write_counter "pessemistisch" reagiert, es kann also sein das als voll 
bezeichnet wird, obwohl gerade Platz frei geworden ist:

"Write data count (wr_data_count) pessimistically reports the number of 
words written into the FIFO. The count is guaranteed to never 
under-report the number of words in the FIFO (although it may 
temporarily over-report the number of words present) to ensure that you 
never overflow the FIFO"
Auf der gleichen Seite des Dokuments sind alle drei Flags beschrieben:

full: der FIFO ist voll und wird keinen write mehr annehmen
almost_full: der FIFO hat noch genau eine Zelle frei und wird noch einen 
write annehmen
prog_full: wie almost_full, nur mit selbst einstellbarer Schwelle
Gast
Das Full-Flag wird ja üblicherweise gebildet, wenn der Schreibpointer 
eins unter dem Lesepointer ist.
Bei einem asynchronen FIFO werden die Pointer in verschiedenen 
Clock-Domains verweltet. Die Übertragung des Lesepointers in die 
Schreibdomain dauert ein paar Takte. Daher ist das Full-Flag nur 
sinnvoll auszuwerten, wenn man langsam in den FIFO schriebt.
IMHO kann man den Abstand der Pointer beim Almost-Full-Flag einstellen. 
Das ist für schnelle Burstartige Zugriffe sinnvoll.

Duke
Gast
Samuel C. schrieb:
> Auf der gleichen Seite des Dokuments sind alle drei Flags
> beschrieben:


Hint am Rande: auf p.22 stehen die Flags nur für den "common clock" 
Fall; für den interessanteren Fall mit unterschiedlichen clocks gibt es 
eine xtra Beschreibung (die aber weitgehend gleich ist).
Gast
Gustl B. schrieb:
> werden keine neuen Werte
> angenommen sobald das full Flag ausgegeben wird?

Sie werden überschrieben oder verworfen. Üblicherweise testet man auf 
"full" bevor man schreibt.

Um das zumildern kann man den full dynamisch programmieren z.B. auf n-10 
oder n-20 oder so.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.