Forum: FPGA, VHDL & Co. Microblaze FSL benötigt 20 Takte für einen Put-Befehl


von ChrisB (Gast)


Lesenswert?

Hallo an Alle,

ich versuche gerade zwei Microblazes per FSL zu verbinden und eine 
Kommunikation zu realisieren.
Die Kommunikation funktioniert auch schon in beide Richtungen, jedoch 
benötigt der Microblaze 20 Takte für einen "putfslx(val, MBXE_FSL, 
FSL_NONBLOCKING)" - Befehl.
Laut Datenblatt (Microblaze Processor Reference Guide) soll der 
nicht-blockierende Befehl aber in einem Takt möglich sein.
Ich habe verschiedenen Einstellungen am FSL Bus vorgenommen, jedoch ohne 
jegliche Veränderung.
Momentan arbeite ich mit folgenden Einstellungen am FSL Bus:
C_EXT_RESET_HIGH = 1
C_ASYNC_CLKS = 0
C_IMPL_STYLE = 0
C_USE_CONTROL = 0
C_FSL_DEPTH = 4

Ich benutze das Xilinx EDK 11.3 und das Spartan 3A DSP 1800 Board.

Hat jemand eine Idee, wie diese 20 Takte zustande kommen, bzw. hat 
jemand gleiche oder andere Erfahrungen gemacht?
Wenn der FSL wirklich 20 Takte benötigt, dann ist daran doch nichts mehr 
"Fast" und es macht wirklich nur Sinn einen Coprocessor per FSL zu 
Verwenden, wenn dieser große Aufgaben lösen soll und wenig Parameter 
braucht.

Zusätzlich würde mich interessieren, wie ich einen eigenen IP Core 
entwickel, der an mehr als einem Microblaze per FSL angeschlossen werden 
kann. Der "Create and Import Peripheral Wizard" unterstützt nur einen 
Input FSL und einen Output FSL, aber leider nicht mehrere der gleichen 
Sorte.
Hat jemand eine Idee, wie man das hinbekommen kann?
Wenn es nur die Möglichkeit gibt, sich einen IP Core mit einem Input und 
einem Output FSL zu generieren und man dann per Hand in den VHDL und MPD 
Dateien rumbasteln muss, wäre es schön zu wissen, wie man da am besten 
vorgeht, und was genau man anpassen muss...

Gruß,

ChrisB

von Antti L. (trioflex)


Lesenswert?

bist du sicher das BEFEHL selber 20 zuklen braucht?
xilinx treiber haben overhead

eigene fsl IP sind einfach, aber muss manchmal ohne wizard per
hand machen

Antti

von ChrisB (Gast)


Lesenswert?

Ja der eigentliche nput Befehlt benötigt 20 Takte.
Ich habe mir angeguckt, was der Compiler auf dem Funktionsaufruf 
putfslx() (was eigentlich nur ein Makro für eine Assambleranweisung ist) 
gemacht wird. Es ist wirklich der reine nput-Befehl.


Wie bekomme ich es denn hin, dass ich einen IP Core im EDK habe, welcher 
mehrere FSL Busse zur verfügung stellt, an die ich per Drag und Drop 
einen oder mehrere Microblazes hängen kann?

Eine andere Frage zum eigenem IP Core:
Kann ich für meinen IP Core auch eine "Konfigurationsoberfläche" 
erstellen, wie es sie für die Xilinx IP Cores gibt, um dann Parameter 
meines IP Cores anzupassen?


Gruß,

ChrisB

von Antti L. (trioflex)


Lesenswert?

siehe die MPD files an

konfiguration eigener ip cores is moglich da gibt es parameter
die man spater im gui einstellen kann

Antti

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

