Forum: FPGA, VHDL & Co. Core-Komponenten durch Register entkoppeln?


von dito (Gast)


Lesenswert?

Hallo zusammen!

Ich hätte da mal eine Frage zu einem Problem, das mich schon länger 
beschäftigt.

ich habe eine Divisions-Einheit, die zwei Integer-Operanden a und b mit 
je 32 Bit einliest und das Ergebnis ebenfalls als 32 Bit Integer 
ausgibt. Intern arbeitetet diese Einheit aber mit einer 
Fließpunkt-Divisions-Einheit.

Der Datenfluss sieht also wie folgt aus:

fixed_to_float(a) -->
                      float_divider --> float_to_fixed
fixed_to_float(b) -->


Die drei Komponenten sind mit dem Core-Generator xon Xilinx erstellt 
worden.

Nun stellt sich mir die Frage, wie ich das in einer Pipeline so 
umsetzten kann, dass ich den maximalen Takt herauszuhole ( bzw. was 
schreiben die "Coding Styles" o.ä. in diesem Falle vor?):

1. Direkt verdrahten (so wie oben abgebildet)
2. Vor und hinter float_divider ein Register (also insgesamt drei)
3. So wie 2., aber auch die Ein- und Ausgänge der Pipeline mit Registern 
entkoppeln (also insgesamt sechs)

Wie würdet ihr das machen? Bringen denn die Vorschläge 2 und 3 überhaupt 
einen Performance-Gewinn gegenüber Vorschlag 1 oder verschenke ich da 
bloß wertvolle Flip-Flops?

Gruß,
dito

PS: Der obige Ansatz verbraucht tatsächlich weniger Ressourcen als die 
direkte Division mit Integerzahlen (zumindest für den Fall, dass ich mit 
jedem Takt ein Ergbnis erhalte (Latenz dafür 40 Takte))

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Sind die Einheiten schon getaktet oder sind das kombinatorische Sachen?
Wenn die getaktet sind hast du eh schon die Register an den Eingängen 
und es bringt nix, ansosnten kann es helfen ein Register vor und nach 
Float divider einzubauen (am Anfang und ende bringts nicht so viel bzw 
sizt da eh meist noch ein Register wenn du es mit anderer getakteter 
Logik verwindest).

von dito (Gast)


Lesenswert?

Alle Komponenten sind getaktet. Der Float-Divider wird daher wohl auch 
Register am Eingang haben.
Ich habe irgendwo mal gelesen, dass man "an bestimmten Stellen" (ich 
glaube an Anfang und Ende eines Moduls) Register plazieren sollte, um 
die Synthesewerkzeuge bei der Ermittlung des maximalen Taktes zu 
unterstützen.
Weiß nur leider nicht mehr was da genau stand... :-(

von Georg A. (Gast)


Lesenswert?

Das ist das Registerbalancing... Das muss nicht nur ein FF sein, es 
können auch mehrere Stufen sein und die Synthese versucht, die möglichst 
gleichmässig zwischen die Kombinatorik zu verteilen. Man kann die FFs 
vor die Logik setzen oder auch dahinter. BTW: Das kann auch zu 
Registerverdopplungen führen, die Funktion wird aber nicht geändert 
(wenn die Synthese keinen Mist baut...).

Beim xst schaltet man das mit "-register_balancing YES" an. Hau einfach 
mal ein paar Register vor deine Eingänge und schau, ob die Taktperiode 
kleiner wird. Wenn der kritische Pfad aber zB. schon in dem FP_DIV war, 
wird die Balazierung wohl direkt nichts mehr bringen. Allerdings relaxed 
sie das gesamte Timing, das kann sich psoitiv auf die Routingzeiten 
auswirken.

> Weiß nur leider nicht mehr was da genau stand... :-(

XST User Guide S. 325
http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/xst.pdf

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


Angehängte Dateien:

Lesenswert?

> Beim xst schaltet man das mit "-register_balancing YES" an.
Oder über das GUI (Synthese-Optionen, Screenshot).

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.