mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Mampf F. (mampf) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Martin O. (ossi-2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was machst Du denn mit dem Zählwert cntr ?

Autor: Blechbieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher FPGA? Welcher Speedgrade? Welche Frequenz erreichst du? Welche 
Frequenz hast du im SDC-File angegeben?

Autor: Mampf F. (mampf) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Joggel E. (jetztnicht)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
Haben die Alteras keine DSP Slices wie die Xilinxs?

Autor: Christoph db1uq K. (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph db1uq K. (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mampf F. (mampf) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: bla (Gast)
Datum:

Bewertung
2 lesenswert
nicht 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.

Autor: Mw E. (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: C. A. Rotwang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.