Forum: FPGA, VHDL & Co. Microblaze FSL


von ferro (anfänger) (Gast)


Lesenswert?

Hallo,

bin gerade dabei, meinen ersten Schritte in diesem Bereich zu tätigen. 
Habe vor mir ein Xilinx Spartan Evaluationsboard , und als 
Entwicklungsumgebing das EDK 10.1.

Will nun zwischen zwei Microblaze Daten über zwei FSL-Busse (weil 
unidirektional) austauschen. Habe mir mein System schon im Xilinx 
Platform Studio zusammengeschustert. Bin gerade dabei mir ein C Programm 
zu überlegen, um den Datenaustausch zu realisieren, und den 
entsprechenden BRAMs zu initialisieren. Habe auf beiden Microblaze den 
xilkernel als RTOS im XPS eingestellt. Anschliessend habe ich mir die 
Software Librarys und BSP erstellen lassen.

Nun hab ich ne Menge von Header, die ich vermutlich verwenden kann. 
Beispielsweise die fsl.h. Da habe ich die macros put/getfslx gefunden.

Habe nur grundlegende Erfahrungen mit C.

1. Kann mir da jemand bisschen auf die Sprünge helfen, wie ich nun den 
Datenaustausch am besten realisiere?

2. Wird beim Empfänger ein Software-Interrupt geworfen, wenn Daten in 
der FSL-FIFO sind? Oder wie läuft das ab?

3. Kann mir jemand dazu gute Referenz oder url geben? Habe bereits die 
Datasheets, OS_Lib paper von Xilinx und mb_ref_guide gelesen.

4. kann man mit der put/get funktion auch ganze structs auf einmal 
verschicken?

Bin über jede Antwort/Hilfe sehr dankbar, am besten Code-Example

liebe grüße
ferro

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Moin, gehört wohl eher ins FPGA Forum, naja.

Du brauchst erstmal nur einen FSL Kanal, dann kanst du mit put ein byte 
senden und mit get ein byte empfangen (32bit)

Du kannst ganze structs versenden, mußt diese aber voher in 32bit pakete 
"zerlegen", am besten das erste paket mit commandbit
1
cputfsl(data, CH_SLOT_ID);
und den rest ohne dann weißt du wo es "anfängt" (gegenseite muß dan 
alles wieder zusammenbauen)

Du kannst das ganze interuptgestuert machen, mußt dann das Exists Signal 
auswerten.
Alternativ kann man die Abfrage selbst so gestalten das man das ganze 
pollt ob neue Daten da sind (schau dir mal im Ref guide die put/get 
instruktionen ganz am ende an da ist ne erklärung zu allen asm 
befehlen).

In c wird das über einen nonblocking rwead gemacht und dann mußt du mit 
fsl_isvalid() (so oder so änlich schau mal im header) prüfen ob es 
gültige Daten waren. (ebenso kann man mit fsl_error() prüfen ob ein 
commandread wirklich einer war...)

von ferro (Gast)


Lesenswert?

Hallo Läubi,

erstmal Danke, SUPER, hat mir schon einiges weitergeholfen.

Was ist die elegantere Methode? Interrupts oder Polling?

Wenn ich nur einen FSL zwischen die Microblaze häng, hab ich dann nicht 
das Problem, dass ich den Datenverkehr nur in eine Richtung steuern 
kann? Dann ist ja nur einer der beiden MB Master. Oder ist das auf der 
Softwareebene egal?

Gruss ferro

von ferro (Gast)


Lesenswert?

zur aktualität:

die FSL-Funktionen werden in den neuen Versionen von EDK mit

putfslx(val, id, flags) und getfslx(val, id, flags) aufgerufen. über die 
flags kann nun zwischen blocking, non blocking, control usw. 
differenziert werden.

gruss ferro

von ferro (Gast)


Lesenswert?

Hallo,

kann mir bei meinem FSL Problem jemand weiterhelfen?

"Wenn ich nur einen FSL zwischen die Microblaze häng, hab ich dann nicht
das Problem, dass ich den Datenverkehr nur in eine Richtung steuern
kann? Dann ist ja nur einer der beiden MB Master. Oder ist das auf der
Softwareebene egal?"

Habe es so gemacht: an jedem MB ein FSL-Interface. Und dann zwei 
FSL-Busse. Jeder FSL ist an einem MB Master und am anderem Slave. Wenn 
ich dann ne put-Funktion realisiere, ist dann die id bei jedem 0? Da ja 
pro MB nur ein Interface gibt? Versteh das noch nicht so genau.

Gruss Ferro

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.