Forum: FPGA, VHDL & Co. Xilinx FFT IP-CORE wie ansteuern?


von Hohewart (Gast)


Lesenswert?

Ich möchte ein älteres Schaltungsdesign auf Basis eines Spartan (ISE 
Projekt) auf einen Kintex umstellen und Vivado verwenden. Kann es sein, 
dass es die FFT-IP von Xilinx nur noch als AXI-Version gibt? Oder lässt 
sich das irgendwie umgehen? Und wie schließe ich die IP funktionell an?

Abgesehen, dass ich mit dem Config-Anschluss nichts anfangen kann, weil 
ich das nicht brauche, ist mir nicht klar, was der AXI-Bus dort soll. 
Die FFT wurde bisher im Stream-Mode benutzt und mit jedem Takt ein Datum 
eingeschoben. Nach etwas Delay kam dann das Ergebnis lückenlos heraus.

Das ist jetzt nicht mehr so, nehme ich an. Wenn angenommen der Core 
einmal eine Weile nicht ready sein sollte, müsste ich den Datenstrom 
unterbrechen. Das kann ich aber nicht, weil er von einem Sample-ADC 
kommt, der mit maximaler Geschwindigkeit >333MHz anliefert. Muss ich 
einen Puffer-FIFO vorschalten? Wie groß muss der sein? Das Datenblatt 
sagt leider nichts dazu.

Kann ich wenigstens annehmen, dass die Daten lückenlos wie bisher heraus 
gelangen, oder sind dort auch Pausen zu erwarten?

Ich würde ungern irgendwelche FIFOs benutzen von denen ich nicht sicher 
sagen kann, dass sie funktionieren, weil sie groß genug sind. Wenn keine 
Aussage zu treffen ist, kann ich formell nicht nachweisen, dass es immer 
klappt.

Außerdem ergibt sich ein Problem mit der Taktgeschwindigkeit: Angenommen 
das Ready ist zu 10% und markiert längere Rechenpausen, dann muss der 
FIFO und die FFT dahinter mit vlt. 10% mehr Tempo arbeiten, was mir 
unnötig die Taktfrequenzanforderung des FPGA nach oben treibt. Es ginge 
dann schon in Richtung 370MHz und das Design ist für 350 
sicherheitsspezifiziert.

von Fpgakuechle K. (Gast)


Lesenswert?

Hohewart schrieb:

> Die FFT wurde bisher im Stream-Mode benutzt und mit jedem Takt ein Datum
> eingeschoben. Nach etwas Delay kam dann das Ergebnis lückenlos heraus.
>
> Das ist jetzt nicht mehr so, nehme ich an.

Worauf gründet sich Deine Annahme? Axi gibt es auch als Streamfähiges 
Interface.

https://www.kampis-elektroecke.de/2020/04/axi-stream-interface/
https://www.xilinx.com/content/dam/xilinx/support/documentation/ip_documentation/axis_interconnect/v1_1/pg035_axis_interconnect.pdf

> Ich würde ungern irgendwelche FIFOs benutzen von denen ich nicht sicher
> sagen kann, dass sie funktionieren, weil sie groß genug sind. Wenn keine
> Aussage zu treffen ist, kann ich formell nicht nachweisen, dass es immer
> klappt.

Man kann eine Aussage über die Größe eine Fifo durch simulation 
derselben ableiten.Und man kann/muß ohnehin eine Fehlerbehandlung (bspw. 
Fifo-restart) vorsehen wenn die Datenkonsistenz nicht gewährleistet ist, 
beispielsweise an den full/empty flags erkennbar.
Oder man schaut im map/Synthese-log nach, was an FIFO-Makros eingebaut 
wurde, vielleicht hilft das tcl-command 'report_utilization'.

von Hohewart (Gast)


Lesenswert?

Fpgakuechle K. schrieb:
> Worauf gründet sich Deine Annahme? Axi gibt es auch als Streamfähiges
> Interface.

Aber auch das hat doch ein handshaking mit Berücksichtigung des 
Ready-signals des Slaves und der FFT-Core ist ein solcher. Das Streaming 
habe ich auch vorliegen, meine ich:
1
COMPONENT xfft_nrz_screen
2
  PORT (
3
    aclk : IN STD_LOGIC;
4
    s_axis_config_tdata     : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
5
    s_axis_config_tvalid    : IN STD_LOGIC;
6
    s_axis_config_tready    : OUT STD_LOGIC;
7
    s_axis_data_tdata       : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
8
    s_axis_data_tvalid      : IN STD_LOGIC;
9
    s_axis_data_tready      : OUT STD_LOGIC;
10
    s_axis_data_tlast       : IN STD_LOGIC;
11
    m_axis_data_tdata       : OUT STD_LOGIC_VECTOR(63 DOWNTO 0);
12
    m_axis_data_tvalid      : OUT STD_LOGIC;
13
    m_axis_data_tready      : IN STD_LOGIC;
14
    m_axis_data_tlast       : OUT STD_LOGIC;
15
    event_frame_started : OUT STD_LOGIC;
16
    event_tlast_unexpected : OUT STD_LOGIC;
17
    event_tlast_missing : OUT STD_LOGIC;
18
    event_status_channel_halt : OUT STD_LOGIC;
19
    event_data_in_channel_halt : OUT STD_LOGIC;
20
    event_data_out_channel_halt : OUT STD_LOGIC
21
  );
