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.
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'.
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
COMPONENTxfft_nrz_screen
2
PORT(
3
aclk:INSTD_LOGIC;
4
s_axis_config_tdata:INSTD_LOGIC_VECTOR(7DOWNTO0);
5
s_axis_config_tvalid:INSTD_LOGIC;
6
s_axis_config_tready:OUTSTD_LOGIC;
7
s_axis_data_tdata:INSTD_LOGIC_VECTOR(31DOWNTO0);
8
s_axis_data_tvalid:INSTD_LOGIC;
9
s_axis_data_tready:OUTSTD_LOGIC;
10
s_axis_data_tlast:INSTD_LOGIC;
11
m_axis_data_tdata:OUTSTD_LOGIC_VECTOR(63DOWNTO0);
12
m_axis_data_tvalid:OUTSTD_LOGIC;
13
m_axis_data_tready:INSTD_LOGIC;
14
m_axis_data_tlast:OUTSTD_LOGIC;
15
event_frame_started:OUTSTD_LOGIC;
16
event_tlast_unexpected:OUTSTD_LOGIC;
17
event_tlast_missing:OUTSTD_LOGIC;
18
event_status_channel_halt:OUTSTD_LOGIC;
19
event_data_in_channel_halt:OUTSTD_LOGIC;
20
event_data_out_channel_halt:OUTSTD_LOGIC
21
);
22
ENDCOMPONENT;
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.
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.
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.
>> 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.
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. ;-)
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?
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.
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?
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. ;-)
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.
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.
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