Forum: FPGA, VHDL & Co. Design von asynchroner FIFO mit 2^n Tiefe


von Max Müller (Gast)


Lesenswert?

Hallo Kollegen,

ich bin gerade dabei ein speziellen FIFO in VHDL zu designen.
Ich wollte eigentlich das Rad nicht nochmal neu erfinden, aber
scheinbar gibt es nichts gescheites, bzw. hab ich nichts gefunden.

Es soll asynchron mit zwei unabhängigen Takten arbeiten.
Zusätzlich soll der komplette Speicher für die Tiefe zur Verfügung
stehen. Auf Geschwindigkeit und Platz für die Logik kommt es mir erst
nicht mal so an.

Ich hab mir schon verschiedene Möglichkeiten angeschaut, aber alle
haben irgend welche Nachteile.

Bei Xilinx gibt es eine Applikation Note, die erlaubt aber nur einen
2^n-1 tiefen Fifo bei 2^n möglichen eintragen (511 Tief bei 512
Einträge).

Ein anderes Design (Platz 1 von 2002) von der SNUG ist meiner Meinung
nach komplett falsch, da bei einem leeren Fifo meiner Meinung nach der
letzte gelesene Wert wieder auslesbar sein sollte und nicht der , der
als nächstes überschrieben wird;-)

Coregeneratoren machen zwar auch FIFO's, aber die sind für mich nicht
geeignet (da netzlisten VHDL), da ich im nächsten Schritt das ganze
noch weiter aufbohren will. Und wie gesagt selbst ist der Mann.

Hat von euch jemand ein super Info zu dem Thema asychroner FIFO?

Gruß und ein guten Rutsch

Max

von Jörn (Gast)


Lesenswert?


von Max Müller (Gast)


Lesenswert?

@Jörn

Vielen Dank für den Link. Der Inhalt enspricht einer 2.
Veröffentlichung bei der SNUG (Ein Xilinx Mann war ja auch Co-Autor:-)
Bei dieser Variante ist das Problem, das  mit einer asynchronen
Direction Logik gearbeit wird. Es ist somit nicht synchron und Testbar
:-(

Bei meiner Suche bin ich ein wenig in mich gegangen und hab mal
überlegt.

Da es ein sogenanntes pessemistisches Emty und Full gibt, sollte der
Fifo im Empty Fall noch das zuletzt gelesene wieder ausgeben.
Wenn jedoch parallel in den Fifo auf der anderen Seite geschrieben
wird, sind kurzfristig (bis der neue Schreibptr auf der Leseseite
einsynchronisiert ist) aber theoretisch 2^n+1 Zustande zu speichern.
Somit geht das ganze nur mir einer zusätzlichen Pufferung auf der
Leseseite, oder ein verbot auf der Leseseite zu lesen, falls der Fifo
empty ist, oder mit Kenntnis, das der gelesene Wet falsch sein kann.

ABer ich hab ch nicht kapituliert :-)

Gruß

Max

von Stefan May (Gast)


Lesenswert?

Achtung, hier riecht es nach metastabilen Zuständen. Hast Du das bei
einem asynchronen FIFO bedacht? Wenn nicht, dann schau Dir mal die
folgenden Appnotes von TI an:

http://focus.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=sdya006&fileType=pdf
http://focus.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=scza004a&fileType=pdf

ciao, Stefan.

von Max Müller (Gast)


Lesenswert?

Hallo Stefan,

vielen Dank für den Tipp.
Die Metastabilen Zustande sind bei meinem Design, sowei bei den
betrachteten natürlich berücksichtigt.

Vielleicht sollte ich statt asynchronen FIFO lieber von einem FIFO mit
zwei Clockdomains reden.

Meine Idee (die so auch von anderen Gemacht wird) ist, das auf beiden
Seiten eines Dual Ported RAMs jeweils eine Logik ist, die jeweils zu
eigenen Clockdomain voll synchron ist.
Der Inhalt des DPRAM ist durch die Hardware verriegelt.
Bzw. ist ein Lesen erst nach ein paar Takten möglich.
Somit sind die Daten auf jeden Fall nicht von metastabilen Zuständen
betroffen.

Die Pointerinformation für das reinschreiben und rausholen sind auch
jeweils voll synchron in den 2 Clockdomains.
Die Pointer werden als Graycode ausgetauscht und dann in der jeweils
anderen Clockdomain synchronisiert (1. Flipflop kann noch Metastabile
Zustande haben, danach nicht mehr).

Jetzt hab ich aber noch eine Frage an dich.
Muss ich 2 Flip-Flops nehmen bevor ich in combinatiorische Logik gehe,
die dann wieder in FlipFlops landet (alle Flip-Flops haben den gleichen
Takt), oder reicht 1 Flip-Flop bis zur Logik aus?

