Forum: FPGA, VHDL & Co. Memory Controller DDR2 Port-Erweiterung


von Torsten M. (torsten2000)


Lesenswert?

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.

von Torsten M. (torsten2000)


Lesenswert?

Kann mir da niemand helfen?

Keiner eine Idee?

Danke für eure Hilfe.

von franke (Gast)


Lesenswert?

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ß

von Duke Scarring (Gast)


Lesenswert?

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

von Wat (Gast)


Lesenswert?

>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

von Torsten M. (torsten2000)


Lesenswert?

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.

von franke (Gast)


Lesenswert?

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 ;-)

von Wat (Gast)


Lesenswert?

>Mmm...
>Wie viele Ports...

Scheinst ja beratungsresistent zu sein ;-)
Viel Glück beim Scheitern

von Torsten M. (torsten2000)


Lesenswert?

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?

von Torsten M. (torsten2000)


Lesenswert?

@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

von Gustl B. (-gb-)


Lesenswert?

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.

von Christian R. (supachris)


Lesenswert?

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
Noch kein Account? Hier anmelden.