Forum: FPGA, VHDL & Co. Zynq VGA - Blockram füllen


von Alexander K. (alexxk)


Lesenswert?

Hi!

Ich möchte auf meinem Zybo Board meine Kentnisse im Bereich der 
Bildausgabe erweitern.

Bislang habe ich einen VGA Controller der seine Daten aus einem Blockram 
bezieht. Zuerst habe ich die Farbinformation als constante zugeführt 
(mit dem Xilinx Constant Block), dann habe ich das Blockram vorgeladen 
(File mit dem ISE Mem Editor erzeugt, Gibt es soetwas in Vivado?) und 
zuletzt einen VHDL Block geschrieben der das Blockram mit konstanten 
füllt die ich mit den Schaltern der Boards einstelle (jeweil ein 
Schalter für Rot, Grün, Blau).

Ich würde gerne komplexere Bilder darstellen, leider ist jedoch der 
Blockram des Zynq Chips nicht ausreichend (ich musste immer 2 bits 
zusammenlegen bei 640x480) um die volle auflösung zu benutzen.

Der nächste Schritt wäre wohl die Generation des des "bit-Bildes" im 
c-Code zu erzeugen, ich bin jedoch unschlüssig, wie ich die Daten in den 
Block Ram bekomme.

Kann ich einen AXI GPIO Block erzeugen der ins Blcokram schreibt? Oder 
ist diese MEthode zu langsam und ich muss mein gesammtes System auf Axi 
umbauen und den AXI Video DMA Block benutzen (und dementsprechend auch 
meinen VGA Controller AXI kompatibel machen)?

Mit schnell genug meine ich dass ich etwas in "Videoqualität" anzeigen 
kann!

Gibt es alternativen zu der Lösung das gesammte Bild im Blockram 
abzulegen? 640x480 ist schließlich nicht mehr ganz up to date ;)

Vielen Dank für eure Hilfe!

LG Alex

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Willste jetzt dynamisch das Blockram ändern oder einmal zur 
Snythesezeit?
http://myfpgablog.blogspot.de/2011/12/memory-initialization-methods.html

von Alexander K. (alexxk)


Lesenswert?

Ich möchte es dynamisch beschreiben, am besten mit dem C code der im 
Zynq Processing System ausgeführt wird!

Zu syntheseteit wird das BRAM mithilfe einer .coe Datei initialisiert!

von Klakx (Gast)


Lesenswert?

Alexander K. schrieb:
> Kann ich einen AXI GPIO Block erzeugen der ins Blcokram schreibt?

nimm doch gleich einen AXI BRAM Controller. Damit lässt sich sehr 
einfach ein BRAM auf µProzessor-Ebene beschreiben. Und bietet auch die 
Möglichkeit bei Dual-Port Ram den zweiten Port nativ zu 
beschreiben/lesen.

Wenn du diesen Basisschritt kannst. Verstehst du die nächsten Schritte 
mit DMA, FIFO, Datamover viel besser.

von Hans-Georg L. (h-g-l)


Lesenswert?

Alexander K. schrieb:
> Ich möchte es dynamisch beschreiben, am besten mit dem C code der im
> Zynq Processing System ausgeführt wird!
>
> Zu syntheseteit wird das BRAM mithilfe einer .coe Datei initialisiert!

Wenn du Dein Bild über das PS generieren willst dann mach den 
Bildspeicher doch gleich ins DDR Ram und gib die Daten über AXI und den 
FPGA Teil aus.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Ja dann kommste um AXI natürlich nicht drumrum.
Wie Klakx schon sagte gibts direkt nen AXI Modul welches ein BRAM 
beschreibt.
Die Dinger kannste dir alle im Platform Studio klicken und verdrahten.
Dazu gibts ne LED Blink Anleitung die vom Linux Userspace bis zum FPGA 
GPIO runter geht. Das zum Üben nachbauen udn dann eben den BRAM AXI 
klicken.

https://reference.digilentinc.com/zedboard:zedboard
Tutorials -> Embedded Linux Hands-on Tutorial zip
Dadrinn ist dann ein interessantes 46 seitiges pdf.

Weitere Infos hier:
http://www.zynqbook.com/download-tuts.html
http://www.zynqbook.com/

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Mw E. schrieb:
> Wie Klakx schon sagte gibts direkt nen AXI Modul welches ein BRAM
> beschreibt.

Erstaunlich wie einfach das heute geht:
Man nimmt ein EDK, einen CoreGen und generiert ein AXI-Spezialmodul, 
platziert es im Design, konfiguriert das AXI-Interface, übersetzt das 
Ganze und ein ein vollgeschriebenes RAM.

Wir hatten es früher schwerer:
wir mussten per Hand! einen kompletten Zähler bauen, diesen als Adresse 
benutzen und dann noch ein funktionsschwangeres enable bedienen, um 
sowas zu leisten.

schöne neue FPGA-Welt.

von Alexander K. (alexxk)


