Ich beginne mit der VHDL-Codierung und habe einige grundlegende Bildverarbeitungen auf meinem Entwicklungsboard durchgeführt.
Ich habe festgestellt, dass die meisten FPGA-Entwicklungskarten häufig DRAM (SDRAM, DDRAM) als RAM verwenden. Zum Beispiel verwende ich eine FPGA-Entwicklungskarte von TERASIC und sie verwendet DRAM. Obwohl der DRAM-Speicher billiger zu sein scheint als der SRAM (Static RAM), ist er aus meiner Sicht nicht für die Bildverarbeitung optimiert. Lassen Sie mich erklären: Auf DRAM-Daten wird blockweise zugegriffen, auf SRAM-Daten kann byteweise zugegriffen werden (adressiert) ( oder Wort für Wort oder 36 Bit auf einmal, was auch immer). Diese Funktion ist besser auf die Bildverarbeitung abgestimmt, beispielsweise auf einen einfachen Mittelwertfilter, bei dem ein Pixel beispielsweise der Mittelwert seines Nachbarn ist
Pix(x,y) = (Pix(x-1,y-1) + Pix(x,y-1) + Pix(x+1,y-1) + Pix(x-1,y) + Pix(x,y)
+ Pix(x+1,y) + Pix(x-1,y+1) + Pix(x,y+1) + Pix(x+1,y+1))/9
ist mit DRAM schwierig zu tun, benötigen Sie einen internen Puffer von mindestens zwei Zeilen, um Zeilen zu speichern y-1
und y
(die Verarbeitung auf der y+1
Zeile durchzuführen). Außerdem scheint es für Quartus sehr viel Zeit zu dauern, diese einfache Verarbeitung durchzuführen (ich verwende 2ports FIFO).
Wenn die Karte SRAM wie IS61LPS25632A von ISSI verwendet hätte, wäre die Verarbeitung unkompliziert, da die Adresse eines Pixels beispielsweise sein kann
ByteAdress <= x + (LINEWIDTH*y);
Aus Hardware-Sicht wird der Prozess mit 9 Lese- / Schreibspeichertaktzyklen für ein Bild durchgeführt, und mit einigen Tricks bei der Parallelverarbeitung kann dies vermutlich verbessert werden. Ist mein Verständnis dann wahr? Wenn nicht, wo ist der Fehler?
BEARBEITEN:
Die Verwendung von internem FPGA-RAM ist für mich keine Option, da in dem von mir verwendeten FPGA-Gerät (Cyclone III) nicht genügend Speicher vorhanden ist und ich nicht weiß, ob es sinnvoll ist, für ein teureres Entwicklungskit zu bezahlen, nur um mehr RAM im FPGA zu haben .
Meine Frage bezieht sich eher auf die Codeeffizienz. Nehmen wir zum Beispiel an, man hat 8 MB SRAM. Aus meiner Sicht ist der mit dieser Art von RAM erzeugte Code bei der 2D-Verarbeitung (wie der Bildverarbeitung) effizienter (Geschwindigkeit und Pufferung), da ein echter Direktzugriff gut für den Zugriff auf Daten mit (großem) Versatz zwischen geeignet ist dann, wie auf dieser Aussage:
ByteAdress <= x + (LINEWIDTH*y);
Das Reorganisieren von Informationen ist zeitaufwändig. Ich benutze eine Kamera, die Datenpixel zeilenweise nacheinander ausgibt. Ich kann diese Daten nur auf einer mit DRAM erstellten FIFO-RAM-Komponente mit zwei Ports speichern. Ich kann nicht einmal eine einfache Umsetzung durchführen, bevor ich die Daten damit speichere. Überraschenderweise habe ich im Web keinen Code gefunden, der sich mit diesem 2D-Problem befasst.