Forum: FPGA, VHDL & Co. Addition mit "+" und deren Umsetzung auf dem FPGA


von VoSte (Gast)


Lesenswert?

Hallo!

Ich habe eine sehr grundlegende Anfängerfrage zum Thema 
FPGA-Programmierung, zu der ich nicht in der Lage war, Google sinnvoll 
zu befragen... Ich hoffe, dass mir hier jemand weiterhelfen kann.

Ich möchte von vornherein klarstellen, dass ich bisher nur eine diffuse 
Vorstellung von der Funktionsweise von FPGAs habe. Leider fehlt mir 
gerade die Zeit, mich sehr tiefgehend mit dem Thema zu beschäftigen, 
während diese Frage mir dennoch stark auf der Seele brennt:

Sowohl in Verilog als auch in VHDL ist es möglich, zwei Operanden 
schlicht mit dem "+"-Operator zu addieren (das ist natürlich auch sehr 
wünschenswert). Nun muss hierfür auf dem FPGA am Ende natürlich auch ein 
entsprechender Addierer instanziiert werden. Hierzu habe ich einige 
Fragen:

1) Lässt sich in irgendeiner Form die Art des Addierers konfigurieren, 
die hier verwendet wird, oder ist das fix? Meineswissens lassen sich im 
Prinzip sowohl Arithmetische Einheiten innerhalb der Logik-Zellen als 
auch diejenigen aus den DSP-Slices verwenden... Zu welchem Ergebnis 
führt also "+"?

2) Ich vermute, dass die Bitbreite der Operanden einen großen Einfluss 
auf die maximale Taktfrequenz hat, insbesondere bei Verwendung der 
Arithmetik-Einheiten in den Logik-Zellen - immerhin hat man die Laufzeit 
der Carry-Bits zu beachten. Hätte ich den verwendeten Addierer nun 
selber implementiert, wüsste ich natürlich dessen Laufzeit im Verhältnis 
zur restlichen Logik. Woher bekomme ich diese Information aber für die 
automatisch instanziierten Addierer?


Ich hoffe ich habe nicht zuviel durcheinander gewürfelt und einigermaßen 
klar werden lassen, worum es mir geht!

Vielen Dank im Voraus und beste Grüße!

von Michael (Gast)


Lesenswert?

du kannst in VHDL ohne Weiteres zwei Vektoren (Bitanordnungen) mit dem 
operator "+" addieren und damit einen Summenvektro erhalten.

von Georg A. (georga)


Lesenswert?

> Zu welchem Ergebnis führt also "+"?

Zu dem, das das Syntheseprogram für das Beste hält. Typischerweise 
werden dazu spezielle FPGA-Eigenschaften für das Carry-Bit benutzt 
(Logik+Routing), die das ganze gegenüber der "konventionellen" 
Implementierung beschleunigen.

> Hätte ich den verwendeten Addierer nun selber implementiert, wüsste ich
> natürlich dessen Laufzeit im Verhältnis zur restlichen Logik.

Nicht bei FPGAs, da geht das Routing tw. mit über 50% in die Laufzeit 
ein. Und das weiss man erst nach Place&Route.

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


Lesenswert?

VoSte schrieb:
> immerhin hat man die Laufzeit der Carry-Bits zu beachten.
Das war/ist auch den Entwicklern von FPGAs klar. Und es wurden einige 
Kniffe angewandt und etliche (Trivial-)Patente ind die effiziente 
Umsetzung dieser Funktion versenkt. Solche Addierer sind nämlich weit 
verbreitet, denn schon ein einfacher Zähler ist ein Addierer...

> Woher bekomme ich diese Information aber für die automatisch
> instanziierten Addierer?
Wenn deine Timing-Constraints eingehalten werden, ist alles in Butter.

> Ich hoffe ich habe nicht zuviel durcheinander gewürfelt
Du stellst dir die Sache unnötig kompliziert vor...   ;-)

von Daniel M. (daniel__m)


Lesenswert?

VoSte schrieb:
> 1) Lässt sich in irgendeiner Form die Art des Addierers konfigurieren,
> die hier verwendet wird, oder ist das fix? Meineswissens lassen sich im
> Prinzip sowohl Arithmetische Einheiten innerhalb der Logik-Zellen als
> auch diejenigen aus den DSP-Slices verwenden... Zu welchem Ergebnis
> führt also "+"?

Grundsätzlich ja: nennt sich Constraints bzw. Attribute. Jedoch wählt 
die Synthese im Allg. die sinnvollste Lösung bezüglich 
Resourcenverbrauch und Geschwindigkeit. Sofern nur simple Addierer 
(Zähler) verwendet werden, wird sie immer FPGA-Logic verwenden und hält 
die DSP-Module für zb. Multiplikationen frei.


> 2) Ich vermute, dass die Bitbreite der Operanden einen großen Einfluss
> auf die maximale Taktfrequenz hat, insbesondere bei Verwendung der
> Arithmetik-Einheiten in den Logik-Zellen - immerhin hat man die Laufzeit
> der Carry-Bits zu beachten. Hätte ich den verwendeten Addierer nun
> selber implementiert, wüsste ich natürlich dessen Laufzeit im Verhältnis
> zur restlichen Logik. Woher bekomme ich diese Information aber für die
> automatisch instanziierten Addierer?

Das Carry-Bit ist durch die FPGA-Entwickler so ausgelegt, dass es eine 
kleinstmögliche Laufzeit aufweist (von einem Element zum nächsten im 
Picosekundenbereich). Daher geht die Bitbreite erheblich weniger in die 
Taktfrequenz ein als im Allg. gedacht. (bei meinem V6 hab ich 
64bit-Akkus, welche problemlos jenseits der 200MHz laufen; ohne 
händisches zutun). Das geht aber nur, wenn man den +-Operator verwendet. 
Die Synthese kennt den FPGA und nutzt die optimalen Resourcen. Wenn man 
jetzt (wie gerne in Hochschulen oder Unis gemacht) die Addierer manuell 
zusammenbaut, wird selten die dedizierte Carry-Chain verwendet und alles 
geht über die universellen Verbindungen und da bricht die Performance 
dann übelst ein.

Wie man an die Laufzeit-Informationen kommt hängt vermutlich stark von 
der verwendeten Toolchain ab. Ist aber eigentlich nicht notwendig, weil: 
man gibt per Constraint die Taktfrequenz an und die Toolchain versucht 
das so hinzubekommen, dass die Signale rechtzeitig am Ziel-Register 
ankommt. Schafft die Toolchain das nicht, beschwert sie sich und zeigt 
auch wo das Problem liegt.

von VoSte (Gast)


Lesenswert?

Hi!

Euch allen vielen Dank, das waren allesamt extrem hilfreiche Antworten. 
Ich hatte mir Gedanken über Kryptofunktionen gemacht, bei denen ja 
häufig relativ wenige - simple - Logikfunktionen zum Einsatz kommen - 
verknüpft über Additionen. In einer normalen Logikschaltung, wie man sie 
in der Uni bauen würde ( ;) ), wäre also das größte Delay beim Addierer 
zu erwarten - daher die Frage.

Ich bedanke mich nochmal herzlichst. Wenn ich demnächst mehr Zeit habe 
und mit dem Getüftel beginnen kann, werde ich Euch mit Sicherheit wieder 
beehren ;)

Beste Grüße!

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.