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.
Antworten:
Kein grundlegender Grund warum nicht. Synchrones SRAM ist ein wirklich zufälliger Zugriff, relativ kostengünstig und einfach zu verbinden.
Sein Nachteil ist, dass es eine ziemlich enge Nische zwischen dem On-Chip-BlockRam (nicht viel kleiner, frei, bis Sie gezwungen sind, einen größeren Chip auszuwählen, massiv parallel und flexibler) und dem externen DRAM (massive Speicherkapazität zu einem Preis, den SSRAM bieten kann) einnimmt passt nicht zusammen).
Bis zu 0,5 oder 1 MB ist ein externes SSRAM nicht erforderlich. Ab 8 MB oder 16 MB (die Anzahl kann je nach Budget und aktuellen Preisen variieren!) Wird das SSRAM so teuer, dass das DRAM trotz seiner Grenzen die Kontrolle übernimmt. Wenn Sie dann einen Direktzugriff benötigen, müssen Sie die Berechnung massiv neu organisieren, um Blöcke (Bursts oder Seiten) aus dem DRAM in BlockRam zu lesen, wo Sie sie schnell verarbeiten können, bevor Sie Bursts usw. zurückschreiben.
Wenn Sie jedoch in diesem Fenster eine Rolle für SSRAM haben, wählen Sie diese aus. Ich habe einfache hausgemachte SSRAM-Karten hinzugefügt, um kommerzielle FPGA-Plattformen bei Bedarf zu erweitern.
quelle
SDRAM ist eigentlich eine sehr gute Wahl für die Bildverarbeitung, da sowohl die Kapazität als auch die Bandbreite (insbesondere bei DDR) im Vergleich zu SRAM verbessert sind. In Verbindung mit der Verwendung des On-Chip-SRAM des FPGA als Zeilenpuffer kann so gut wie jede Ganzbildberechnung (einschließlich der von Ihnen als Beispiel angegebenen 2D-FIR) bis zu dem Punkt weitergeleitet werden, an dem Sie ein Pixel pro Takt verarbeiten können. Wenn Sie in Echtzeit mit HD-Videos arbeiten, ist dies unbedingt erforderlich.
Diskontieren Sie nicht die Bedeutung der Kapazität. Moderne Bildsensoren liegen im Bereich von mehreren Megapixeln für Videos und 10 Megapixeln für Standbilder. In vielen Anwendungen sind mehrere Bildpuffer mit 4 bis 6 Byte pro Pixel erforderlich, beispielsweise für Korrekturdaten pro Pixel und Ping-Pong-Bildverarbeitung. Der insgesamt benötigte Speicher übersteigt schnell das, was mit SRAM wirtschaftlich implementiert werden kann.
Selbst wenn Sie nur an Standbildern interessiert sind, unterstützen die Entwicklungskits ein breiteres Spektrum der Anwendungsentwicklung. Übrigens habe ich eine Terasic-Karte, die sowohl DDR-SDRAM als auch ZBT-SSRAM enthält.
quelle
Sowohl SRAM als auch DRAM halte ich für notwendig.
Für die Belastungsmaske auf dem Bild ist SRAM wegen der Faltung nützlich. Aber um das Ergebnis des Bildes zu speichern, ist Dram effizient.
quelle