Lesenswert?

Vielen Dank für die vielen Antworten!

Ich werde, wie Klakx, es geschreiben hat den AXI Bram Controller 
benutzen um es zu beschreiben damit ich fundiertes Wissen aufbauen kann!

Ich habe jedoch ein Problem:
Im Axi Bram kann ich die Tiefe meines Speichers nicht einstellen 
(ausgegraut), und standartmäßig ist die Adresse 15 Bit groß (14 downto 
0).
Ich benötige jedoch 18 Bit Adressen (17 downto 0).

https://forums.xilinx.com/t5/Design-Entry/How-to-interface-AXI-BRAM-Controller-with-Block-Memory-generator/td-p/636843
Hier habe ich gelesen das dieses Problem anscheinend daraus resultiert 
dass der AXI Bus 32 Bit breit ist. Aber bei GPIOs habe ich auch 32 bit 
eingang und nutze nur zB nur 4 Bits für LEDs!

Laut User Guide:
http://www.xilinx.com/support/documentation/ip_documentation/axi_bram_ctrl/v4_0/pg078-axi-bram-ctrl.pdf

Seite 9 sollten aber sogar 256k unterstützt werden...
Ich habe das BRAM mit 12bit, 153600 depth instanziert!

LG Alex

von Klakx (Gast)


Lesenswert?

Alexander K. schrieb:
> Ich habe jedoch ein Problem:
> Im Axi Bram kann ich die Tiefe meines Speichers nicht einstellen
> (ausgegraut), und standartmäßig ist die Adresse 15 Bit groß (14 downto
> 0).

jep, das liegt daran, dass man die Tiefe des Speichers über die 
Adressebreite (oder war es der Adresseditor?) einstellt. Schau mal dort.

von Alexander K. (alexxk)


Lesenswert?

Danke für deine Hilfe Klakx!
Ich habe das bereits versucht, es hat nicht geklappt. Bei Validate 
design hat er folgenden Fehler ausgespuckt:
ERROR: [IP_Flow 19-3478] Validation failed for parameter 'Memory 
Depth(MEM_DEPTH)' with value '262144' for BD Cell '/axi_bram_ctrl_0'. 
User configuration exceeds BRAM count in the selected device
Das war als ich 256K im Address Editor ausgewählt habe...Mit 2M 
funktioniert es jetzt und ich hab 21 Bit Adressen.

Sehr dubios dass er mir bei kleinerer Speichertiefe sagt das mein Device 
zu klein ist und beim großen Wert kein Problem auftritt.
Ist es besser einfach die PORTs miteinander zu verbinden, oder sollte 
ich jeden Bus einzeln verbinden (Adrese, Dat, enable usw.)?


Eine Frage noch: Wie könnte ich einstellen das von den 21 Bits nicht die 
untersten 18, sondern die oberen 18 Bit verbunden werden?
Bei meiner Online Recherche zu dem Problem habe ich wo gelesen das am 
AXI Bus jede Adresse für ein Byte steht, während der BRAM für jede 
Adresse 12 Bit hat. Sprich ich müsste die unteren 2 Bits des AXI BRAM 
Controllers ignorieren.

Liebe Grüße und vielen Dank!

Alex

: Bearbeitet durch User
von Klakx (Gast)


Lesenswert?

Alexander K. schrieb:
> Ist es besser einfach die PORTs miteinander zu verbinden, oder sollte
> ich jeden Bus einzeln verbinden (Adrese, Dat, enable usw.)?

Kommt drauf an. So richtig voll verstehe ich die Frage nicht. Im 
Standardfall wohl mit Ports.

Alexander K. schrieb:
> Eine Frage noch: Wie könnte ich einstellen das von den 21 Bits nicht die
> untersten 18, sondern die oberen 18 Bit verbunden werden?
> Bei meiner Online Recherche zu dem Problem habe ich wo gelesen das am
> AXI Bus jede Adresse für ein Byte steht, während der BRAM für jede
> Adresse 12 Bit hat. Sprich ich müsste die unteren 2 Bits des AXI BRAM
> Controllers ignorieren.

Hier solltest du einfach ausprobieren und es selber verstehen. Arbeite 
doch einfach mit dem Adress shift. Das mit dem Byte alignment hat 
nämlich besonders Sinn, wenn man in Speicher unterschiedlicher 
Datenbreite schreibt.

von J. S. (engineer) Benutzerseite


Lesenswert?

Geht es hier wirklich um ein Blockram oder nicht doch das externe DDR, 
weil "Speicher zu klein"?  Wenn Du schon das (LANGSAME!) AXI nimmst, 
dann kannst Du auch einen DDR-controller benutzen und hast Speicher 
genug. Der Zynq sollte zudem eine Option haben, die Daten an den FPGA 
über das shared mem zu übergeben. Da habe ich aber keine Idee, welche 
Bandbreite damit möglich ist.

Weiß das jemand?

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
Noch kein Account? Hier anmelden.