Memory Controller DDR2 Port-Erweiterung

OP #2602088
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.
Gast #2602985
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
Gast #2603017
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
OP #2603352
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.
Gast #2603407
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 ;-)
OP #2603475
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?
#2603531
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.
#2603545
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren