Verschiedene Addierer-Implementierungen

Ich baue eine ALU zusammen, die ich auf einem FPGA synthetisieren möchte. Der Carry-Look-Ahead-Addierer wird von vielen im Gegensatz zum Ripple-Carry-Addierer verwendet. Allerdings kam mir ein Gedanke. Die Ripple-Carry-Addierer, die ich zuvor zusammengestellt habe, haben einfach eine Reihe von Ein-Bit-Volladdierern, die miteinander verbunden sind. Mein Gedanke ist, was wäre, wenn ich einen 4-Bit-Volladdierer entwerfen würde? Ich spreche nicht von einem Addierer, der aus vier Ein-Bit-Volladdierern besteht. Ich spreche von einer einzelnen Komponente mit 9 Eingängen (x3,x2,x1,x0,y3,y2,y1,y0,cin). Mir ist bewusst, dass dies 512 mögliche Zustände haben würde (2 ^ (9 Eingänge)).

Was ich mich frage ist:

  1. Es wird offensichtlich eine große Anzahl von Toren verwendet werden, ist es das wert?
  2. Wenn ich alle meine Komponenten mit NAND-Gattern mit einer bestimmten Verzögerung oder all dem implementieren würde, wie viel Geschwindigkeitsverbesserung würde eine 32-Bit-Version mit a.) 4-Bit-Volladdierern b.) CLA-Addierern c. ) 1-Bit Volladdierer
  3. Gibt es eine andere Implementierung eines Addierers, die mir nicht bekannt ist.
  4. Obwohl ein Addierer ein sehr untergeordneter Teil einer ALU ist, wofür entscheiden sich die meisten Digitaldesigner tatsächlich? Oder verwenden sie einfachassign Sum = X+Y+cin;
Sie möchten Staaten als 2^9 und nicht als 9^2 zählen. Das ist 512.
@ DarenW Du hast Recht, ich bin mir nicht sicher, was ich mir dabei gedacht habe ...
interessant. Ich würde vermuten, dass Ihr benutzerdefiniertes 4-Bit-Slice am Ende 4 Ein-Bit-Volladdierern mit einer Carry-Look-Ahead-Schaltung ähneln würde, aber möglicherweise nicht. Hier ist die Sache – es müsste sicherlich nicht komplexer sein. Interessant ist jedoch die Frage, ob man über 4x Full Add + 4bit CLA optimieren könnte.
@JustJeff Der Hauptgrund für diese Implementierung ist, dass die Signale in einem 4-Bit-Volladdierer nur zwei Gatterebenen anstelle der etwa 8 Gatter durchlaufen müssten, die für 4 Ein-Bit-Volladdierer erforderlich sind. Es wäre eine 4-fache Beschleunigung. Und ich bin mir sicher, dass ein 4-Bit-Volladdierer einen 4-Bit-CLA-Addierer übertreffen würde. Auch hier sind es nur zwei Ebenen.

Antworten (4)

Um Nr. 4 zu beantworten, wird ein Addierer zumindest in Code, der für die Synthese vorgesehen ist, normalerweise als codiert assign sum = x + y. Dies überlässt die Wahl, wie der Addierer zu implementieren ist, dem Synthesewerkzeug. Es gibt einen Kompromiss zwischen Kosten und Leistung. Ohne strenge Leistungsanforderungen implementiert das Tool einen Ripple-Carry-Addierer, da dieser die niedrigsten Kosten hat. Wenn es aggressivere Leistungsanforderungen gibt, implementiert das Tool eine ausgefeiltere Struktur, was zu zusätzlichen Kosten führt. Eine weitere Möglichkeit für die FPGA-Synthese besteht darin, dass der Addierer auf eine spezielle DSP-Komponente abgebildet wird, falls im Zielgerät verfügbar.

Wenn maximale Leistung erwünscht ist, wird die Logik eher von Hand entworfen als mit einem Synthesetool implementiert. In diesem Fall gäbe es zusätzlich zu einem High-Level-Referenzmodell mit der Form sum = x + yauch eine Low-Level-Beschreibung, die die einzelnen Gates oder Transistoren beschreibt (dies könnte in einem HDL oder in einem schematischen Tool erfolgen). Dieses „Maximalleistungs“-Szenario wäre mit ziemlicher Sicherheit eher eine ASIC-Implementierung als ein FPGA.

Um Nr. 3 (nicht wirklich) zu beantworten, für mehr, als Sie jemals über Addiererarchitekturen wissen wollten, habe ich diese These gefunden, die von einem Thread auf edaboard verlinkt wurde: http://www.iis.ee.ethz.ch/~zimmi/publications /adder_arch.pdf .

Um Nr. 1 und Nr. 2 zu beantworten, ist der beste Weg, solche Dinge herauszufinden, ein paar Experimente durchzuführen, alles andere ist Spekulation. Was Sie für das Design "4-Bit-Volladdierer" erhalten, hängt davon ab, wie Sie es codieren. Wenn Sie es als Addierer codieren, wird das Tool wahrscheinlich das tun, was es sowieso getan hätte, obwohl es möglicherweise nicht erkennt, dass die 4-Bit-Addierer zusammen einen größeren Addierer bilden. Wenn Sie es als Logikfunktion codieren, erhalten Sie möglicherweise etwas schneller als die Ripple-Carry-Implementierung, aber möglicherweise nicht.

