Xilinx IP zum Verzögern von Daten

Ich arbeite an einem Blockdesign, um die Koordinate in der komplexen Menge zu berechnen, die durch ein Pixel dargestellt wird. Bei einem x- und y-Pixelwert, der Schrittgröße und dem Start von x und dem Start von y muss ich eine Koordinate in der komplexen Ebene berechnen. Zum Beispielx' = start_x + step * x

Da x eine Ganzzahl ist, übergebe ich sie zuerst durch ein Gleitkomma-Konvertierungsmodul und dann durch ein verschmolzenes Gleitkomma-Multiplikationsadditionsmodul. Dies hat eine Gesamtlatenz von 24 Zyklen. Das Problem ist, dass ich am Anfang auch eine Speicheradresse angeben und 24 Zyklen später herausholen muss, bevor ich sie an das Modul weitergebe, das x' y' und die Adresse erhält. Ich suche nach einer IP, die dabei helfen kann. Das nächste, was ich gefunden habe, ist ein Schieberegister, aber ich würde 24 davon brauchen. Ich dachte daran, vielleicht einen FIFO zu verwenden. Gibt es etwas, das nur als Latenzverzögerung für Daten fungiert, während andere Berechnungen durchgeführt werden?

Geben Sie hier die Bildbeschreibung ein

PS: Ich bin mir nicht sicher, warum ich mein Fused-Mul-Add fmax genannt habe

Wie hoch ist der Durchsatz der Gleitkommakonvertierung und der fusionierten Multiplikationsaddition? Wenn es sich um 1 Berechnung pro Zyklus handelt, benötigen Sie wahrscheinlich ein Schieberegister, um die Adresse zu verzögern. Wenn es weniger ist (wie einer pro 24 Zyklen), müssen Sie wahrscheinlich nur die Adresse in einem Register speichern und Ihre Gleitkommaoperationen mit einem "Fertig" -Flag codieren, um zu signalisieren, wann die Adresse abgerufen werden soll (und möglicherweise die nächste Adresse verschoben wird). In?)
Es ist 1 pro Zyklus.
Ich mache es auf diese Weise, da ich die Daten an mein Mandelbrot-Berechnungsmodul übergeben möchte, das über eine Pipeline läuft, und ich brauche dies, um es schnell genug zu füttern.
Dann klingt es so, als bräuchten Sie ein Schieberegister. Vielleicht gibt es aber eine ressourceneffiziente Möglichkeit, es in einem BRAM oder so zu implementieren.
(Oder schauen Sie sich den Trick an, LUT RAM selbst als Schieberegister zu verwenden. IIRC Sie können ein serielles 32-Bit-Schieberegister in einer einzigen LUT erhalten.
Aber das Problem ist, ich wollte etwas, das ich in das Blockdiagramm kleben könnte.
Sie können den Code in ein Modul im Blockdesign-Wrapper einfügen, machen Sie einfach die Axi-Ports extern
Wenn Sie Ihre Designkomponenten danach auswählen, ob Sie die Komponente in Ihr Blockdiagramm einfügen können oder nicht, werden Sie vermutlich irgendwann feststellen, dass diese Designphilosophie unpraktisch ist.

Antworten (2)

Schreib einfach eins. Es sind nur ein paar Zeilen VHDL. Die Tiefe kann eine generische Natur sein, und sie kann ihre Breite von den Anschlüssen nehmen. Synthetisieren Sie es unabhängig und prüfen Sie, ob ISE/Vivado den erwarteten Schieberegistermodus in LUTs verwenden.

Wenn Sie es nicht einfach als Block verpacken können, stellt dies die Nützlichkeit des gesamten Blockdiagrammansatzes in Frage. Die meisten dieser Dinge gehen direkt auf das „Renoir“-Tool von Mentor Graphics zurück, bei dem das Umhüllen von VHDL als Block einfach war.

Es hört sich so an, als ob Sie ein Schieberegister benötigen.

Glücklicherweise können Schieberegister ziemlich effizient in Xilinx-FPGAs implementiert werden.

Aus der Kintex-7-Dokumentation.

Ein SLICEM-Funktionsgenerator kann auch als 32-Bit-Schieberegister konfiguriert werden, ohne die in einem Slice verfügbaren Flip-Flops zu verwenden. Auf diese Weise verwendet, kann jede LUT serielle Daten um 1 bis 32 Taktzyklen verzögern

Somit könnte eine 24-Zyklus-Verzögerung für eine 24-Bit-Adresse in nur 6 CLBs implementiert werden (weil es 4 LUTs in jedem SLICEM-CLB gibt). Spartan-Geräte sollten auch ähnliche Fähigkeiten haben.

In älteren Familien SRLwurde das Makro verwendet, um diese Funktionalität zu instanziieren. Ich bin mir nicht sicher, ob das für die aktuellen Produkte (Artix/Kintex/Virtex-7- oder Spartan-6-Generation) noch gilt.

Das Problem ist, dass, soweit ich das beurteilen kann, die Axi-Stream-Schieberegister nur 1 Zyklus dauern. Ich könnte 24 von ihnen hinzufügen, aber das ist ein Schmerz. Gibt es überhaupt ein Schieberegister mit einer Verzögerung von 24?
Ich habe keine Ahnung, was Axi-Stream ist oder wie er mit Xilinx-Geräten oder Xilinx-IP zusammenhängt, daher kann ich Ihnen dabei nicht helfen.
Es sieht so aus, als könnte ich das ram-basierte Schieberegister einfach für meine Zwecke verwenden, also danke.
AXI Stream ist eine Schnittstelle von ARM. Es hat FIFO-ähnliche Steuersignale.
@Paebbels, in diesem Fall ist mir nicht klar, warum OP in seinem Design nur Axi-Stream-Schieberegister verwenden kann.
Ich habe den Schaltplan-Designer in Xilinx-Produkten seit ISE 9.x nicht mehr verwendet, aber die neuen IP-Kerne sind für Drag-and-Drop-Design gemacht. Jeder Kern hat eine AXI-Schnittstelle für jeden Ein-/Ausgang. Meistens handelt es sich um AXI-Streams, sodass Operationen per Pipeline ausgeführt werden können. Ich gehe davon aus, dass es einen Verzögerungskern gibt, um Verzögerungen im schematischen Design anzupassen.
Ja, aber in einigen Fällen können Sie das Laufflächensignal ignorieren – insbesondere, wenn einem Streaming-Design ein Fifo folgt