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
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...)
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.