Axi DMA korrekte Parameter

Ich mache mein Design mit Vivado HLs und Vivado und ich mache einige ziemlich große Transfers zwischen DDR und meinem benutzerdefinierten IP-Block und umgekehrt.

Jede Übertragung von DDR zu benutzerdefinierter IP umfasst 256 x 256 x 4 = 262144 Bytes und geschieht viermal.

Meine MM2S-Geschwindigkeit (Memory Mapped to Stream) liegt bei 350 MB/s und bei S2MM bei 200 MB/s.

Ich weiß, dass ich bessere Geschwindigkeiten erreichen kann, und ich denke, diese langsamen hängen mit den Parametern des Axi-DMA-Blocks zusammen.

Das ist, was ich hierher wollte, um Sie zu fragen, um mir zu helfen, zu verstehen, welche die richtigen Parameter sein sollten, da ich es immer noch nicht verstehe, wenn ich den Produktleitfaden von logicore lese .

Geben Sie hier die Bildbeschreibung ein

Breite der Pufferlänge n Soweit ich weiß, ist dies die maximale Länge der Übertragung in Bytes, also 2 ^ n. Also in meinem Fall als 2^18=262144 soll ich hier 18 eingeben?

Memory Map Data Width Data width in bits of the AXI MM2S Memory Map Read data bus. Ich habe hier keine Ahnung. Meine Wörter haben 32 Bit und ich habe den Eingangsstrom meines Blocks auf eine Länge von 32 Bit definiert, aber was ist das?

Stream Data Width Ich denke, hier sollte ich 32 richtig eingeben?

Maximale Burst-Größe

Burst partition granularity setting. This setting specifies the maximum size of the burst cycles on the AXI4-Memory Map side of MM2S. Valid values are 2, 4, 8,16, 32, 64, 128, and 256.

Wieder habe ich keine Ahnung, was ich hier einfügen soll.

Ich könnte einen Trial-and-Error-Ansatz verfolgen und Parameter ändern, bis ich die besten finde, aber das Problem ist, dass jede Neusynthese und Neuimplementierung in Vivado viel Zeit in Anspruch nimmt ...

Antworten (1)

Breite der Pufferlänge n : Dies ist genau das, was Sie denken, die größte Übertragung in Bytes, die die IP mit einem einzigen Befehl ausführen kann. 18 Bit können ausreichen, aber es ist wahrscheinlich, dass Sie 19 Bit benötigen, um 2 ^ 18 darzustellen. Überprüfen Sie das Datenblatt, um sicherzugehen.

Memory Map Data Width Dies ist auf der AXI-Seite. Sie können einfügen, was Sie möchten (AXI wird nach Bedarf vergrößern / konvertieren), aber meiner Erfahrung nach ist es besser, die Größenkonvertierung und die Taktkonvertierung so weit wie möglich zu vermeiden. Das bedeutet, wenn Ihr AXI-Speicher 128 Bit 100 MHz beträgt, sollten Sie hier denselben 100-MHz-Takt mit einem 128 Bit breiten Port verwenden. Auf dem Zynq werden 32 oder 64 Bit erwartet, und ich schätze, die Vergrößerung/Konvertierung ist "kostenlos", da es auf der festen Hardware erfolgt.

Max Burst Size Dies wirkt sich auch auf die AXI-Seite aus. Es ist die maximale Übertragung von Memory Map Data WidthBits, die es in einer einzigen Übertragungsanforderung durchführt. Höher ist normalerweise besser, da Erinnerungen mit Bursts arbeiten. Es wirkt sich jedoch auf die Leistung Ihres Systems aus (arbitrierend) und erhöht möglicherweise die Größe des Kerns, wenn Sie Store-and-Forward verwenden (wobei ich mir ziemlich sicher bin, dass der IP-Kern Sie dazu zwingt, es war früher optional). Die Auswirkung dieser Option hängt hauptsächlich von der AXI-Infrastruktur und -Last ab. Auf einer Lastlicht-Infrastruktur mit hoher Schreib-/Leseakzeptanz werden Sie keine Auswirkungen feststellen.

Stream Data Width Dies ist die AXI-Stream-Seite. Das braucht Ihre eigene IP, in Ihrem Fall scheint es 32 Bit zu sein.

Vergessen Sie nicht, dass der AXI-Stream und der AXI-Port nicht die gleiche Größe und den gleichen Takt verwenden müssen. Für maximalen Durchsatz muss der AXI-Port jedoch einen höheren Durchsatz haben als die AXI-Stream-Seite.

Wenn Sie beispielsweise AXI-Stream (und damit Ihr Kern) 32 Bit mit einem Takt von 150 MHz verwenden, hat er effektiv einen Durchsatz von 4,8 GBit/s. Wenn Ihr AXI-Port mit 100 MHz läuft, kann es nicht 32 Bit sein, da er nicht genug Durchsatz hat (3,2 GBits/s < 4,8 GBits/s). Bei 64 Bit (6,4 GBit/s) hätten Sie genug, um Ihren IP-Core kontinuierlich zu versorgen.

Ty für diese Antwort. Ich habe nur einen Zweifel an der Datenbreite der Memory Map. Was ist mein Axi-Speicher? Meine Speicherzuordnung ist DDR, also welche Breite soll ich angeben? Im Moment habe ich 64 und mit dem gleichen Takt wie Axi-Stream (100 MHz), also einen Durchsatz von 6,4 Gb/s, während der Axi-Stream 32 Bit ist, also 3,2 Gbit/s. S. Kann ich mit 512 Bit (51,2 Gbit/s) bessere Ergebnisse erzielen?
Es ist sinnlos, eine größere Breite als der Systembus zu haben. Auf Zynq sind es 32 oder 64 Bit. Bei einem benutzerdefinierten DDR wird es durch seine Parameter angegeben. Ein 32 Bit breiter 400-MHz-DDR-Speicher, auf den mit einem 1:4-Takt zugegriffen wird, hat eine Breite von 256 Bit bei 100 MHz. Wenn es 1:2 ist, wären es 128 Bit 200 MHz, alles hängt von dem Parameter ab, den Sie wählen, wenn Sie die Speicherschnittstelle generieren. Auf dem Zynq ist das behoben und Sie haben keine große Wahl.
Aber ich habe keine Speicherschnittstelle gewählt, ich interagiere nur mit Standard-Zynq-DDR. Die, von denen 32 bits wide 400MHz DDR memory accessed with a 1:4 clock will be 256 bits wide 100MHzich keine Ahnung habe, wo ich meine sehen kann. Helft mir bitte dabei und ich mache mich auf den Weg :)
Auf dem Zynq haben Sie keine Kontrolle darüber, es ist feste Hardware. Je nach verwendetem Port sind es entweder 32/64 Bit.
Ah okay. Da ich also den ACP-Port verwende, der mit dem verbunden ist M_AXI_MM2Sund M_AXI_S2MMes 64 Bit ist. Ty für die Hilfe ;)