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:
- Es wird offensichtlich eine große Anzahl von Toren geben, ist es das wert?
- 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
- Gibt es eine andere Implementierung eines Addierers, die mir nicht bekannt ist?
- Obwohl ein Addierer ein sehr untergeordneter Bestandteil einer ALU ist, was tun die meisten digitalen Designer tatsächlich? Oder benutzen sie einfach
assign Sum = X+Y+cin;
fpga
verilog
speed
optimization
sj755
quelle
quelle
Antworten:
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 + y
auch 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.
quelle
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
Schreiben Sie einfach lesbaren Code (für andere oder für sich selbst in zwei Wochen :)
Vertrauen Sie dem Synthesizer, bis dies bewiesen ist
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? :).
quelle
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.
quelle