Forum: FPGA, VHDL & Co. Altera schneller Addierer / Inkrementer?


von Mampf F. (mampf) Benutzerseite


Lesenswert?

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
von Martin O. (ossi-2)


Lesenswert?

Was machst Du denn mit dem Zählwert cntr ?

von Blechbieger (Gast)


Lesenswert?

Welcher FPGA? Welcher Speedgrade? Welche Frequenz erreichst du? Welche 
Frequenz hast du im SDC-File angegeben?

von Mampf F. (mampf) Benutzerseite


Lesenswert?

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 :)

von Pandur S. (jetztnicht)


Lesenswert?

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
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Eine Möglichkeit wäre, den Zähler in einen 4 Bit und einen 28 Bit Zähler 
aufzuteilen...

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Haben die Alteras keine DSP Slices wie die Xilinxs?

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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

von Markus F. (mfro)


Lesenswert?

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

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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?

von Mampf F. (mampf) Benutzerseite


Lesenswert?

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
von bla (Gast)


Lesenswert?

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.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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
von C. A. Rotwang (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.