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:
assign Sum = X+Y+cin;
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 + y
auch 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.
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.
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
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.
DarenW
sj755
Nur Jeff
sj755
davidcary