Guten Tag zusammen, ich habe im März mit FPGA angefangen und komme soweit ganz gut zurecht habe jetzt aber ein kleines Problem bei welchem ich etwas Hilfe brauchen könnte... Es geht um ein Kamerasystem welches die Daten über Ethernet ausgeben soll. Die Daten kommen aus der Kamera und landen in einer Pipeline welche dann an den Daten herumrechnet. Parallel läuft auf dem FPGA eine Nios 2 Embedded CPU welche sich um das TCP/IP und die I2C Konfiguration der Kamera übernehmen soll. I2C funktioniert bereits aber nun stehe ich vor dem Problem das die Daten aus der Pipeline irgendwie in die CPU müssen. Ich habe hier ein DE2-115 Board von Altera/Terasic und habe die Daten aus der Pipeline bisher testweise ins SRAM geschrieben und dann über das "Control Panel" ausgelesen um zu testen ob bis zum Ende der Pipeline alles richtig funktioniert. Das Nios System besteht bisher aus einer Clock, der CPU, 128MB-SDRAM,sysid,parallel-out und einer I2C-Schnittstelle. Die Clock hat 125MHz, die Pipeline rechnet mit 20 MHz. Nun ist mein Problem wie ich die Daten aus der Pipeline in die CPU bzw. das RAM bekomme... ein PIO als Input wird wohl vermutlich zu langsam arbeiten und bei weitem nicht synchron genug werden. Momentan lade ich das NIOS C-Programm noch in den SRAM könnte dafür aber noch etwas On-Chip RAM/ROM anlegen um den SD-RAM für die Pipeline frei zu machen. Die Pipeline liefert etwa zu 50% der Zeit Daten mit 20 MHz, die CPU kann die Daten schneller aus dem RAM holen daher sollte das wohl machbar sein. Meine Frage ist nun wie ich das ganze konkret im QSYS vernünftig umsetze. Soll ich einen DMA Controller nutzen oder lieber ein FIFO? Oder gibt es eine Art Stream to Memory Sink mit FIFO und Trigger um die Pipeline Daten asynchron zur CPU Clock anzunehmen? Könnt ihr mir dabei helfen? Vielen Dank schon mal für eure Zeit und Hilfe :-) Lieben Gruß Viktor
Deine Kamera in dein Qsys-System einzubinden ist nicht all zu schwer. Lad dir mal zu Qsys die sog. Avalon-Spezification runter, sie beschreibt zu allen Qsys-Interfacetypen die Signal- und Timing-Details. Schau dir insbes. MM-Master und MM-Slave an. Für dein Kamerasystem kannst du dann mit MM-Master ein einfaches DMA-System aufbauen. Bei kleiner Datenrate ist das relativ einfach.
Hi, danke für deine Antwort Sigi aber das wird so nicht funktionieren. Es geht um eine spezielle Kamera. Ich muss bei dieser erst 4 Einzelbilder holen um daraus ein finales zu berechnen. Während der Berechnung werden aber bereits die nächsten 4 Bilder geholt was zu massiven Timing Problemen beim schreiben/lesen per CPU führen würde da die Kamera die Pixel mit 80MHz ausgibt und dabei auch nicht verzögert werden kann. Ich habe das jetzt so gelöst das ich die 8 Bilder in 2 dedizierte Hardware SRAM´s ablege und die Write bzw. Read Kontrolle jeweils zwischen Kameraseite und Pipeline Seite tausche da ich bis zu 64,5FPS (258 Einzelbilder) a 320*240*16Bit durchbringen muss. Zur Berechnung wäre noch zu sagen das ich 3 Multiplikationen und 4 Additionen sowie ein ATAN2(x,y) auszuführen hab was die NIOS CPU bei einer Eingangsdatenrate von fast 10MB/s und der resultierenden Ausgangsdatenrate von fast 20MB/s nicht mehr schaffen wird. Ich habe gerade ein wenig herumprobiert und bin jetzt dabei folgendes zu testen: DC-FIFO im QSYS nimmt die Daten an, wenn der FIFO > 80-90% belegt ist pausiere ich die Pipeline, leere den FIFO und lasse die Pipeline dann weiter laufen bis das Bild fertig ist. Sobald ein Bild komplett ist wird es über Ethernet ausgegeben. Ich weiß aber noch nicht ob ich so 20MB/s da durch bekomme, das gilt es jetzt zu testen. Falls ihr eine bessere Idee habt bin ich offen für jede Anregung. Lieben Gruß
Viktor Bronder schrieb: > Zur Berechnung wäre noch zu sagen das ich 3 Multiplikationen und 4 > Additionen sowie ein ATAN2(x,y) auszuführen hab was die NIOS CPU bei > einer Eingangsdatenrate von fast 10MB/s und der resultierenden > Ausgangsdatenrate von fast 20MB/s nicht mehr schaffen wird. Multiplikationen gehen im FPGA-Teil (ausserhalb der CPU) schnell und problemlos. Additionen sowieso. ATAN2 geht mit CORDIC in ~10 Takten. Also: Raus aus der CPU, im HW-Teil berechnen und nur die Ergebnisse mit Hilfe der CPU verwalten...
berndl schrieb: > Multiplikationen gehen im FPGA-Teil (ausserhalb der CPU) schnell und > problemlos. Additionen sowieso. ATAN2 geht mit CORDIC in ~10 Takten. > Also: Raus aus der CPU, im HW-Teil berechnen und nur die Ergebnisse mit > Hilfe der CPU verwalten... wie gesagt die Pipeline mit den Multiplikationen und Additionen und ATAN2 in Cordic funktionieren schon. Ich nehme die Daten der Kamera auch per Hardware an da die Zeilen aus der Kamera ab Z120,Z121,Z119,Z122...Z0,Z239 ausgegeben werden und vorsortiert werden müssen. Das sind 3 Binärzähler und ein addierer für die Adresse, die CPU wird sich damit vermutlich wieder schwer tun wenn ich das in C schreibe... Bin vielleicht noch etwas zu sehr C/C++ geschädigt :-) Ich habe das ganze wie oben beschrieben mit dem FIFO aufgebaut und schon mal in einzelschritt getestet und bisher sieht es soweit ganz gut aus... Ich tuh mich gerade mur etwas schwer mit dem > ... und nur die Ergebnisse mit Hilfe der CPU verwalten... Ich muss mir jetzt aber erstmal was für die PC-Seite programmieren was die Daten annimmt und das ganze dann mal in Echtzeit ausprobieren, falls es nicht klappt bzw. irgendwas verschluckt wird melde ich mich noch mal... trotzdem danke für eure Ideen. Falls das alles nicht geht werde ich es mal versuchen wie von euch vorgeschlagen in der CPU zu verwalten wobei ich immer noch nicht überzeugt bin das die CPU das schafft... Lieben Gruß
du brauchst also einen klassischen Coprozessor, ausgelagert in das FPGA und gesteuert mit einem klassischen Registerinterface...
Ich würde es so machen: Cam -> FIFO -> AVALON MASTER -> SRAM SRAM ist im QSYS als Speicher definiert und deshalb kann NIOS darauf zugreifen. Im NIOS kannst Du dann einfach diesen Speicher nehmen und damit was machen. Eigentlich musst Du gar nichts anhalten, sondern die Bilder wegschreiben, sobald die kommen und dann prozessieren. Dann spielst Du etwas mit den Arbitration-Shares herum und, voila, läuft das Ganze. in deinem CAM-AVALON-Master kannst Du dann die Adressen so generieren, wie Du es haben möchstes, die Daten kannst Du auch vorberechnen (z.B. 2 AVALON-MASTER: Lesen/Schreiben). Ich habe soetwas schon oft gemacht und im Endeffekt kann ich sagen, dass ich immer auf NIOS verzichtet habe, weil zu langsam. Für I2C, ein bisschen Konfiguration oder TCP/IP ist es noch okay, aber wenn irgendwelche große Datenbengen kommen, kannst Du es komplett vergessen. Aber Du hast ja nichts zur Frame-Rate und Auflösung gesagt ;-) Grüße Kest
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.