Forum: FPGA, VHDL & Co. Fragen zu Microblaze MCS und Xilinx SDK


von M. M. (mrmcchicken)


Lesenswert?

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.

von Fpgakuechle K. (Gast)


Lesenswert?

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,

von M. M. (mrmcchicken)


Lesenswert?

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.

von M. M. (mrmcchicken)


Lesenswert?

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?

von Klakx (Gast)


Lesenswert?

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.

von M. M. (mrmcchicken)


Angehängte Dateien:

Lesenswert?

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.

von Fpgakuechle K. (Gast)


Lesenswert?

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.

von M. M. (mrmcchicken)


Lesenswert?

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.

von Fpgakuechle K. (Gast)


Lesenswert?

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,

von M. M. (mrmcchicken)


Lesenswert?

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
von Fpgakuechle K. (Gast)


Lesenswert?

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,

von M. M. (mrmcchicken)


Lesenswert?

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.

von Fpgakuechle K. (Gast)


Lesenswert?

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.

von M. M. (mrmcchicken)


Lesenswert?

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