22
END COMPONENT;

Daten waren als 16 Bit IN und 27 Bit OUT definiert, sind nun irgendwie 
in dem AXI32/64 verpackt worden, nehme ich an. Ich gehe davon aus, dass 
die Bandbreite berücksichtigt wurde. Auch so ein schlecht handhabbarer 
Faktor.

von Hohewart (Gast)


Lesenswert?

Fpgakuechle K. schrieb:
> Man kann eine Aussage über die Größe eine Fifo durch simulation
> derselben ableiten.
Hängt aber von dem Verhalten des Models ab und ob man jeweils dadurch 
eine sichere Aussage erhält, sehe ich nicht als belastbar, da von den 
Randbedingungen abhängig.

> Und man kann/muß ohnehin eine Fehlerbehandlung (bspw.
> Fifo-restart) vorsehen wenn die Datenkonsistenz nicht gewährleistet ist,
Das kommt auch noch dazu.

Eventuell noch dies als Ergänzung: Die FFT wurde absichtlich zum 
damaligen Zeitpunkt in den FPGA verlegt, weil der das schnell und 
effektiv gemacht hat, statt es kleinteilig auf dem angeschlossenen ARM 
zu rechnen. Eine Prozessorarchitektur wird es auch im zukünftigen System 
wieder in ähnlicher Weise geben. Ich frage mich aber ob es nicht 
zweckmäßiger ist, angesichts des Aufwandes die FFT doch in einer der CPU 
timeslots zu machen und mehrere Kerne einzusetzen. Diesmal werden es 
I7-industrial Plattformen.

Oder kennt jemand zufällig eine native Implementierung in Verilog oder 
VHDL, welche ohne ein Prozessorinterface und dafür kontinuierlich ohne 
overhead arbeitet?

Das alte System arbeitet so, dass eine Strecke von mehreren hunderten 
Datenblöcken zu 768 Daten (mit Zerofeed) kontinuierlich in mehreren 
FFT-lanes berechnet werden und die Ergbnisse in einen Speicher kommen, 
aus dem sich die CPUs bedienen. Das würde ich gerne beibehalten. Die 
Alternative wäre, alles hochzuladen und die FFTs dann offline zu machen, 
oder es im FPGA zu puffern und dann so langsam zu machen, dass es der 
FPGA kann, was reichlich unpraktisch wäre.

von Fpgakuechle K. (Gast)


Lesenswert?

Hohewart schrieb:

> Oder kennt jemand zufällig eine native Implementierung in Verilog oder
> VHDL, welche ohne ein Prozessorinterface und dafür kontinuierlich ohne
> overhead arbeitet?

Wenn einem der Zufall Nichts zur Kenntnis bringt, kann man sich einen 
FFT-Core auch wunschgemäß von einem Dritten schreiben lassen. 
Beispielsweise als Abschlussarbeit von einem Stunden oder von einem 
Freiberufler. Bei den klaren Randbedingungen würde ich ich für einen 
Profi wenige Wochen Arbeit ansetzen.

von Martin S. (strubi)


Lesenswert?

>
> Oder kennt jemand zufällig eine native Implementierung in Verilog oder
> VHDL, welche ohne ein Prozessorinterface und dafür kontinuierlich ohne
> overhead arbeitet?
>

Jenachdem kann eine Sliding-DFT auch zum Erfolg fuehren, da kommt man 
schon mal vom Pingpong-Buffering weg. Koennte man vermutlich sogar mit 
dem HLS-Geraffel erschlagen. Das Verhalten ist natuerlich entsprechend 
anders und man muss sein Windowing neudefinieren. Einen bitteren Apfel 
muss man auf jeden Fall mit Vivado essen.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Hohewart schrieb:
> Abgesehen, dass ich mit dem Config-Anschluss nichts anfangen kann, weil
> ich das nicht brauche, ist mir nicht klar, was der AXI-Bus dort soll.
> Die FFT wurde bisher im Stream-Mode benutzt und mit jedem Takt ein Datum
> eingeschoben. Nach etwas Delay kam dann das Ergebnis lückenlos heraus.

