Verschiedene Addierer-Implementierungen

7

Ich stelle eine ALU zusammen, die ich auf einem FPGA synthetisieren möchte. Der Carry-Look-Ahead-Addierer ist derjenige, den viele im Gegensatz zum Ripple-Carry-Addierer verwenden. Ein Gedanke kam mir jedoch in den Sinn. Die Ripple-Carry-Addierer, die ich zuvor zusammengestellt habe, haben einfach eine Reihe von Ein-Bit-Volladdierern, die miteinander verbunden sind. 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). Ich bin mir 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 geben, 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 stark würde sich die Geschwindigkeit in einem 32-Bit-System verbessern, wenn a.) 4-Bit-Volladdierer b.) CLA-Addierer c. ) 1-Bit-Volladdierer
  3. Gibt es eine andere Implementierung eines Addierers, die mir nicht bekannt ist?
  4. Obwohl ein Addierer ein sehr untergeordneter Bestandteil einer ALU ist, was tun die meisten digitalen Designer tatsächlich? Oder benutzen sie einfachassign Sum = X+Y+cin;
sj755
quelle
3
Sie möchten Zustände als 2 ^ 9 und nicht als 9 ^ 2 zählen. Das ist 512.
DarenW
@ DarenW Sie haben Recht, nicht sicher, was ich dachte ...
sj755
interessant. Ich würde vermuten, dass Ihr benutzerdefiniertes 4-Bit-Slice 4 Ein-Bit-Volladdierern mit einer Carry-Look-Ahead-Schaltung ähnelt, aber möglicherweise nicht. Hier ist die Sache - es müsste sicherlich nicht komplexer sein. Die Frage, ob Sie mehr als 4x Full Add + 4bit CLA optimieren können, ist jedoch interessant.
JustJeff
@JustJeff Der Hauptgrund für diese Implementierung ist, dass bei einem Vier-Bit-Volladdierer die Signale nur zwei Ebenen von Gates durchlaufen müssten, anstatt der etwa acht Gates, die für 4 Ein-Bit-Volladdierer erforderlich sind. Es wäre eine 4-fache Beschleunigung. Und ich bin sicher, dass ein 4-Bit-Volladdierer einen 4-Bit-CLA-Addierer übertreffen würde. Auch hier sind es nur zwei Ebenen.
sj755

Antworten:

4

Um # 4 zu beantworten, wird ein Addierer zumindest in Code, der für die Synthese bestimmt ist, normalerweise als codiert assign sum = x + y. Dies überlässt die Wahl, wie der Addierer implementiert werden soll, dem Synthesewerkzeug. Es gibt einen Kosten-Leistungs-Kompromiss. Ohne strenge Leistungsanforderungen implementiert das Tool einen Ripple-Carry-Addierer, da dies die niedrigsten Kosten verursacht. Wenn aggressivere Leistungsanforderungen bestehen, implementiert das Tool mit einigen zusätzlichen Kosten eine komplexere Struktur. Eine andere Möglichkeit für die FPGA-Synthese besteht darin, dass der Addierer einer speziellen DSP-Komponente zugeordnet wird, sofern diese auf dem Zielgerät verfügbar ist.

Wenn maximale Leistung gewünscht wird, wird die Logik von Hand entworfen und nicht mit einem Synthesewerkzeug implementiert. In diesem Fall würde es zusätzlich zu einem Referenzmodell auf hoher Ebene mit dem Formular sum = x + yauch eine Beschreibung auf niedrigerer Ebene geben, die die einzelnen Gatter oder Transistoren beschreibt (dies könnte in einer HDL oder in einem schematischen Werkzeug erfolgen). Dieses Szenario mit "maximaler Leistung" wäre mit ziemlicher Sicherheit eher eine ASIC-Implementierung als ein FPGA.

Um (nicht wirklich) Antwort 3 zu geben, fand ich diese These, die mehr als Sie jemals über Addiererarchitekturen wissen wollten, aus einem Thread auf edaboard verlinkt: http://www.iis.ee.ethz.ch/~zimmi/publications /adder_arch.pdf .

Um # 1 und # 2 zu beantworten, ist der beste Weg, solche Dinge herauszufinden, einige 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 sowieso das tun, was es getan hätte, obwohl es möglicherweise nicht herausfindet, 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.

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

Was Sie nicht tun möchten, ist, den Addierer selbst aus den Toren heraus 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 tun kann.

Der Grund dafür ist einfach: FPGAs verfügen über eine dedizierte Logik, um Addierer mit einem Minimum an Logik und so schnell wie möglich zu erstellen. Dies beinhaltet spezielle Übertragungskettenlogik 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.


quelle
Woher weiß ich das sicher? Letztendlich hängt dies mit der Anzahl der verwendeten LUTs zusammen. Wissen Sie, dass die Xilinx- oder Altera-Synthesizer einen besseren Job machen als eine echte Strukturbeschreibung? Ich bin mir sicher, dass sie hervorragende Arbeit leisten, aber das ist für mich eher eine Kuriosität.
sj755
@ seljuq70 Es gibt viele Möglichkeiten, dies zu analysieren, aber letztendlich kommt es darauf an, entweder "blind" zu vertrauen, was der Compiler tut, selbst zu versuchen und Fehler zu machen oder die Compilerausgabe zu analysieren, um zu sehen, was er tut (a.la. Xilinx FPGA-Editor). Ich habe genug Versuche und Irrtümer durchgeführt, um zu wissen, dass der Compiler die dedizierte Übertragskettenlogik ordnungsgemäß verwendet. Außerdem handelt es sich nicht nur um ein LUT-Nutzungsproblem, sondern auch um 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.
1
Es ist wie bei Software-Compilern. Vor zwanzig Jahren war die Optimierung von Compilern zweifelhaft, aber heute sind sie ziemlich gut. Es liegt auf der Hand, wenn es optimale Lösungen für die Logik gibt, die Hardware-Compiler verwenden sie wahrscheinlich bereits.
JustJeff
@ JustJeff Genau! Um eine gute FPGA-Logik zu entwerfen, muss man wissen, was der Compiler sicher noch tun kann und was wir manuell tun müssen. Leider ist das ein bewegliches Ziel und erfordert Erfahrung, um es herauszufinden.
4

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

 a <= b+c;

Vertrauen Sie dem Synthesizer, bis dies bewiesen ist

  • es macht nicht was du willst
  • und Sie erfüllen nicht Ihre Gebiets-, Zeit- oder Leistungsziele.

Alles andere zu tun ist vorzeitige Optimierung.

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

Martin Thompson
quelle
0

Ich bin der Meinung, dass Ihr Tool das Hinzufügen wahrscheinlich besser implementieren wird als Sie.

Überprüfen Sie für verschiedene Arten von Addierern 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, der jedoch NICHT in jedem Schritt vollständig addiert wird: Jede Addition erzeugt ein Summen- und Übertragsergebnis, und der Übertrag kräuselt sich bei jeder Addition um eine Stufe. Sehr nützlich für die Implementierung der Multiplikation.

Wouter van Ooijen
quelle
Hennessy und Patterson, "Computerorganisation und -design: Die Hardware / Software-Schnittstelle"? Oder Hennessy und Patterson, "Computerarchitektur: ein quantitativer Ansatz"?
Davidcary