Es ist eigentlich eine Grundsätzliche Frage. Wann setzt mann bei einem UART ein FIFO ein? Hintergrund: Verwende im Projekt zwei UART. "MUSS" Fertige IP-Core. Beide eigentlich mit Rx- Tx-FIFO. Problem: Das Entwicklungsprogramm gibt aber nun einen Fehler aus. Und zwar das ich beide UARTs nicht verwenden kann. Habe etwas rumgespielt und dabei heraus gefunden, das ich doch beide verwenden kann wenn ich einen UART ohne FIFO benutze. Gruß Marco
Ein FIFO wird immer dann notwendig wenn du nicht in der Lage bist die Daten schnell genug abzuholen und zu verarbeiten. Z.B. wenn die Verarbeitung länger dauert als die Pause zwischen 2 Zeichen.
> Ein FIFO wird immer dann notwendig wenn du nicht in der Lage bist die > Daten schnell genug abzuholen und zu verarbeiten. Nicht ganz korrekt. Ein FIFO hilft dann, wenn du im Schnitt in der Lage bist, mit der Datenrate fertig zu werden, es aber einzelne zu hohe Peaks gibt (und dann aber wieder entsprechende "Täler"). Der FIFO verteilt die Last dann gleichmäßig. Bei einer dauerhaft zu hohen Datenrate hilft auch der FIFO nix, da muss dann die Verarbeitung verbessert werden. Zusätzlich agiert der FIFO als Pipelinestufe, um Empfang der Daten und Verarbeitung zu parallelisieren.
Ich habe nicht behauptet dass die Zeichen immer so schnell kommen durfen dass man sie nicht mehr verarbeiten kann.
Marco schrieb: > Das Entwicklungsprogramm gibt aber nun einen Fehler aus. Und zwar das > ich beide UARTs nicht verwenden kann. Ob Fifo oder nicht, das ist dem Entwicklungsprogramm erst mal schnurzegal. Nur du hast hinterher Probleme, weil du Daten verlierst. Welchen Fehler bekommst du gemeldet? > Habe etwas rumgespielt und dabei heraus gefunden, das ich doch beide > verwenden kann wenn ich einen UART ohne FIFO benutze. Dein Fehler liegt evtl. eher darin, dass der Fifo u.U. doppelt belegt würde...
Danke für die Hilfe, sehr hilfreich. Werde dann wohl auf die FIFOs verzichten können. Eine Frage habe ich noch: ich (Gast) schrieb: > Ein FIFO wird immer dann notwendig wenn du nicht in der Lage bist die > Daten schnell genug abzuholen und zu verarbeiten. > Z.B. wenn die Verarbeitung länger dauert als die Pause zwischen 2 > Zeichen. Warum gibt es denn auch Tx FIFOs? Beim empfangen kann ich mir das mit dem Geschwindigkeitsproblem noch erklären. Aber beim senden. Es ist doch egal ob ich die Daten in das FIFO schiebe und die Daten dann von dort in den UART gelangen, oder ob ich die Daten in den UART gebe. Lothar Miller schrieb: > Dein Fehler liegt evtl. eher darin, dass der Fifo u.U. doppelt belegt >würde... Habe ein bischen weiter geforscht und die Vermutung ist korrekt. Ist aber ein komisches Design. Die IP-Core werden vom Programm bereit gestellt. Und dann kann man nicht mal zwei UART gleichzeitig verwenden, also ohne zwei FIFO. Oder kann es sein das die FIFO extern von den UART generiert werden. Seperat von dem Entwicklungsprogramm. Und dieses stellt die FIFOs nur zur Verfügung? Gruß Marco
> Die IP-Core werden vom Programm bereit gestellt. Welches denn? >>> Das Entwicklungsprogramm gibt aber nun einen Fehler aus. Welchen denn?
Tx Fifo damit dein Programm nicht warten muss bis das Zeichen fertig übertragen wurde
Marco schrieb: > Warum gibt es denn auch Tx FIFOs? Beim empfangen kann ich mir das mit > dem Geschwindigkeitsproblem noch erklären. > Aber beim senden. Es ist doch egal ob ich die Daten in das FIFO schiebe > und die Daten dann von dort in den UART gelangen, oder ob ich die Daten > in den UART gebe. Ein TX-FIFO verringert den zum Senden nötigen Softwareaufwand - zumindest in den Fällen, in denen die Nachrichten länger als 1 Zeichen, aber kürzer als die freie FIFO-Tiefe sind und daher die komplette Nachricht ins FIFO passt. Die Senderoutine wird dann ohne weiteres Zutun die ganze Nachricht auf einen Rutsch los. Beim Senden ohne FIFO ist für jedes einzelne Zeichen eine Software-Aktion notwendig, sei es in einer pollenden Sendefunktion, in einer Interrupt-Routine, die das nächste Zeichen aus einem Pufferspeicher ins UART-TX-Register schaufelt (Soft-FIFO) oder in einer Task, wenn ein Multitaskingkern zum Einsatz kommt.
Zu der Frage welcher IP-Core. Es ist CoreUART v4.2 von Actel und das Entwicklungsprogramm ist Libero v9.1
Was tritt denn nun für ein "Fehler" auf den die Entwicklungssoftware meldet? Sind die Resoucen im FPGA/CPLD alle, so dass der FIFO nicht reinpasst? Was ist es überhaupt für ein Baustein für den entwickelt wird? Oder will vielleicht der Core eine spezielle Hardware-Resource des FPGAs für den FIFO verwenden, z.B. einen Ramblock? Dann könnte es helfen den Core umzukonfigurieren, falls möglich. Also so das z.B. generische Resourcen (LUTs und Flipflops) statt spezieller Resourcen genutzt werden. Oder den FIFO von der Speichertiefe zu verkleinern. Anderen Falls schreib dir halt die UARTs und FIFOs selbst. Das sind jetzt keine so komplizierten Komponenten, dass das ewig dauern tät. Dazu findest du auch sicher auch viele Beispiele im Netz, aber schreib lieber selbst, einige Beispiele sind nicht gerade optimal implementiert. Die FIFOs weglassen würde ich nur im Notfall. Das bremst meistens den Rest deutlich aus, weil du z.B. andauernd den UART abfragen musst um ja nix zu verpassen und beim Senden musst du nach jedem Zeichen warten.
Es sind noch ausreichend Resourcen vorhanden. Das habe ich überprüft. Die Fehlermeldung gibt an das ein Device doppelt vorhanden ist. Habe eben ein FIFO Dummy ohne Funktion implementiert und dann ging es. Es ist so, dass das FIFO extern vom eigentlichen IP-Core generiert wird. Werde die UART auch selber schreiben mit FIFO. Der UART IP-Core von actel ist auch recht groß. Der verwendete CHIP hat 200k Gates und ein UART IP-Core verbraucht alleine 21% des FPGAs. Das ist doch recht viel. Gruß Marco
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.