Gast
#1149403
Hallo Ich habe ein Verständnisproblem mit der Funktionsweise eines synchronen FIFO. Sorry daß ich etwas ausholen muß, aber ich denke zum Verständnis ist das notwendig. Evtl. steh ich auch nur auf der Leitung, aber ich komm nicht dahinter. Es geht um folgendes ... Es sollen Daten eines AD-Wandlers möglichst schnell über USB an den Rechner geschickt werden. Ich rede hier von etwa 500k-samples und mehr. Der AD-Wandler muß in einem festen zeitlichen Raster ausgelesen werden. Unterbrechungen (weil z.B. wenn Windows grad was anderes machen will) sind nicht erlaubt. Ich takte daher die Daten des AD-Wandlers mit einem ATMega in ein asynchrones FIFO (im Moment CY7C433 - 4k x 9Bit). Mit einem zweiten Prozessor (einem Tiny13) takte ich die Daten mit einer komplett unabhängigen Timedomain in den USB-chip (FT245R). Das ganze funktioniert aktuell sehr gut, die Datenrate liegt bei ca. 450kByte/s ... soweit sogut! Nun besteht die Forderung die Datenrate deutlich zu erhöhen. Ich habs bereits bis 800kByte/s geschafft, allerdings läuft nun das 4k FIFO ab und zu über und Daten gehen verloren. Ich brauche also ein größeres FIFO und habe mich aus verschiedenen Gründen (u.a. wegen der programmierbaren Statusflags) für ein CY7C4251 mit 8k x 9Bit entschieden. So nun zum eigentlichen Problem: -------------------------------- Beim asynchronen FIFO (also beim aktuellen Design) werden die FULL- und EMPTY-Flags vom Lese- UND vom Schreibpointer beeinflußt. Um Daten aus dem FIFO zu lesen, warte ich also einfach solange bis der Daten im FIFO vorliegen (das EMPTY-Flag geht dann auf high). Sobald keine Daten mehr im FIFO sind geht das EMPTY-Flag zurück auf Low und ich höre auf Daten auszulesen. Mit dem FULL-Flag gehts beim Schreiben ähnlich. Sobald es auf high geht ist das FIFO voll und es wird nichts mehr reingeschrieben. Beim synchronen FIFO siehts leider etwas anders aus. Hier wird das EMPTY-Flag NUR (!!!) vom Lesepointer beeinflußt. Es geht also nicht automatisch auf high sobald die ersten Daten im FIFO geschrieben werden, sondern erst nachdem der Lesetakt anliegt. Damit habe ich nun vor dem Lesen keine Info mehr ob Daten im FIFO sind oder nicht. Beim Reinschreiben gibts die gleichen Probleme. Das FULL-Flag wir nicht durch Auslesen des FIFO gelöscht, sondern erst mit dem nächsten Schreibtakt :-( Hier noch Links auf die jeweiligen Datenblätter: http://www-hades.gsi.de/daq/rc99/fe/cy7c419.pdf http://download.cypress.com.edgesuite.net/design_resources/datasheets/contents/cy7c4251_8.pdf Hab ich nun mit dem synchronen FIFO total daneben gegriffen oder steh ich nur aufm Schlauch? Kennt sich einer mit diesen Teilen besser aus?