Hallo zusammen, ich möchte einen FIFO realisieren (wenn möglich mit einem externen DDR3 RAM). Für das RAM habe ich schon ein vorbereitetes MIG Projekt passend zu meinem Board, auf das ich aufbauen könnte. Was ich speichern muss: - ein komplettes Bild ca 1400x600 (RGB888) - Format: AXI4 (video) Stream mit 24bit Breite - Geschwindigkeit ist erstmal nicht entscheidend, gut wäre, wenn so mit 1 bis 2 Bildern pro Sekunde ausgelesen und geschrieben werden kann Was ich an HW habe - Spartan 6 XC6SLX45 auf einem Trenz TE0600 (und dazu passend das GigaBee TE0603) - was ich NICHT habe ist ein Prozessorsystem (Projekt komplett in ISE) Meine Bisherige Überlegung ist es vielleicht den Virtual FIFO von Xilinx zu nehmen. Nach meinem Verständnis realisiert der einfach einen FIFO und verwendet als Speicher einen externen DDR Speicher, der über ein AXI4 Interface angesteuert wird (-> MIG Interface). Meine Fragen: - ist es überhaupt möglich diesen/ einen IP Core FIFO von Xilinx einzubinden OHNE ein Prozessorsystem, das alles überwacht? - der Virtual FIFO hat 32bit Breite am Ein- und Ausgang -> lässt sich das überhaupt mit einem 24bit breitem Signal verbinden (zB indem man die übrigen Bits einfach auf '0' zieht)? - würden sich einzelne Zeilen ansonsten auch direkt auf dem FPGA speichern lassen oder ist er dafür nicht groß genug (bzw das nicht sinnvoll)? Vielen Dank schon mal
Im Prinzip sollte das relativ einfach gehen. Du hast 2 taktgesteuerte Einheiten die jeweils eine Adresse hochzählen, den Zählerstand auf den Speichercontroller geben und den daraus kommenden Wert auf die Ports geben. (bzw in den Speicher schreiben) Das Komplexe wird der Speichercontroller sein, den kriegst Du aber bestimmt wo fertig. Oder Du machst das mit 2 Videorekordern: ;) http://www.youtube.com/watch?v=fezrsTAf5x0
D. S. schrieb: > 1 bis 2 Bildern pro Sekunde ausgelesen und geschrieben werden kann mit etwas Geschick geht das in Echtzeit rein / raus.
D. S. schrieb: > - ist es überhaupt möglich diesen/ einen IP Core FIFO von Xilinx > einzubinden OHNE ein Prozessorsystem, das alles überwacht? ja ist möglich, hab ich auch drin. > - der Virtual FIFO hat 32bit Breite am Ein- und Ausgang -> lässt sich > das überhaupt mit einem 24bit breitem Signal verbinden (zB indem man die > übrigen Bits einfach auf '0' zieht)? du kannst auch ein Fifo vom CoreGenerator generieren der nur 24 Bit In- und Output hat. Könntest aber wenn du 32 Bits behalten willst den Rest mit Nullen füllen, die ja sowieso nach der Synthese rausfallen werden. Also gleich das was man braucht verwenden. > - würden sich einzelne Zeilen ansonsten auch direkt auf dem FPGA > speichern lassen oder ist er dafür nicht groß genug (bzw das nicht > sinnvoll)? Der interne BlockRam sollte das schaffen können. Aber wenn du es sowieso nur auf dem Ext. Ram speichern willst, verwendest du den Fifo(Blockram) ja nur als Pipeline zum DDR3 Ram, im grunde genommen brauchst du dann nicht viel Zwischenspeicher. Cihan
Cihan Kalayci schrieb: > D. S. schrieb: >> - ist es überhaupt möglich diesen/ einen IP Core FIFO von Xilinx >> einzubinden OHNE ein Prozessorsystem, das alles überwacht? > ja ist möglich, hab ich auch drin. Von welchem sprichst du da? - dem Virtual FIFO Controller oder den FIFO Generator? Die Datenbreite kann ich bei beiden nicht auf 24bit Breite stellen. Der Virtual FIFO enthält noch massenweise Statussignale, die braucht man doch eigentlich für die Grundfunktion nicht, oder? Was macht man dann am besten mit diesen ungenutzen Ports? (Oder finden die alle beim MIG Verwendung?)
Ich glaube, du siehst das viel zu kompliziert. Ich denke, du hast zwei Möglichkeiten, das schnell und unkompliziert zu machen: 1. Die Übertragung zum PC ist im Mittel schneller als die Bild-Daten eintreffen und es tut keinem weh, wenn was verloren geht: Dann kannst du die Bild-Daten zusammen mit den Steuersignalen in einen 32 Bit breiten FIFO schieben und auf der anderen Seite mit dem GbE Takt wieder herausholen und dir die UDP Pakete zusammen bauen. Die Auswertung, wann eine Zeile und ein neues Bild anfängt, machst du dann auf dem PC, denn in dem zusätzlichen Byte hast du dann die Bild-Steuersignale. Hat allerdings den nachteil, dass im Bild auch mal Pixel fehlen können, wenn du zu langsam auf der PC Seite bist. Das ist meiner Meinung nach der einfachste Weg und du kommst komplett ohne den AXI Quatsch und einen externen Speicher aus, denn du musst kein ganzes Bild puffern. Einen FIFO brauchst du sowieso nur, wenn du im Mittel gleich schnell lesen wie schreiben kannst. 2. Die Übertragung zum PC ist langsamer als die Bilddaten und es darf nichts während des Bildes verloren gehen: Dann würde ich ohne FIFO arbeiten und das komplette Bild (Auswertung der Frame-Sync Signale im FPGA) in den externen Speicher schreiben. Wenn das erledigt ist, wird das Bild zum PC übertragen. Hierbei hast du alle Zeit der Welt, in dieser Zeit ist das Schreiben neuer Bild-Dtaen abgeschaltet. Erst wenn das Bild am PC ist, schreibst du wieder ein Bild rein. Ist dann so wie beim Speicher-Oszilloskop. Hat den nachteil, dass du dich auch noch mit dem RAM Controller rumschlagen musst, aber den Vorteil dass du immer ein ganzes Bild überträgst und damit zumindest an der Stelle keine Pixel verloren gehen. UDP bleibts ja weiterhin, da ist eh keine Datensicherheit.
Cihan Kalayci schrieb: > Fifo vom CoreGenerator generieren der nur 24 Bit In- > und Output hat. Könntest aber wenn du 32 Bits behalten willst den Rest > mit Nullen füllen oder man acht es ganz schlau und stellt ihn auf 24:96 und einen weiteren auf 96:32, um etwas entspannter reinschreiben zu können.
ich muss da nochmal nachhaken - ich hab die Cores erzeugt und zum Teil eingebunden (ich will das jetzt machen mit Virtual Fifo Controller und MIG), aber bin mir ist noch nicht ganz klar, wie viele Ports ich beim MIG zum Virtual FIFO brauche. Der Virtual FIFO hat ja eigentlich zwei Ausgänge, einen zum Schreiben und einen zum Lesen (Komponentendeklaration siehe vfifo_signals.vhdl). Also habe ich mir gedacht, dass der MIG eingangsseitig auch zwei 32bit AXI4 Ports braucht, einen zum Lesen und einen zum Schreiben und habe zwei unidirektionale Ports ausgewählt. Jetzt habe ich aber folgende Komponentendeklaration erhalten (siehe mig.vhdl), die aus meiner Sicht die doppelte Anzahl an Signalen erhält. Könnt ihr mir helfen, wo da mein Denkfehler ist? Es bleiben ja sonst die Hälfte der Signale übrig. Jetzt hab ich nochmal ein MIG Core erstellt und diesmal mit einem einzelnen bidirektionalen Port (mig_2.v, die Deklaration hab ich noch nicht in VHDL umgeschrieben, Namen sind aber die gleichen). Jetzt würde das von der Anzahl der Signale zusammenpassen. Aber ist das so noch korrekt? Braucht der Virtual Fifo nur einen einzigen bidirektionalen Port um auf den Speicher zuzugreifen?
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.