Hallo, Wenn man mit Xilinx core-generator einen Memory-Controller erstellt, dann hat der eine maximale Anzahl an Ports. Wenn man jedoch mehrere benötigt, was ist eine/die beste Möglichkeit diese Ports zu erweitern? Schreibt man einen eigenen Arbiter? Aber dieser läuft doch dann mit dem FPGA-Takt oder(bei mir 48MHz)? Läuft der Memory-Controller vom Xilinx mit dem DDR2-Takt (200MHz)? Hattet Ihr auch schon mal das Problem? Wie habt Ihr es gelöst? Vielen Dank für Eure Hilfe.
Kann mir da niemand helfen? Keiner eine Idee? Danke für eure Hilfe.
ganz ehrlich... für eine gescheite antwort müsste man sehr sehr viel mehr über dein system wissen... z.B... datenbreiten, anzahl der trigger usw... gruß
Torsten Müller schrieb: > Schreibt man einen eigenen Arbiter? Ich würde das so machen, ja. Weißt Du denn schon, wieviele Ports Du brauchts? Und welche Datenraten Du erwartest? > Aber dieser läuft doch dann mit dem > FPGA-Takt oder(bei mir 48MHz)? Ja. > Läuft der Memory-Controller vom Xilinx > mit dem DDR2-Takt (200MHz)? Ja und nein. Üblicherweise sind im Controller asynchrone FIFOs drin, damit Speicherchip und internes Design mit unterschiedlichen Taktraten (und Bitbreiten) arbeiten können. Duke
>Aber dieser läuft doch dann mit dem >FPGA-Takt oder(bei mir 48MHz)? Läuft der Memory-Controller vom Xilinx >mit dem DDR2-Takt (200MHz)? Das hört sich für mich so an, als hättest du noch nie einen Xilinx-DDR2-IpCore in Betrieb genommen. >Wenn man mit Xilinx core-generator einen Memory-Controller erstellt, >dann hat der eine maximale Anzahl an Ports. Wenn man jedoch mehrere >benötigt, was ist eine/die beste Möglichkeit diese Ports zu erweitern? Bevor du mit der Arbitrierung von mehreren Schreib/Lese-Datenpfaden anfängst, solltest du unbedingt zunächst einmal genau einen Schreib- und einen Lesepfad implementieren, um die Tücken des IP-Cores/deiner Logik kennenzulernen. Du könntest Daten durch den ganzen Adressbereich hinweg schreiben und diese wieder auslesen, um zu sehen, ob die ausgelesenen Daten richtig sind. Wenn du das hast, dann hast du schon viel. Erst DANN würde ich mir einen Arbiter vornehmen. VG, Wat
Mmm... Wie viele Ports... Host -> FPGA: 1 digital 6 analog x PWM x Erweiterungen FPGA -> Host 1 digital 16 analog 8 counter x Erweiterungen also das sind dann insgesammt 32+x Eingnänge und 32+x Ausgänge Datenraten sollen 500kSamples/s (16Bit) unterstützt werden. Selber habe ich bereits auf DDR-RAM geschrieben und gelesen - allerdings nicht im Burst-mode, was wahrscheinlich sinnvoll ist, damit man viele viele Takte spart. Oder ist der Burst-Modus überflüssig? wenn ja könnten vereinfachte Schnittstellen verwendet werden: mem_wr_stb_i : in std_logic; mem_wr_addr_i : in std_logic_vector(29 downto 0); mem_wr_data_i : in std_logic_vector(15 downto 0); mem_wr_ack_o : out std_logic; mem_rd_stb_i : in std_logic; mem_rd_addr_i : in std_logic_vector(29 downto 0); mem_rd_data_o : out std_logic_vector(15 downto 0); mem_rd_ack_o : out std_logic; Ich stelle mir den Arbiter so vor: x Ports die jeweils ein BRAM-FIFO enthalten(schreibend)(lesend benötige ich keine-erst dann später wieder). Sind Daten in diesen FIFOs, werden die auf die 5 Ports vom Xilinx Memory-controller parallel gemappt, wenn diese FIFOs nicht voll sind. So würde man alle 5 Ports nutzen, wenn es mal richtig dicke kommt bzw. wenn z.B. der RAM durch ein Refresh mal Blockieren würde... Wie würdet ihr die PORT-Erweiterung realisieren? Doch mit Burst-Modus? Vielen Dank für euren wertvollen Tips.
ich glaube du denkst viel zu kompliziert. aber moch doch nochmal deinen Datenraten klar... (wahlfreier zugriff notwendig?, ganz entscheidend...) was hast du wirklich, ich kann deine Rechnug ob nicht nachvollziehen. worst-case komme ich auf 32 Mbyte/s (32*16*0.5 ???) raus und 32 Mybte/s rein. dein ddr kann (höchstwahrscheinlich, geraten) 400 Mbyte/s. Da sotlte ist dein DDR tiefenentspannt sein ;-)
>Mmm... >Wie viele Ports... Scheinst ja beratungsresistent zu sein ;-) Viel Glück beim Scheitern
Das kann schon sein, dass ich zu kompliziert denke... aber vielleicht löst sich der Knoten ja bald ;-) 32 Mbyte/s (32*16*0.5 ???) das verstehe ich nicht. (32*500.000*2 Byte würde ich sagen - aber egal - 32MB stimmt schon) 64 MB/s klingt nicht viel, aber bekomme ich die Daten über den Arbiter? (So viel Daten bekomme ich zwar nicht wirklich in der Praxis aber es geht ja ums Verständis) Wenn ich 5 (Xilinx)Ports habe und angenommen 3 Takte pro speichern/lesen benötige... 48MHz/3 = 16 MHz 16MHz 5 Ports 2 Byte = 160 MByte/s Sollte reichen, wenn ich nicht ihrgenwo noch Takte vergeude... Über ein Port würde ich die Daten nicht bekommen. Wahlweiser Zugriff ist nur notwendig, wenn man kein BRAM-FIFO für jeden Kanal vorschaltet. Wenn man ein BRAM-FIFO vorschaltet, könnte man den BRAM-FIFO blockweise übertragen. Aber dann bräuchte ich ein BRAM-FIFO für jeden Kanal und jeweils 2 für jede PORT-Erweiterung - einer für Daten und einer für die Commands. Ist das richtig? Das klingt kompliziert... Denke ich wirklich zu kompliziert?
@WAT Wie meinst du das? Ich glaub ich steh grad echt auf dem Schlauch. War meine Antwort blöd? 32+xPorts lesen + 32-xPorts schreiben
Ich kenne mich mit DDR2 nicht aus, aber solche Datenraten sind nicht wirklich hoch, hier der PSRAM schafft schon gut 20MB/s. Wenn du also sehrviel schnelleren RAM verwendest, wo gibt es dann viel Stau? Will sagen: Zwischen den einzelnen Schreibzugriffen ist soviel Freizeit, dass da locker noch gelesen werden kann ohne irgendwas zu bremsen. Ok es kann vorkommen, dass vielleicht genau gleichzeitig gelesen und geschrieben werden soll, dann gibt man dem einen eben die höhere Priorität und hält so lange die paar Bytes vom anderen Zugriff und schreibt sie danach. Also so mache ich das, die schreibzugriffe sind zwingend sofort und das Lesen darf ein paar Takte später anfangen. Und wieso eigentlich 48MHz, man kann doch schön einen schnelleren Takt generieren und hat dann deutlich mehr Datenrate übrig.
Hm, also da frage ich mich jetzt erst mal grundsätzlich nach dem Konzept. Die Messbox ist über den FX2 an den PC angebunden und soll 32 Kanäle á 16 Bit/500kS/s ausgeben und einlesen und das in Echtzeit? Das klappt ja gar nicht, denn das sind zusammen 64MB/s ohne Overhead. Der FX2 schafft im besten Fall mit großem Puffer und schnellem Host-Rechner 41MB/s durchscnittlich für Upload und Download zusammen. Also könntest du maximal mit Overhead nur 32 Kanäle insgesamt in Echtzeit bedienen. Und dafür brauchst du dann nichtmal den DDR RAM, dazu sollte der interne Block-RAM als FIFO geschaltet durchaus ausreichen, anscheinend gehts ja um so eine Art Arbitrary Waveform Generator plus Digitizer. In deinem Fall ist dann der FX2 der Flaschenhals, dazu kommt noch, dass der nur einen Port hat, den du in der Richtung umschalten musst. Ich denke, der Ansatz mit dem DDR2 RAM ist viel zu komplex gedacht. Wenn nicht ein Wahlfreier Zugriff möglich sein muss, oder die Waveforms in den RAM gespeichert werden, und dann nicht dauernd aktualisiert, dann ist der eventuell nicht nötig. Das weißt aber nur du. Soll das ein Live-Betrieb werden oder erst speichern und dann immer wieder abspielen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.