Forum: FPGA, VHDL & Co. Register / Linux - Xilinx FGPA


von Christoph H. (berton)


Lesenswert?

Ich lese mich gerade erst in ganz vieles ein und verstehe leider noch 
nicht alles.
Per EDK habe ich eine IP Komponente entworfen, die per PLB Kommuniziert 
und ein Register besitzt. Auf dem FPGA läuft Linux.
Ich verstehe noch nicht ganz, wie ich dann von Linux aus auf das 
Register zugreife.
Woher weiß ich überhaupt an welcher Adresse die Komponente zu finden ist 
und woher weiß ich, wo das Register zu finden ist?


von hae (Gast)


Lesenswert?

Auf dem FPGA läuft Linux ? Oder meinst du, du entwickelst unter Linux ? 
Der Titel deines Posts "...FGPA..." ist ebenso sorgfältig formuliert wie 
deine Frage, welche in die Rubrik "Programmierbare Logik" gehört. Wenn 
du genauso präzise entwickelst wie du fragst, wirst du wohl viel Spass 
haben...

von Christoph H. (berton)


Lesenswert?

Ja,ja Sorry. Habe ich wohl versehentlich nicht aufgepasst. Eigentlich 
sollte der Beitrag auch in der Rubrik "Programmierbare Logik" landen.

Okey, dann jetzt nochmal etwas ausführlicher:
Es handelt sich um einen Virtex FPGA mit PPC. Es sind soweit alle 
Komponenten vorhanden, dass Linux auf dem FPGA/PPC läuft.
Entwickelt wird unter Windows.

von Gargamel (Gast)


Lesenswert?

Normalerweise kannst du im EDK bei deiner Komponenten angeben, welchen 
Adressbereich sie belegt. Wenn du rausgefunden wo sie ist, kannst du das 
einfach hardcoden ála

#define MYADRESS 0x12345678

int* ptr = (int*) MYADRESS;

und mit *ptr = 5; dann drauf zugreifen.

Mfg
Gargamel

von Christoph H. (berton)


Lesenswert?

Hey, danke Gargamel.
Die Adresse der Komponente habe ich. Ich verstehe nur noch nicht wie ich 
auf die Register zugreifen kann.
Angenommen ich habe 2 Register und einen Adressbereich von 0x80410000 
bis 0x804101ff.
Wie kann ich dann auf Reg1 und Reg2 zugreifen?

von Alban (Gast)


Lesenswert?

C meets hardware:

"Zeiger enthalten die Adresse eines Objektes eines bestimmten 
Datentyps."
  -- Aus "Programmieren mit C" von Clauß Fischer. --

Also im banalsten Fall kannst du einen Pointer deklarieren und ihm die 
Adresse deines Registers zuordnen. Dann kannst du über den Pointer auf 
das Register zugreifen.

Aber normal hat das EDK für seine Peripherie doch Treiber. Dann liefert 
der Treiber eine Funktion um darauf zu zugreifen.

von Christoph H. (berton)


Lesenswert?

Hey, danke Alban!
Das hat mir wirklich weitergeholfen. Ich wußte bisher garnicht, dass das 
EDK auch direkt rudimentäre Treiber zur Verfügung stellt. (Wie gesagt, 
ich arbeite mich gerade ein).
Ich habe mir die Treiber jetzt mal angesehen, aber immernoch eine Frage.
1
#define PLB_MEINE_KOMPONENTE_USER_SLAVE_SPACE_OFFSET (0x00000000)
2
#define PLB_MEINE_KOMPONENTE_SLAVE_REG0_OFFSET (PLB_COMMUNICATION_USER_SLAVE_SPACE_OFFSET + 0x00000000)
3
4
XIo_Out32(baseaddr+PLB_MEINE_KOMPONENTE_SLAVE_REG0_OFFSET, data->Upper);
5
XIo_Out32(baseaddr+PLB_MEINE_KOMPONENTE_SLAVE_REG0_OFFSET+0x4, data->Lower);

Wieso kommt das mit den Adressen so zustande?
Weshalb ist das Register 0x4 breit?

von Thomas P. (pototschnig)


Lesenswert?

baseaddr wird eine "Basisadresse" eines bestimmten Adressbereichs sein. 
PLB_BLABLA_OFFSET ist eine relative Adresse bezogen zur Basisadresse.

0x4 kommt daher, weil die Adressen in Bytes gezählt werden, ein 32Bit 
Register aber dann 4 Byte hat. Das nächste Register fängt dann 0x4-Bytes 
weiter hinten an.

Mfg
Thomas Pototschnig

von Misha M. (Gast)


Lesenswert?

eine Frage die du mir wahrscheinlich Beantworten könntest:

ich versuche grad auch Linux für denn ppc hinzukriegen (Virtex 5 ml507 
Board), leider ohne Erfolg, vielleicht kannst du mir ja sagen auf welche 
Seiten du dich Informiert hast, welchesn Linux du benutzt und was deine 
Entwicklungsschritte waren?

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.