Forum: FPGA, VHDL & Co. Summe eines Arrays effizient berechnen


von Mike (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Gast (Gast)


Lesenswert?

genau! Wenn er nämlich einen binären Baum baut, der zudem noch getaktet 
ist und mehrfach Register erfordert, braucht er sicher 10-20 Takte. Da 
kann schon 20 Werte im array prozessieren und bei Bearf 3-4 lines 
einrichten.

von Mike (Gast)


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

von Jan M. (mueschel)


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.

von Gast (Gast)


Lesenswert?

Auch wenn jeweils immer ein neuer Wert hinzukommt, bleibt die 
Betrachtung bez de Latenz bestehen. Du bekommst immer nach jedem Takt 
ein neues Ergebnis. Du benötigst dann eben n Additionsstufen - entweder 
transversal als paralleler adder oder longitudinal als 
vollsummenaddierer.

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.