Summe eines Arrays effizient berechnen

Gast #1313562
Lesenswert?

Hallo,

ich mache mir gerade Gedanken über ein triviales Problem und dessen 
Lösung in VHDL. Bevor ich das selbst implementiere wollte ich mal 
fragen, ob es dazu vielleicht schon vorhandene Implementierungen gibt.

Folgendes:
Ich habe ein Array von unsigned-Datentypen, dessen Summe ich gerne 
berechnen würde. Ich denke, dies wird wohl am Effizientesten durch einen 
Addierbaum zu lösen sein mit Tiefe log(Array-Länge), oder?
Um einen maximalen Takt zu bekommen, würde ich die einzelnen Ebenen 
jeweils durch eine Registerstufe voneinander trennen, also eine Pipeline 
daraus machen.

Dazu meine Fragen:
- Gibt es eine noch bessere, effizientere Alternative (Latenz egal)?
- Gibt es dafür VHDL-Generatoren (Cores)?

Danke,
Mike
Moderator (Firma: Titel) Persönliche Seite #1313571
Lesenswert?

> Ich denke, dies wird wohl am Effizientesten durch einen
> Addierbaum zu lösen sein mit Tiefe log(Array-Länge), oder?
Das braucht einiges an Ressourcen und Verdrahtung...

> Gibt es eine noch bessere, effizientere Alternative (Latenz egal)?
Effizient in Bezug auf was?
Geschwindigkeit, Platz, Ressourcen, Leistungsverbrauch...

Wie groß ist das Array (BxT)?
Wie kommen die Daten in das Array?

Wenn die Laufzeit egal ist, dann würde ich (auch in Hinsicht auf 
Realisierbarkeit/Portierbarkeit) einfach mit einem Adresszähler durch 
das Array donnern, und dann pro Takt einen Wert aufsummieren.
Gast #1313802
Lesenswert?

Hallo,

das habe ich vergessen zu erwähnen: Das Array ist selbst Bestandteil 
einer Pipeline, d. h. mit jedem Takt wird das Array mit neuen 
unsigned-Werten gefüllt. Array-Größe ist egal, ich sage einfach mal 10 
Worte je 8 Bit.

> Wenn die Laufzeit egal ist, dann würde ich (auch in Hinsicht auf
Realisierbarkeit/Portierbarkeit) einfach mit einem Adresszähler durch
das Array donnern, und dann pro Takt einen Wert aufsummieren.

Ja, wäre auch eine Idee. Nur müsste ich das dann in einer Array-Bank mit 
Zeigern realisieren, da das Array ja mit jedem Takt neu gefüllt wird.

Ich denke, dass der Addierbaum mit Registerstufen die beste Lösung 
darstellt in Bezug auf Einfachheit und hohe Taktrate, oder?

Gruß,
Mike
#1313827
Lesenswert?

In Sachen Taktrate und Latency sowie dem Fakt, dass in jedem Takt neue 
Daten verarbeitet werden können, ist ein Binärbaum wohl die beste 
Lösung. Die Größe der Logik dürfte jedoch vergleichsweise hoch sein - 
aber bei nur 10 Wörtern mit je 8 Bit brauchst du dir da noch keine 
Gedanken machen.

I.d.R. sollte es für aktuelle Bausteine auch kein Problem sein, mehr als 
2 Wörter in einem Takt zu addieren, Vierfach-Addierer sind meist auch 
noch hinreichend schnell, man muss nur auf die Klammersetzung achten:

e <= a + b + c + d; ist langsamer als e <= (a+b)+(c+d);, da einmal eine 
Kette von drei Addieren, einmal ein Binaerbaum aufgebaut wird.

Ich habe hier z.B. einen 16fach 16Bit Addierer, der nur zwei Takte 
Latency hat und im Virtex4 und Lattice ECP2 noch mit deutlich über 120 
MHz taktet.

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