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!
du kannst in VHDL ohne Weiteres zwei Vektoren (Bitanordnungen) mit dem operator "+" addieren und damit einen Summenvektro erhalten.
> 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.
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... ;-)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.