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ß
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