Altera schneller Addierer / Inkrementer?

OP Persönliche Seite #5410153
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
OP Persönliche Seite #5411085
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 :)
Gast #5411107
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.
(Firma: fritzler-avr.de) #5411482
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 ;)
Gast #5411805
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren