Guten Abend, seit kurzem benutze ich ein FPGA Dev. Board um mich mit der Technik ein wenig vertraut damit zu machen. Taster auslesen und LEDs blinken lassen klappt. Ich möchte nun andere Komponenten ansteuern wie z.b. ein LCD. Mit einem Mikrocontroller ist mir die Ansteuerung bekannt. Deshalb dachte ich mir es wäre der einfachste Weg diese Ansteuerung über Microblaze MCS zu realisieren. Irgendwie habe ich aber nun Probleme mit Xilinx SDK. Denn: Ursprünglich wollte ich einen ,,normalen" Microblaze benutzen. Da es mir aber so scheint als wäre irgendwie alles über AXI angeschlossen sieht es komplizierter aus. Deshalb möchte ich nun den Microblaze MCS benutzen. Dieser scheint ein wenig schlanker zu sein und ich kann direkt GPIO Ports erstellen. Ich habe nun also einen Microblaze MCS, den Takt, den Reset, Schalter und LEDs im IP Integrator. Dieser Aufbau soll erst mal als Test dienen um mit Microblaze MCS vertraut zu werden. Also ich habe das ganze Synthetisiert und Implementieren lassen. Außerdem habe ich den Bitstream generieren lassen. Ich habe über File->Export die Hardware und den Bitstream exportieren lassen. Xilinx SDK habe ich über File->Launch SDK gestartet. Es scheint alles okay zu sein. Ich weiß jetzt aber nicht ganz wie ich weiter fortfahren muss. Xilinx SDK öffnet sich und links in der Leiste ist ein Ordner der projektname_wrapper_hw_plattform_0 heißt. Dieser enthält die .tcl, .bit, .mmi und .hdf Datei. So wie ich das verstehe wurde mir also alles importiert was ich programmieren des Microblazes innerhalb diesem Projekts benötige. Was mir aber nicht klar ist, ist wo ich meinen Code schreiben soll. Mit dem ,,normalen" Microblaze wurde mir alles, inklusive main.c Datei generiert und da konnte ich direkt loslegen.Ich glaube (bitte korrigiert mich wenn ich falsch liege!), dass ich mit dem Microblaze MCS besser bedient bin (wegen GPIO und nicht AXI) zurück zu dem: Ich habe ein neues C Projekt erstellt und dort eine main.c Datei (C Source File). In diese würde ich gerne mein Programm schreiben. Aber ich habe keine Ahnung ob ich da richtig bin. Bevor ich mich hier weiter verlaufe würde ich mich über einen Tipp freuen. Denn wenn ich auf ,,Build All" gehe bekomme ich zwei Error die mit der Meldung: make: *** [project.elf] Fehler 1 undefined reference to 'main' Für mich sieht es so aus als wäre etwas mit der Einrichtung nicht okay und ich weiß nicht was es sein könnte. In der C Datei steht bis jetzt nur der import der stdio lib und die Zuweisung einer Zahl zu einem integer. Syntax Error werden mir nicht angezeigt. Mich würde es freuen wenn mir jemand in dieser Situation einen Tipp geben kann.
Nach der Anleitung hats bei mir bestens funktioniert: Xilinx Microblaze MCS Workflow Probier mal Create new peoject dazu zu bringen dir ein "Hello world" programm zu erstellen (geht zumindest bei Vivado) selbst wenn du keinen Uart hast - damit könntest du zumindest den Compile durch bringen MfG,
Hallo, das habe ich vergessen zu erwähnen. Egal ob ich ein ,,Board Support Package" erstellen will oder eine ,,Hardware Plattform Specification" komme ich nicht weiter. Obwohl ich jede Zeile Fülle sind ,,Next" und ,,Finish" ausgegraut. Währen ich das hier schreibe habe ich folgendes versucht: File->New->Project->General-> und hier ,,projektname_wrapper_hw_plattform_0" als Projektreferenz benutzt. Das wurde mir zu Auswahl vorgeschlagen. Jetzt wird mir auch eine C Datei erstellt. Wenn ich die compile klappt es auch, also kein Error. Ich bin jetzt eher verwirrt wieso es nun klappt. Aber naja. Mal gucken ob ich nun weiter komme.
Da bin ich nochmal. Ich kriege es nicht hin ein IO anzusteuern. Die Beispiel Programme die ich mir angeguckt habe benutzen ständig die Librarys: xparameters.h, xgpio.h, stdio.h, platform.h, xio.h. Dort habe ich kurz rein geschaut. Muss ich mich mit den libs beschäftigen oder kann ich die Pins irgendwie anders als Input oder Output definieren und einfach einen Wert zuweisen? Also so ähnlich wie mit nem AVR in Assembler? Wenn ich mir das Microblaze Referenz Dokument anschaue hilft es mir auch nicht weiter. Gibt es vielleicht sowas wie ein ,,Instruction Set Manual" bei den AVRs? Bin ich denn wenigstens in der .tcl Datei richtig wenn ich mir unter ,,#Create interface ports" dort die Namen der IOs übernehme? Als Beispiel: set led_8bits [ create_bd_intf_port -mode Master -vlnv xilinx.com:interface:gpio_rtl:1.0 led_8bits ] led_8bits ist also nun der Port den ich ansteuern möchte?
hast du einen GPIO-Controller schon angeschlossen? Den gibt's nämlich in der Xilinx IP-Datenbank. Danach solltest du eigentlich nur die richtigen Adressen und Daten anlegen.
Der GPIO Port ist im Microblaze MCS integriert. Ich habe mal einen Screenshot vom Block Diagramm hoch geladen. sys_clk, reset, led und switches sind auf dem Board und wurden so von dem Boardfile entnommen.
M. M. schrieb: > Da bin ich nochmal. Ich kriege es nicht hin ein IO anzusteuern. > Die Beispiel Programme die ich mir angeguckt habe benutzen ständig die > Librarys: xparameters.h, xgpio.h, stdio.h, platform.h, xio.h. > Dort habe ich kurz rein geschaut. Muss ich mich mit den libs > beschäftigen oder kann ich die Pins irgendwie anders als Input oder > Output definieren und einfach einen Wert zuweisen? Also ich nutz wo es gehr Xil_in32 resp Xil_out32
1 | void toogle_gpo(u32 xor_mask) |
2 | {
|
3 | u32 ret_int32; |
4 | |
5 | ret_int32 = Xil_In32(XPAR_AXI_GPIO_0_BASEADDR); |
6 | |
7 | print("GPIO before: ");printu32(ret_int32); print("\b\n"); |
8 | ret_int32 = ret_int32 ^ xor_mask; //toggle bit 8 |
9 | Xil_Out32(XPAR_AXI_GPIO_0_BASEADDR, ret_int32); |
10 | |
11 | ret_int32 = Xil_In32(XPAR_AXI_GPIO_0_BASEADDR); |
12 | print("GPIO after: ");printu32(ret_int32); print("\b\n"); |
13 | }
|
das oben ist allerdings für ein mikroblaze system und nicht für den MCS. bei mcs habe ich folgendes für blinken getippt
1 | for (;;) |
2 | {
|
3 | if (led_on) { |
4 | //write to dataport out channel 3 (GPO3 : LRD[4:0])
|
5 | XIOModule_WriteReg(XPAR_IOMODULE_0_BASEADDR,XGO_OUT_OFFSET + 2*4,run); |
6 | //XIOModule_DiscreteWrite(&GPIO, 3,run);
|
7 | if (run == 0x01) run = 0x10; else run = run>>1;} |
8 | led_on = !led_on; |
9 | //timer
|
10 | pause(100000); |
11 | }
|
wie man sieht hat man da auch mit verschiedenen aufrufen experiementiert. Es könnte aber auch am ucf/xdc liegen wenns nicht blinkt.
Danke für deine Bemühungen, aber ich finde die beiden libs nirgends (Xil_in32 & Xil_out32). Stelle ich mich zu doof an oder muss man dafür auch irgend welche komische Lizenzen haben? Ich habe die WebPack Edition.
M. M. schrieb: > Danke für deine Bemühungen, aber ich finde die beiden libs nirgends > (Xil_in32 & Xil_out32). Stelle ich mich zu doof an oder muss man dafür > auch irgend welche komische Lizenzen haben? Ich habe die WebPack > Edition. Moin, die beiden sollte/muß es geben, ich hab grad noch ein beispiel für den MCS unter vivadoe gefunden: https://forums.xilinx.com/xlnx/attachments/xlnx/EDK/30029/1/mcs_sim.pdf in der Xil_out32 (deklariert in Xil_io.h) benutzt wird. ich verwende auch das WebPack und sdk. im vivado stosse ich sicherheitshalber immer die generierung der outputfiles händisch an. Wichtig ist auch das man im ip-designer immer verify design auslösst (grüner Haken-button). beim sdk habe ich öfters das projekt neu aufgesetzt. also C-sourcen wegkopiert. -neues hello world projekt + bsp generiert. sourcen reinkopiert. workspace aufräumen hilft auch. Für mehr Tipps hab ich grad keine Zeit, Viel Efolg,
Hallo nochmal. Mit den libs bin ich nicht weiter gekommen (benutze Xilinx MicroBlaze GNU Toolchain), also habe ich mir xil_io.h in ein Verzeichnis kopiert wo es vom Compiler gefunden wird. Alle libs die innerhalb der libs beachtet werden habe ich auch rein kopiert so, dass ich xil_io.h nun benutzen kann. Der Code den ich gerne ausprobieren würde lautet:
1 | #include <xil_io.h> |
2 | |
3 | int main(void){ |
4 | (*(volatile u8 *)((0x80000014)) = (0xAA)); |
5 | return 0; |
6 | }
|
Die Adresse für den GPIO habe ich aus dem Datenblatt des Microblaze MCS. In der .tcl Datei steht: ,,CONFIG.USE_GPO2 {1}" Deshalb nehme nehme ich mal an, dass der GPIO dort als Output festgelegt wird, richtig? Ich habe nun aber ein anderes Problem bei dem ich seit einigen Stunden nicht weiter komme. Ich kriege die .elf Datei einfach nicht in den FPGA rein. Was ich gemacht habe: - Den oben genannten Code Compiliert. - Die entstandene .elf Datei in Vivado als Design Source hinzugefügt. - Rechtsklick auf Block Design und hier die .elf Datei zugewiesen - Synthetisiert, Implementiert und Bitstream generiert. Möchte ich nun in der SDK mein Programm unter Program FPGA aufziehen ist unten die Liste ,,Software Configuration" leer. Eigentlich sollte hier die .elf Datei auswählbar sein. Was habe ich falsch gemacht? Klicke ich in Vivado die .elf Datei an, so ist ein Haken bei ,,Enabled" und ,,Implementation". Ich bekommen das gleiche Resultat, egal ob ich den Bitstream aus dem .sdk Ordner nehme oder den anderen.
:
Bearbeitet durch User
M. M. schrieb: > Hallo nochmal. Mit den libs bin ich nicht weiter gekommen (benutze > Xilinx MicroBlaze GNU Toolchain), also habe ich mir xil_io.h in ein > Verzeichnis kopiert wo es vom Compiler gefunden wird. Alle libs die > innerhalb der libs beachtet werden habe ich auch rein kopiert so, dass > ich xil_io.h nun benutzen kann. > Der Code den ich gerne ausprobieren würde lautet: >
1 | #include <xil_io.h> |
2 | >
|
3 | > int main(void){ |
4 | > (*(volatile u8 *)((0x80000014)) = (0xAA)); |
5 | > return 0; |
6 | > } |
Diesen Syntax mit direkte Addresse probier ich mal bei Gelegenheit hier aus, dann kann ich mehr dazu sagen. Die Adressmap steht bei microblaze auch im IP-Editor. Siehe: bspw. http://www.wiki.xilinx.com/file/view/block_design.JPG/554840211/889x501/block_design.JPG Der reiter address editor, ob das mcs genauso ist kann ich nicht sagen. Dazu könnte aber auch was in dem pdf des IP-cores stehen. > > Die Adresse für den GPIO habe ich aus dem Datenblatt des Microblaze MCS. > In der .tcl Datei steht: ,,CONFIG.USE_GPO2 {1}" > Deshalb nehme nehme ich mal an, dass der GPIO dort als Output festgelegt > wird, richtig? Könnte sein, kann ich grad nicht nachchecken > > Ich habe nun aber ein anderes Problem bei dem ich seit einigen Stunden > nicht weiter komme. Ich kriege die .elf Datei einfach nicht in den FPGA > rein. Was ich gemacht habe: > - Den oben genannten Code Compiliert. > - Die entstandene .elf Datei in Vivado als Design Source hinzugefügt. > - Rechtsklick auf Block Design und hier die .elf Datei zugewiesen > - Synthetisiert, Implementiert und Bitstream generiert. > > Möchte ich nun in der SDK mein Programm unter Program FPGA aufziehen ist > unten die Liste ,,Software Configuration" leer. Eigentlich sollte hier > die .elf Datei auswählbar sein. Was habe ich falsch gemacht? > Klicke ich in Vivado die .elf Datei an, so ist ein Haken bei ,,Enabled" > und ,,Implementation". Ich bekommen das gleiche Resultat, egal ob ich > den Bitstream aus dem .sdk Ordner nehme oder den anderen. Spontan kann ich dazu wenig konkretes sagen, hatte auch Probleme bis das programm im FPGA lief. Geholfen hat da ein Neuaufsetzen strikt nach Anleitung. Das elf fibd hatte ich soweit ich mich erinnere nicht im Vivado in der fileliste. Vivade kennt den sdk nicht, liefert nur ein ?.mhs? file rüber. also im vivado nur sdk export o.ä. und lauch sdk und dann alles inklusive download bitstream aus dem sdk reiter xilinx tools. Letzter fallstrick war das das programm erst startet wenn man im debugger auf play drückte. aber das kann auch von einstellung ui einstellung anders sein. MfG,
Hallo nochmal, den Microblaze MCS habe ich aufgegeben. Heute habe ich den ,,normalen" Microblaze ausprobiert. Erst hatte ich Probleme in der SDK bekommen, dass der Heap nicht in den Speicher passt. Im IP Integrator habe ich mit den Blöcken ein wenig herum gebastelt und der Fehler ist verschwunden. In der SDK habe ich folgendes Programm geschrieben:
1 | #include <stdio.h> |
2 | #include <xil_io.h> |
3 | |
4 | int main(){ |
5 | while(1){ |
6 | (*(volatile u32 *)((0x40000000)) = (0xAAAAAAAA)); |
7 | return 0; |
8 | }
|
9 | }
|
Ein Problem das nun aufgetaucht ist: Die ganze Geschichte (also Microblaze, Programm und Rest vom Bitstream) funktioniert nur dann, wenn ich in folgender Reihenfolge vorgehe: Die .elf Datei habe ich innerhalb Vivado zum Topmodul zugeordnet. 1. In der SDK schreibe ich einen Code. 2. Diesen Code compile ich. 3. Innerhalb Vivado generiere ich einen Bitstream (mit zugeordneter .elf Datei) 4. Diesen Bitstream spiele ich auf den FPGA. Das ist natürlich relativ umständlich und dauert vergleichsweise lange. Wenn ich innerhalb der SDK den FPGA Programmiere ist der Bitstream auch drauf, aber ohne die aktuellste .elf Datei. Wenn ich auf Run As --> Launch on Hardware (System Debugger) gehe bekomme ich die Fehlermeldung: ,,Error while launching program: no targets found with "name =~ "microblaze*#0" && bscan=="USERnull" && jtag_cable_name =~ "Digilent Nexys Video 210276724188B"". available targets: 1* xc7a200t". Ich finde die Einstellung nicht wo ich das Target ändern kann. Unter Run Configuration habe ich unter FPGA Device nur das Nexys Video Board. Kann ich irgendwie das Target anpassen? Eine andere Sache die ich mir unbedingt angucken muss ist diese AXI Bus Geschichte.
Spiel mal ein bißchen mit dem Hardwaremanager , damit solltest du auch Kontakt zum FPHA auf dem Board finden und diesen Programmieren können. Wobei es schon reicht den FPGA-typ auslesen zu können um die Verbindung zu testen. wenn es nicht funtkioniert könnte das usb-kabel falsch gesteckt sein. Ich hatte auch mal mit Fehlermeldungen zu tun wenn nicht bei der mikroblaze generierung (IP-designer) das debug-modul ausgewählt war. Deine Fehlermeldung klingt ein wenig dannach. Vielleicht klemmt ja auch nicht der FPGA-download an sich sondern das Board bleibt in einem "debug-Monitor" oder sonstwo stehen. Manchmal hilft es das board vor der Neu-konfiguration auszuschalten (power off) und erst dann zu programmieren. Manchmal genaus das gegenteil - nicht ausschalten sondern grad drüber programmieren Ich baue hier grad ein MCS System für Zybo (Zynq-board) um dein Problem nachzustellen. Mal schauen ob ich da noch Tipps dazu geben kann. MfG, PS: Du hast ein Artix-board?! Beim Zynq ist einige anders.
Fpga K. schrieb: > Ich hatte auch mal mit Fehlermeldungen zu tun wenn nicht bei der > mikroblaze generierung (IP-designer) das debug-modul ausgewählt war. > Deine Fehlermeldung klingt ein wenig dannach. Ich bin endlich dazu gekommen es mal aus zu probieren. Es war tatsächlich das Problem. Habe das Debug Modul dran gehängt und es läuft nun, danke für den Tipp!! Fpga K. schrieb: > PS: > Du hast ein Artix-board?! Beim Zynq ist einige anders. Jup so sieht's aus.
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.