Das kann der Core immer noch. Siehe "Pipelined Streaming I/O with no 
Cyclic Prefix Insertion" im Datenblatt zum FFT Core. Das Ready Signal 
setzt du einfach fix auf '1' und gut ist. Am besten einmal 
durchsimulieren. ;-)

von Messtechniker (Gast)


Lesenswert?

Hohewart schrieb:
> Kann es sein,
> dass es die FFT-IP von Xilinx nur noch als AXI-Version gibt?
Die meisten Cores gibt es nur noch mit AXI-Interface. Xilinx treibt 
damit die Politik der konfigurierbaren SoCs voran und die darin verbaute 
programmierbare Logik ist in beliebigem Umfang vorhanden. Da macht es 
nichts, wenn etwas mehr davon verbraucht wird. Der Kunde zahlt es.

Mit der Taktfrequenz ist es ähnlich: Was AXI mehr an Logik verbraucht, 
führt zu etwas reduziertem timing budget, wird aber durch besser 
werdende FPGAs weitgehend ausgeglichen.

Tobias B. schrieb:
> Das Ready Signal
> setzt du einfach fix auf '1' und gut ist.
Setzt das nicht der Core? Oder meinst du das des 
FFT-Ergebnis-Empfängers? Das sagt ja nur, dass der AXI-Slave bedient 
werden darf und impliziert noch nicht, dass das durch den Master auch 
passiert. Der Master (in dem Fall der FFT-Core) muss auch Daten haben. 
Gibt er das Ready dann einfach nach vorne durch und schaltet auch 
Durchzug?

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Messtechniker schrieb:
> Tobias B. schrieb:
>> Das Ready Signal
>> setzt du einfach fix auf '1' und gut ist.
> Setzt das nicht der Core? Oder meinst du das des
> FFT-Ergebnis-Empfängers? Das sagt ja nur, dass der AXI-Slave bedient
> werden darf und impliziert noch nicht, dass das durch den Master auch
> passiert. Der Master (in dem Fall der FFT-Core) muss auch Daten haben.
> Gibt er das Ready dann einfach nach vorne durch und schaltet auch
> Durchzug?

Genau, auf der Master Seite des Cores machs du den Ready Port einfach 
fix auf 1. Wenn der Core im Pipelined Streaming bedient wird, dann 
kommen die Daten mit einem valid lueckenlos raus, sofern du die Daten 
auch lueckenlos reinschiebst. Was in entsprechendem Mode erlaubt ist.

Bei den ganzen AXI Stream Cores gibt es oft durch entsprechende 
Konfiguration die Moeglichkeit auf den AXIS Handshake zu verzichten. 
Einfach mal simulieren, die Testbench mit irgendwelchen Dummy Daten ist 
ja super schnell aufgesetzt.

von Messtechniker (Gast)


Lesenswert?

Tobias B. schrieb:
> Wenn der Core im Pipelined Streaming bedient wird, dann
> kommen die Daten mit einem valid lueckenlos raus, sofern du die Daten
> auch lueckenlos reinschiebst. Was in entsprechendem Mode erlaubt ist.

Dann ist das eine Besonderheit dieses Cores, nehme ich an. Allgemein 
gibt es das ja nicht. Jetzt stellt sich nur noch eine Frage:
Wann fängt man an, lückenlos zu schreiben? Ich würde raten, wenn das 
Ready des Cores high geht?  Irgendwie muss ja gesteuert werden, wann man 
Einzuschreiben hat und es muss auch die Latenz des Cores in Betracht 
gezogen  werden. Ich habe schon länger nichts mehr mit FFTs gemacht, 
aber aus der Erinnerung würde ich schätzen, dass das erste Datum so etwa 
nach einer Taktzahl heraus kam, die der Länge der FFT entsprach (bei 
Verwendung von ordered sequencing). Also Takt 0...127 Daten rein, 
128...255 zweites Paket und bei 160 kommt das Ergebnis des ersten Pakets 
raus.

Ist das eigentlich immer noch so, dass die FFT zweimal, also mit den 
Spiegelfrequenzen herauskommt?

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Messtechniker schrieb:
> Dann ist das eine Besonderheit dieses Cores, nehme ich an.

Naja, ob ein Core das kann steht im Datenblatt. Der CORDIC kann das z.B. 
auch.

Messtechniker schrieb:
> Jetzt stellt sich nur noch eine Frage:
> Wann fängt man an, lückenlos zu schreiben? Ich würde raten, wenn das
> Ready des Cores high geht?

Genau. Du holst den Core aus dem Reset (wie das bei vielen IPs ueblich 
ist) und dann geht direkt das Ready mit hoch.

