Guten Abend, in einem Projekt hab ich einen simplen 32Bit Counter ´ala ctr <= ctr + 1; mit ctr : unsigned(31 downto 0). Es scheint so, als würde der Addierer / Inkrementer recht lange brauchen, was meine maximale Taktfrequenz runter zieht. Hat jemand eine Idee, wie man das beschleunigen könnte? Vielen Dank! Mampf
:
Bearbeitet durch User
Welcher FPGA? Welcher Speedgrade? Welche Frequenz erreichst du? Welche Frequenz hast du im SDC-File angegeben?
Hat sich erledigt ... Hab den Counter woanders in die State-Machine gepackt, wo dann ein paar Taktzyklen Zeit ist, bis er wieder gebraucht wird :) Ich muss zwar vom Endergebnis noch 1 abziehen, aber das glaube schaffe ich :)
Nun ja, ein Synchroner 32 bit Counter ist etwas Handfestes... Bis der Carry durchgeroutet ist, dauert es. Der Zaehler wird mit jedem Bit weiger schneller. Benoetigst du tatsaechlich 32 bit ? Synchron ? Passen 28 bit auch ? Allenfalls 24 bit ?
:
Bearbeitet durch User
Eine Möglichkeit wäre, den Zähler in einen 4 Bit und einen 28 Bit Zähler aufzuteilen...
in TTL-Technik gab es die Addierer mit "lookahead-carry" 74F182 und dazu einen 4-Bit-Zähler 74F283 oder so ähnlich https://en.wikipedia.org/wiki/Carry-lookahead_adder
Quartus verwendet selbständig Carry Look-Ahead Addierer (wenn man es lässt). Ansonsten kann man auch lpm_add_sub-Primitive verwenden oder den Addierer hier abschreiben: https://www.altera.com/support/support-resources/design-examples/design-software/vhdl/v_cl_addr.html
Wie schafft es Analog Devices in ihren DDS, eine 32bit-Addition in 1/500MHz auszuführen und abzuspeichern? Und das sind keine einfachen +1 Aufwärtszähler sondern beliebige Additionen. Mit pipelining kann man da nicht arbeiten. Haben die intern noch einen schnelleren Takt oder geht das rein asynchron über Laufzeiten?
Christoph K. schrieb: > Wie schafft es Analog Devices in ihren DDS, eine 32bit-Addition in > 1/500MHz auszuführen und abzuspeichern? Und das sind keine einfachen +1 > Aufwärtszähler sondern beliebige Additionen. Mit pipelining kann man da > nicht arbeiten. Haben die intern noch einen schnelleren Takt oder geht > das rein asynchron über Laufzeiten? Vermutlich genauso wie es CPUs mit >500MHz können ... Die werden dafür hardware-Addierer in den üblichen DSP-Bitbreiten (DSP-Blöcke) haben, die instanziiert werden können :)
:
Bearbeitet durch User
Mampf F. schrieb: > Christoph K. schrieb: >> Wie schafft es Analog Devices in ihren DDS, eine 32bit-Addition in >> 1/500MHz auszuführen und abzuspeichern? Und das sind keine einfachen +1 >> Aufwärtszähler sondern beliebige Additionen. Mit pipelining kann man da >> nicht arbeiten. Haben die intern noch einen schnelleren Takt oder geht >> das rein asynchron über Laufzeiten? > > Vermutlich genauso wie es CPUs mit >500MHz können ... Die werden dafür > hardware-Addierer in den üblichen DSP-Bitbreiten (DSP-Blöcke) haben, die > instanziiert werden können :) Und zwischen den (nichtexisteirenden) LUTs sind keine unnötigen konfigurierbaren Routing-Strukturen, so wie sie im FPGA existieren.
Also selbst der Xilinx Spartan3 hatte schon eine dedizierte Carry Chain fürs schnellere addieren. Einen Carry Lookahead Adder selber zu bauen war am Ende langsamer, weil dann alles über das Routing musste. Alle Werte für die maximale Signalverzögerung für Spartan3E500-5 Carrychain adder (einfach + nehmen): 7,887ns Ripple Carry Adder selbergebaut (nutzt dann nicht die Hardwarechain): 11,711ns Carry Lookahead Adder selbergebaut: 12,337ns Conditional Sum Adder selbergebaut: 10,931ns edit: das wichtigste fehlt ja noch! 8Bit breit mit ci und co ;)
:
Bearbeitet durch User
Mampf F. schrieb: > Hat sich erledigt ... Hab den Counter woanders in die State-Machine > gepackt, wo dann ein paar Taktzyklen Zeit ist, bis er wieder gebraucht > wird :) Es hiess mal dass sich manche Synthesetools schwer mit zählern tun, die direkt in einer FSM beschrieben sind, besser wäre eine Zählprocess ausserhalb der FSM-Beschreibung und die FSM schickt nur das "counter enable". Und binäre codierung ist nur eine mögliche Variante von vielen einen Zähler aufzubauen. Gray codierung etc.. Hier wäre vielleicht zu überlegen, ob man die öberen 4 bits mit einem 16 bit (Ring-)Schiebregister zählt, dann muss man nur aus 28 bit das carry ableiten und als shift enable verwenden. Das Verfahren liesse sich auchauf die anderen Halfbytes übertragen und der 32 bit counter durch 8*16bit schieberegister ersetzen. Falls man das Zählergbniss binär in einem 32 bit register auslesen will, käme natürlich noch eine Decodierlogik ninzu. Deutlich mehr "Fläche" auf dem FPGA benutzt für eine schneller Taktung. Vielleicht musste auch nur die Optimierungsoption von "area" oder "balanced" auf "speed" stellen. Oder mit anderen "Compiler-tricks" arbeiten.
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.