Ich danke dir sehr. Das war ein ausgezeichneter Artikel, den Sie gezogen haben. Ich denke, ich könnte den 4-Bit-Volladdierer genauso gut vergessen. Ich wusste irgendwie, dass es zu weit hergeholt war. Trotzdem wäre es schön, eine Verilog-Datei für so etwas zu haben. Trotzdem danke für die Hilfe...
Ich würde vorschlagen, den Ausdruck "Wenn es eine minimale Leistungsbeschränkung gibt ..." durch "Abwesende strenge Leistungsanforderungen ..." zu ersetzen. Ansonsten ist beim ersten Lesen unklar, ob die Einschränkungen minimal sind oder ob die Einschränkungen ein Mindestleistungsniveau angeben.

Was Sie nicht tun möchten, ist, den Addierer selbst aus den Toren zu implementieren. Verwenden Sie die Funktionen von VHDL/Verilog zum Hinzufügen von Zahlen. Jeder von Ihnen erstellte Addierer ist größer und langsamer als alles, was der VHDL/Verilog-Compiler leisten kann.

Der Grund dafür ist einfach: FPGAs haben eine dedizierte Logik in sich, um Addierer mit einem Minimum an Logik und so schnell wie möglich auszuführen. Dazu gehören spezielle Carry-Chain-Logik und Routing. Wenn Sie den Compiler diese verwenden lassen, profitieren Sie von den Dingen, die bereits im FPGA enthalten sind. Mit anderen Worten, machen Sie einfach Sum=X+Y+cin, wobei X und Y Mehrbitzahlen sind.

Woher ich das sicher weiß. Letztendlich hängt dies von der Anzahl der verwendeten LUTs ab. Wissen Sie sicher, dass die Synthesizer von Xilinx oder Altera einen besseren Job machen als eine echte Strukturbeschreibung? Ich bin mir sicher, dass sie hervorragende Arbeit leisten, aber das ist eher eine Kuriosität für mich.
@ seljuq70 Es gibt viele Möglichkeiten, dies zu analysieren, aber letztendlich läuft es darauf hinaus, entweder "blind" darauf zu vertrauen, was der Compiler tut, selbst etwas auszuprobieren oder die Compilerausgabe zu analysieren, um zu sehen, was er tut (a.la. Xilinx FPGA-Editor). Ich habe genug Trial-and-Error gemacht, um zu wissen, dass der Compiler die dedizierte Carry-Chain-Logik richtig verwendet. Außerdem ist es nicht nur ein Problem mit der LUT-Nutzung, sondern auch ein Geschwindigkeitsproblem. Aufgrund der dedizierten Logik und des Routings für die Übertragskette kann diese Lösung viel schneller sein als eine reine LUT-Lösung.
Es ist wie bei Software-Compilern; Optimierende Compiler waren vor zwanzig Jahren zweifelhaft, aber heute sind sie ziemlich gut. Wenn es optimale Lösungen für die Logik gibt, liegt es auf der Hand, dass die Hardware-Compiler sie wahrscheinlich bereits verwenden.
@JustJeff Genau! Um eine gute FPGA-Logik zu entwerfen, müssen Sie wissen, was dem Compiler sicher überlassen werden kann und was wir manuell tun müssen. Leider ist das ein bewegliches Ziel und erfordert Erfahrung, um es herauszufinden.

Schreiben Sie einfach lesbaren Code (für andere oder für sich selbst in zwei Wochen :)

 a <= b+c;

Vertrauen Sie dem Synthesizer, bis das bewiesen ist

  • es tut nicht, was du willst
  • und Sie erreichen Ihre Bereichs-, Zeit- oder Leistungsziele nicht.

Alles andere ist verfrühte Optimierung.

Dann, und nur dann, versuchen Sie, die Dinge zu verbessern. Aber zumindest haben Sie zu diesem Zeitpunkt bereits eine vollständige Testbench der "einfachen" Option (das haben Sie, bevor Sie mit der Optimierung beginnen, nicht wahr? :).

Ich zweite, dass Ihr Tool Addition wahrscheinlich besser implementieren wird als Sie.

Was verschiedene Arten von Kreuzottern betrifft, siehe Hennessy und Patterson, IIRC 3. Ausgabe (jede Ausgabe ist ein völlig anderes Buch!).

Eine Möglichkeit, die Addition zu beschleunigen, besteht darin, einen Ripple-Addierer zu verwenden, aber NICHT in jedem Schritt vollständig zu addieren: Jede Addition erzeugt ein Summen- und Übertragsergebnis, und der Übertrag durchläuft bei jeder Addition eine Stufe. Sehr nützlich für die Implementierung von Multiplikationen.

Hennessy und Patterson, „Computerorganisation und -design: Die Hardware/Software-Schnittstelle.“? Oder Hennessy und Patterson, "Computerarchitektur: ein quantitativer Ansatz."?