ChrisB schrieb:
> Wie bekomme ich es denn hin, dass ich einen IP Core im EDK habe, welcher
> mehrere FSL Busse zur verfügung stellt, an die ich per Drag und Drop
> einen oder mehrere Microblazes hängen kann?
Du mußt das Konfigurationsfile (leider) per Hand anpassen für diesen 
Zweck.
Schau mal in die Konfigfile zum MicroBlaze, oder vieleicht hilft dir 
auch das hier weiter:
http://forums.xilinx.com/xlnx/board/message?board.id=EMBEDDED&thread.id=2086

> Ja der eigentliche nput Befehlt benötigt 20 Takte.
Wie kommst du zu dieser Messung?

von ChrisB (Gast)


Lesenswert?

Also die Zeitmessung mache ich, indem ich in einer Schleife zwei mal den 
Timerwert (der mit dem gleichen Takt läuft wie der Microblaze) auslese 
und die Differenz bilde. Daraus ergibt sich dann eine Art Offset, die 
ich abziehe, sobald ich etwas zwischen die beiden Timer-Auslesen-Stellen 
schreibe. In meinem Fall ist das halt der nput-Befehl, und sonst nichts.
Die Differenz bei jedem Durchlauf wird denn mit einem min und einem max 
Wert vergliegen und dieser ggf. überschrieben, so dass ich am Ende die 
minimale und maximale Anzahl an Takten habe.
Damit auch der I-Cache keine Rolle mehr spielt zähle ich in der Schleife 
eine Variable hoch, und erst wenn die Variable 100 überschreitet lasse 
ich meine min-max Auswertung starten. So kann ich sicher sein, dass auch 
alle Befehle im I-Cache stehen.
Für den min und den max Wert ergeben sich bei mir immer genau 20 Takte 
(Offset schon abgezogen). Bei einem nop ist es nur einer.

von Mark (Gast)


Lesenswert?

Wieviele Pipelinestufen hat dein Prozessor ?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Mark schrieb:
> Wieviele Pipelinestufen hat dein Prozessor ?
3 bis 5.
Das Problem kann hier wirklich eine ungünstige Pipelineausnutzung sein, 
führe doch einfach mal 100 puts aus (nacheinander schreiben ohne 
Schleife) und schau dir vorallem mal das ASM Listing an!

von Mark (Gast)


Lesenswert?

Zudem können Pipelinekonflikte die eigentliche Taktzahl erhöhen. Ich 
hatte das gleiche 'Problem' mal auf einer NiosII Platform.

von ChrisB (Gast)


Lesenswert?

Also im asm ist momentan wirklich nur der nput-Befehl zwischen meiner 
Zeitmessung.
Ich hönnte nochmal versuchen mehrere nputs direkt hintereinander 
auszuführen und dann die mittlere Zeit berechnen, die ein Befehl 
benötigt. Ich vermute jedoch, dass auch dort die 20 Takte rauskommen 
werden.
Hat denn jemand eine ähnliche Messung gemacht, mit der man mein Ergebnis 
Bestätigen oder Widerlegen kann?
Mich würde interessieren auf welche Werte andere Leute kommen. 
Vielleicht geht ja auch wirklich was schief.

Momentan liegt die Pipeline bei 5 Stufen durch C_AREA_OPTIMIZED = 0

von Mark (Gast)


Lesenswert?

C_AREA_OPTIMIZED = 0 ???

von ChrisB (Gast)


Lesenswert?

Ja, das ist ein Parameter vom Microblaze. Durch Setzen des Parameters 
auf '1' wird der Microblaze auf engerem Raum (weniger Logik-Zellen) 
platziert. Dadurch ist aber gleichzeitig auch die Pipeline nur noch 
3-stufig anstatt wie üblich 5-stufig.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ich habe mich in meiner Diplomarbeit mal mit dem MB beschäftigt, kam da 
aber eher so auf 4 Takte pro Durchlauf. Genauer weiß ichs aus dem Kopf 
grad nicht mehr, aber woher kriegt der MB den seine Daten? Internes 
BRAM? Oder Flash/SRAM/DDR? Da kann einem nämlich das ganze ohne Cache 
gehörig in die Suppe spucken.

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.