Ich wuerde einfach mal das Datenblatt lesen, ich hab da jetzt auch nicht 
tiefer reingeschaut. Beim CORDIC kann ich 100%ig sagen, dass er das 
Pipelining unterstuetzt und bei dem FFT Core liesst es sich auch, als 
koenne er das.

Warum sollte das auch anderst sein? Am Ende steckt da genau das Gleiche 
drinnen wie die alte Variante ohne AXIS, nur dass man eben einen 
Handshake aussenrum gebaut hat. ;-)

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Tobias B. schrieb:
> nur dass man eben einen
> Handshake aussenrum gebaut hat. ;-)

... und AXI-FIFOs die Block-RAM-Resourcen verbrauchen und aufgrund der 
vielfältigen Möglichkeiten des handshakings und des AXI-Betriebes auch 
wirklich BRAM sind und nicht auf interne FIFOs zugrückgreifen können, 
ohne etwas drum herum zu bauen und damit langsamer werden, was die 
maximale Taktfrequenz senkt.

In Einzelfällen führt eine statisch 1 auf den Ready-Signalen noch dazu, 
dass Kombinatorik eingespart wird, aber ich habe schon Vergleiche 
angestellt und die AXI-fähigen Cores sind allesamt größer, und 
langsamer, was Flächenverbauch angeht. Das Anfordern eines BRAMs scheint 
mir besonders unschön, weil dann der Router dort hin in routen muss, 
während er generische Logik (und FFT wäre ein Beispiel dafür) durchaus 
in die FPGA-Fläche vorort verteilen kann. Da kommt man oft schlechter 
bei raus.

Man kann das auch oft beobachten, wenn man auf diese Weise den AXI 
beschaltet, bauen lässt, faktisch ein AXI-freies Design bekommt oder 
bekommen sollte und es dann mit dem Ergebnis der Schaltung vergleicht, 
die man bekommt, wenn man den CORE auf natives Interface geschaltet 
hatte (soweit das noch geht).

Für FFT benutze ich inzwischen eine handgeschriebene Version. Die kann 
zwar nicht alle Optionen, die man im XI-Core konfigurieren kann, ist 
aber schneller, als der schnellste XI und dabei kleiner und er ist 
kleiner, als der kleinste XI und dabei noch schneller. Er baut nur ewig! 
Ich habe den Verdacht dass die neueren Vivadotools sich nicht nur 
einfach das native IF sparen, sondern auch vorgefertigte 
Platzierungsoptionen mitbringen, die eine schnelle Synthese und 
Implementierung ermöglichen und dann "gröber" bleiben und weniger 
optimierbar sind - was auch immer da im Hintergrund eine Rolle spielt.

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Hohewart schrieb:
> Ich frage mich aber ob es nicht
> zweckmäßiger ist, angesichts des Aufwandes die FFT doch in einer der CPU
> timeslots zu machen und mehrere Kerne einzusetzen. Diesmal werden es
> I7-industrial Plattformen.

In aller Regel sind die FPGAs um Welten schneller, als CPUs - auch bei 
FFT. Ich hatte bisher nur zwei Fälle, in denen solche Berechnungen 
(einmal eine korrelierende FFT und einmal eine DFT) absichtlich in CPUs 
/ DSPs gemacht wurden: Die waren jeweils gerade noch schnell genug, um 
es innerhalb der gesteckten Echtzeitanforderungen zu schaffen, haben 
aber sehr viel weniger Strom benötigt. Beide Systeme waren 
Battery-Powered. In einem Fall konnte ich in der Nachbetrachtung zeigen, 
dass die FFT im FPGA besser gewesen wäre und man lieber hätte etwas 
anders in die DSPs verschieben sollen. Da muss man eben die richtige 
Implementierung nehmen und vergleichen und aufpassen, wo man noch die 
meiste Luft hat, etwas in vorhandene HW reinzustecken.

Generell gilt natürlich: Solange eine CPU eine Aufgabe packt, ist es 
immer besser für den Strombedarf und sehr oft auch günstiger im 
Endpreis, weil der stärkere DSP, den man statistisch braucht, weniger 
Aufpreis kostet, als der größere FPGA.

von Duke Scarring (Gast)


Lesenswert?

Jürgen S. schrieb:
> Generell gilt natürlich: Solange eine CPU eine Aufgabe packt, ist es
> immer besser für den Strombedarf und sehr oft auch günstiger im
> Endpreis, weil der stärkere DSP, den man statistisch braucht, weniger
> Aufpreis kostet, als der größere FPGA.
Und nicht zu vergessen: Die Entwicklungszeit und das Debugging für einen 
Algorithmus, der in einer CPU abgearbeitet wird, ist um eine 
Größenordnung geringer. Außerdem findet man viel eher einen Softwerker, 
als einen FPGA-Werker :-)

Duke

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.