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