Forum: FPGA, VHDL & Co. Round Robin Arbiter - Ein Takt


von Markus (Gast)


Lesenswert?

Hallo Leute,

ich brauche, um meine Bachelor-Arbeit zu schreiben, unter Anderem einen 
Round Robin arbiter in Form von Verilg Code.

Das ganze war auch nicht so schwierig, bis ich von meinem Betreuer 
erfahren habe, dass die Arbitrierung in einem Taktzyklus erfolgen muss.

Die Breite des Request und Grant Vektors müssen dynamisch sein, also via 
Parameter einstellbar.

Habe dazu leider wenig bis gar nichts im Internet gefunden und wollte 
mal fragen ob jemand dazu irgendwelche Tipps hat?


Danke & Gruß

von Trundle Trollkönig (Gast)


Lesenswert?

ich glaube der Ram IPCORE von xilinx benutzt auch sowas!! Vllt bringt es 
was sich die Core-Datein anzugucken... Mehr kann ich dazu leider nicht 
sagen. Sry

von greg (Gast)


Lesenswert?

Was meinst du genau mit "in einem Taktzyklus"? 0 Taktzyklen Verzögerung? 
Das ist in der Tat problematisch: erstens ist es recht aufwändig 
umzusetzen, zweitens wird der kritische Pfad sehr lang.

Wenn du einen Arbiter möchtest, der mit einem Taktzyklus Verzögerung 
arbeitet, ist das kein Problem: da gibt es zahlreiche Ansätze. Einer der 
einfachsten und besten Ansätze arbeitet mit Maskierung, sodass der 
aktuelle Grant im nächsten Taktzyklus niedrigste Priorität erhält.

Hier ist eine einfache Implementierung in VHDL:

https://bitbucket.org/grigorig/axisnoc_router/src/53d77a1e1e6a7f525bd06b721903ce03bd0b6037/src/ArbiterRR.vhd?at=master

Um Arbiter mit vielen Lines effizient umzusetzen, habe ich auch einen 
Tree Arbiter implementiert:

https://bitbucket.org/grigorig/axisnoc_router/src/53d77a1e1e6a7f525bd06b721903ce03bd0b6037/src/ArbiterTreeRR.vhd?at=master

Der Code ist nicht schwer zu verstehen, das müsstest du leicht in 
Verilog umsetzen können.

von greg (Gast)


Lesenswert?

Ganz nebenbei, wenn es ein MUSS sein soll, dass die Arbitrierung im 
gleichen Taktzyklus stattfindet, ich glaube dann lauft ihr auf eine 
Sackgasse zu. Worum geht es denn konkret?

von Markus (Gast)


Lesenswert?

Es geht hier um ein auf einem FPGA laufenden SoC System mit mehreren 
Softcores.

Ich muss ein Konzentratormodul schreiben, sodass mehrere Softcores in 
den Konzentrator Daten reinschreiben können und diese Daten dann 
schlussendlich alle an einen einzigen weitergeleitet werden.

Im Konzentrator selber ist ein zentraler FIFO-Buffer in dem alle Daten 
zusammenlaufen.

Die Zuteilung auf dem Buffer muss über einen RR Arbitrierer erfolgen.



Habe es aber inzwischen hinbekommen, habe das Schaltbild hier auf dieser 
Seite eben in Verilog umgesetzt und funktioniert auch wie gewünscht, 
aber danke für eure Antworten! :)

http://rtlery.com/articles/how-design-round-robin-arbiter


Hatte die ganze Zeit über Verzweigungen und ein Zählregister eine Art 
for-schleife gebaut, was aber natürlich je nach Request-Status teilweise 
mehrere Takte gebraucht hat.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus schrieb:
> Das ganze war auch nicht so schwierig, bis ich von meinem Betreuer
> erfahren habe, dass die Arbitrierung in einem Taktzyklus erfolgen muss.
Bei angenommen 1MHz Taktfrequenz ist das gar nicht so schwer...

Was? Schneller? Wie schnell?

von greg (Gast)


Lesenswert?

Markus schrieb:
> Ich muss ein Konzentratormodul schreiben, sodass mehrere Softcores in
> den Konzentrator Daten reinschreiben können und diese Daten dann
> schlussendlich alle an einen einzigen weitergeleitet werden.
>
> Im Konzentrator selber ist ein zentraler FIFO-Buffer in dem alle Daten
> zusammenlaufen.
>
> Die Zuteilung auf dem Buffer muss über einen RR Arbitrierer erfolgen.

Spendier doch einfach jedem Softcore einen kleinen FIFO und steuere den 
Zugriff auf den Sammel-FIFO mit einem Arbiter. Dann sind die Latenzen 
nicht mehr so wichtig. Wenn du die typischen Softcore-Interfaces wie FSL 
oder AXI4-Stream verwendest ist der FIFO eh sehr sinnvoll.

von Markus (Gast)


Lesenswert?

Lothar Miller schrieb:
> Markus schrieb:
>> Das ganze war auch nicht so schwierig, bis ich von meinem Betreuer
>> erfahren habe, dass die Arbitrierung in einem Taktzyklus erfolgen muss.
> Bei angenommen 1MHz Taktfrequenz ist das gar nicht so schwer...
>
> Was? Schneller? Wie schnell?

Das System läuft im Moment entweder mit wahlweise 27 MHz oder 60 MHz.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus schrieb:
> Das System läuft im Moment entweder mit wahlweise 27 MHz oder 60 MHz.
D.h. der Arbeiter soll einfach den Bus an den nächsten vergeben, wenn 
der Bus frei ist. Sobald der Bus sowieso blockiert/vergeben ist, gibt 
es keine Grant und es muss evtl. sowieso mehrere Takte gewartet 
werden...

Markus schrieb:
> Die Breite des Request und Grant Vektors müssen dynamisch sein, also via
> Parameter einstellbar.
Wie ist das gemeint? "Dynamisch" pro Zyklus?
>  also via Parameter einstellbar.
Es ist in erster Näherung egal, ob du Parameter fix (z.B. über Generics) 
codierst oder einstellbar machst. In der Praxis wird eine einstellbare 
Parametrierung aber auf jeden Fall Zeit kosten, weil ja mehr Logik zur 
Umschaltung nötig ist. Ein knappes Zeitpolster wird also noch mehr 
strapaziert. Ich würde den Arbiter erst mal mit festen Grenzen zum 
Laufen bekommen, und dann sehen, was zur Parametrierung zusätzlich nötig 
ist.

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.