Forum: FPGA, VHDL & Co. Mappen versagt, weil Summationen nicht getaktet sind (?)


von Jan (Gast)


Lesenswert?

Wieder mal ein seltsames Xilinx-Verhalten:

Ich möchte diesen hier genannten Halbbandfilter bauen und habe zum 
Testen ein 64 wort Array mit 64 festen Koeffizienten statisch 
multipliziert.

Erg01 = Wert01 * Koeff01
Erg02 = Wert02 * Koeff02
...
Erg64 = Wert64 * Koeff64

Beim Summieren kann ich freilich nicht alle 64 Ausgänge in einem Schlag 
abarbeiten, daher habe ich es in einem binären Baum mit jeweils 4 
Additionen versucht:

Summe01_04 = Erg01 + Erg02 + Erg03 + Erg04;
Summe05_08 = Erg05 + Erg06 + Erg07 + Erg08;
...
Summe61_64 = Erg61 + Erg62 + Erg63 + Erg64;

Das ganze dann nochmals um dann am Ende eine Summe zu bekommen.

Das will Xilinx nicht mappen, weil es angeblich nicht in die 
DSP48-Elemente passt.

(die Summation lag auf der Top-Ebene ohne Prozess)

Komisch:

Wenn ich denselben Code in einen Prozess packe, wodurch der die 
einzelnen Stufen pipelinen muss, und es nicht mehr selber verteilen 
kann, routet er das Design ohne Kommentar und ohne Probleme.

Im Gegenteil: "Grüner" geht es gar nixcht mehr!

Woran kann das liegen?

Irgendwie scheint er zu versuchen, einen Teil der Summation in den Adder 
des DSP-Elements zu schieben.

?

von Jan (Gast)


Lesenswert?

Ach so, dieses Filter war gemeint:
Beitrag "Re: FFT-Berechung abkürzen"

von Christian R. (supachris)


Lesenswert?

Du kannst die Verwendung der DSP48 Blöcke deaktivieren, dann gehts 
vielleicht auch rein kombinatorisch. Normal steht das meines Wissens auf 
"Auto".

von Jan (Gast)


Lesenswert?

Ich will sie je nehmen, aber "er" nicht :-)

von Fetz (Gast)


Lesenswert?

Poste mal den VHDL-Code, dann kann man dir weiterhelfen ...

von Christian R. (supachris)


Lesenswert?

Ich denke, wenn du einen getakteten Prozess draus machst, klappts und er 
nimmt die DSP48 Einheiten? Ein DSP48 kann ja nur 2 Summanden 
verarbeiten, vielleicht solltest du das umschreiben, dass immer nur 2 
pro Stufe verarbeitet werden.

von Simon (Gast)


Lesenswert?

Ich denke, das Problem ist, dass du ohne den Prozess deinen kompletten 
Addiererbaum in einem Takt abgearbeitet haben möchtest (kombinatorisch). 
Der kombinatorische Pfad wird sehr lang, bei in Filtern üblichen 
Datenbreiten erst recht.
Deine Additionen mit 4 Koeffizienten werden von xst auch noch einmal zu 
bäumen aus binären addieren synthetisiert.

Ohne Pipelining wird es nicht gehen. Wenn du keine DSP48 verwenden 
möchtest und auf Virtex5/6 oder Spartan6 arbeitest könnte das hier für 
dich interessant sein:

http://myfpgablog.blogspot.com/2011/10/ternary-adder-in-lut62.html

von Ralf (Gast)


Lesenswert?

Simon schrieb:
> Deine Additionen mit 4 Koeffizienten werden von xst auch noch einmal zu
>
> bäumen aus binären addieren synthetisiert.

Das hat aber nichts damit zu tun, dass er es nicht mappen kann. Ich 
tippe eher darauf, dass Du keine eindeutige Strategie festgelegt hast 
bez Area / Speed. Üblicherweise steht das defaultmässig auf balanced, 
was dazu führt, dass er bei einer kleinen Designänderung schon mal 
schnell an die Chipgrenzen kommt.

Wenn da mehr getaktet wird, dann stellt er gfs mehr auf timing 
orientiert und kann irgendwas später nicht mehr reduzieren.

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.