Meiner Meinung nach sollte es zwar nach dem 1. Flip-Flop metastabile
Zustände geben, die sollten aber bis zum nachsten Takt (max. 32MHZ)
zusammen mit der kombinatorischen Logik locker sich stabilisiert haben,
so das dann die Flip-Flops nach der Logik kein Problem mit metastabilen
Zuständen haben sollten.

Ich hab aber ein design mit 2 Synch Flipflops gesehen und weis nicht
genau warum das so gelöst ist.

Gruß

Max

von Stefan May (Gast)


Lesenswert?

Ok, dann habe ich noch einen:

http://www-ee.technion.ac.il/~ran/papers%5CSync_Errors_Feb03.pdf

Da ist auch die Methode mit einem Flip-Flop beschrieben. Ob es
funktioniert? It depends. Das kann gut gehen, muß aber nicht. In einem
Taktzyklus muß das Flip-Flop sich für einen Zustand entscheiden und das
ganze muß dann noch durch die Logik durch. Dadurch steigt natürlich
wieder die Wahrscheinlichkeit für metastabile Zustände. Was für ein
FPGA/CPLD verwendest Du?

Ich habe persönlich sehr leidvolle Erfahrungen mit metastabilen
Zuständen machen müssen. Und hatte zum Glück viel Zeit, um mich genauer
mit dem Thema auseinanderzusetzen. Mein Fazit: Traue keiner Lösung. :-)

ciao, Stefan.

von Max Müller (Gast)


Lesenswert?

Vielen Dank Stefan.

Das Dokument kannte ich noch nicht. Schein ganz intressant zu sein.
Ich hab meine erste Erfahrungen mit Synchronizern bereits von fast 10
Jahren gemacht.
Was mit aber bei den einfachen Lösungen mit einem zusätzlichen
Flip-Flop nie gefallen hat, war das ein eventuelle Störung(z.B. Spike)
ganz schön Mist verursachen kann.
Z.B. Wenn der Spike gerade beim abtakten anliegt, dann wird der Spike
auf die komplette Länge eines Takts verlängert und läuft durch ein von
synchrones System. Deshalb hab ich bei meinen Designs immer dern
sychronisierer mit einer Filterschaltung verbunden.
Ich hatte damals machtig viel Diskussionen mit meinen Kollegen
darüber.

Zurück.
Ich benützt für das aktuelle Design einen ProASICPlus von Actel.
Das ganze muß nicht so schnell sein (max. 24-32MHz), aber halt
super sicher. Mit den Actels umgeht mal halt die SEU Diskussion, das
ist der nächste Hot-Topic, wenn die metastabilen Zustände mal
ausdiskutiert sind :-))

von Stefan May (Gast)


Lesenswert?

Ich kenne leider die Daten für den verwendeten ASIC nicht. Wenn Du es
ganz genau wissen willst, dann untersuchst Du die Flip-Flops nach dem
Schema des TI Datenblattes (SDYA006). Das habe ich für einen Xilinx
Spartan3 gemacht und die Wahrscheinlichkeit für das Auftreten von
Metastabilen Zuständen berechnet.

Wenn es Super Sicher sein soll, dann mache keine Kompromisse und
verwende den Two-Flop-Synchronizer. Sicherer geht es dann nicht mehr.

Wie sieht eigentlich Dein Synchronisierer aus? Würde mich mal
interessieren, weil ich dazu wie gesagt schon eine Menge untersucht
habe.

ciao, Stefan.

von Max Müller (Gast)


Lesenswert?

Also die beste damalige Version war je nach Hardware verschieden.

Eine sehr gute Variante war bei einem 2 Phasen Clock (steigende und
fallende Flanken):

EIngang geht auf 2 Flip-Flops. Eins davon ist nützt ein rising edge
clock, das andere den falling edge Clock (beide sind noch metastabile
gefährdert.
Die Ausgänge werden dann in ein Majority Module (2 von 3 definieren den
Ausgang) geführt. Der 3. Eingang wird von einem 3.FlipFlop Ausgang
versorgt. Der Ausgang ist gleichzeitig das synchronisierte Signal. Takt
kann rising oder falling edge sein.
Der Eingang des 3. FlipFlop ist der Ausgang des Majority Modules.

Falls der FPGA nur eine positive Flanken zulasst, kann natürlich alle
mit dem gleichen Takt versorgt werden, dann sind die Eingänge ein
weitern Takt verzögert.

Ach ja die ProAsicPlus Familie von Actel sind keine ASICS, sondern
Flash-based FPGAs, die als ASIC Ersatz auf den Markt gebracht werden
:-)

Bezüglich des FiFo's hab ich ein paar super Infos bei der Nasa
gefunden.
Schaut mal unter www.klabs.org unter den Präsentation der MAPL
Veranstaltung. Ist super intressant, was es so alles gibt.

Gruß

Max

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.