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
Hi Max, schau dir mal das Doc von Xilinx an: http://www.xilinx.com/xlnx/xweb/xil_tx_display.jsp?sGlobalNavPick=&sSecondaryNavPick=&category=&iLanguageID=1&multPartNum=1&sTechX_ID=pa_fifo Vielleicht hilft es dir. Gruss Jörn
@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
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.
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
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.
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 :-))
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.