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
Willste jetzt dynamisch das Blockram ändern oder einmal zur Snythesezeit? http://myfpgablog.blogspot.de/2011/12/memory-initialization-methods.html
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!
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.
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.
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/
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.
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
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.