Spartan 6 + DDR RAM

OP #4398354
Lesenswert?

Hallo,

ich habe ein Spartan6 TE0630 Board und will den DDR3 RAM nutzen um 
gesampelte Daten zu Puffern. Der Block-RAM ist leider zu klein für die 
Menge der Daten.
Daher möchte ich den DD3 RAM (1GBit) auf dem Board nutzen. Ich will 
dabei keinen MicroBlaze verwenden.

Sehe ich das richtig, dass ich dazu einen Virtual FIFO anlegen muss als 
Schnittstelle zu RAM?
Ich stehe voll auf dem Schlauch mit der implementierung. Hat jemand 
zufällig ein Beispiel-Programm wo sowas implementiert ist?

Wie muss ich Virtual FIFO und den RAM impelementieren?

Danke
Gruß Tobias
OP #4398430
Lesenswert?

Nein habe ich noch nicht.
Den Core Generator hab ich ausprobiert und war etwas erschlagen von der 
Anzahl an Pins die der für ein RAM erstellt.

Ist das korrekt, dass ich den Virtual Fifo über AXI mit dem RAM 
verbinden muss und dann übernimmt der Virtual FIFO die 
Speicherverwaltung?
Gast #4398452
Lesenswert?

Ich habe jetzt nur einen DDR2 auf dem Atlys-Board von Digilent genutzt, 
aber der Unterschied zu DDR3 sollte gering sein?!

Der Core-Generator sollte dir einen MCB (Memory Control Block) 
ausspucken, der auch mit den nötigen Beispielen versehen ist wie man ihn 
anschließt. Sieht alles erstmal schlimmer aus als es ist. Schau dir mal 
die UG388 an, da ist auch alles schön erklärt. Eigentlich musst du nur 
noch eine kleine FSM drum rum bauen, welche die nötigen Signale 
(Command, R/W, etc) anlegt, den Rest übernimmt der MCB für dich.

Auch ganz gut:

https://joelw.id.au/FPGA/XilinxMIGTutorial
Gast #4398455
Lesenswert?

Wie der Vorgänger schon sagte: Einfach den Memory Interface Generator 
(MIG) IP-Core benutzen, dort dann im Wizard den entsprechenden 
RAM-Baustein auf deinem Board auswählen und geht. Die Verkabelung der 
vielen Pins mußt Du auch nicht selbst machen, im Verzeichnis 
ipcore_dir/mig wird auch ein Beispiel-Projekt angelegt, inkl. UCF-Datei, 
dass Du einfach kopieren kannst.

Das Interface selber ist dann FIFO-basiert und relativ einfach zu 
bedienen (Datenblatt des MIG lesen, ist ganz gut beschrieben).
Gast #4400124
Lesenswert?

Ich drucke meinen Code selten aus ;-) Mein Modul das Schreiben und lesen 
handlet hat eta 800 Zeilen, ist aber auch noch einiges an Peripherie 
drin, also vllt so 50-60% sind effektiv die Ansteuerung vom RAM

Muss aber auch sagen, ich hatte mal einen MCB für ein Kintex-7 Board 
angefangen, da war das alles etwas aufwändiger... Oder ich habe etwas 
falsch eingestellt gehabt im Wizard, hab es dann aber nicht gebraucht 
und nicht weiter verfolgt.
OP #4454502
Lesenswert?

Hey,

ich habe das Projekt ne weile pausiert.
Aber ich bekomme den RAM immer noch nicht zum laufen. Habe die 
UserGuides von xilinx gelesen aber es läuft nicht.

Ich habe mit dem ISE core generator und dem MIG (3.92) meinen RAM 
eingebunden
wie in UG388 beschrieben.
Die Simulation die auch mit erstellt wird funktioniert auch wenn es ewig 
dauert mit isim. 1µs zu simulieren dauert ca. 20 Minuten. Ist das bei 
euch auch sooo langsam? Ist das schon ein Zeichen, dass etwas schief 
läuft?

ich habe mal das erstellte example_design importiert und calib_done 
Signal auf eine LED gelegt und es passiert nichts. Müsste nicht das 
calib_done Signal '1' werden?

Hat jemand vielleicht ein kleines Beispielprojekt das funktioniert?

Ich bin für eure Tipps Dankbar

Gruß Tobias
OP #4454585
Lesenswert?

Ja, hab ich mir angeschaut.
aber das ist auch nichts anderes als der MIG ausgibt.

oder habe ich was übersehen?

ich habe das problem das Interface korrekt anzusprechen.
mit den addressen, burst length, etc.

kann ich so den RAM beschreiben?
if(c1_p0_wr_full = '0') then
  c1_p0_wr_en <= '1';
  c1_p0_wr_mask <= "0010";
  c1_p0_wr_data <= data_in;
  wr_cnt <= c1_p0_wr_count;
end if;

if(c1_p0_cmd_empty = '1') then
  c1_p0_cmd_en <= '1';
  c1_p0_cmd_instr <= "000";
  c1_p0_cmd_bl <= "000100";
  c1_p0_cmd_byte_addr <= wd_addr;
  ram_state <= wr_end;
end if;
Gast #4455850
Lesenswert?

Tobias B. schrieb:
> 1µs zu simulieren dauert ca. 20 Minuten. Ist das bei
> euch auch sooo langsam? Ist das schon ein Zeichen, dass etwas schief
> läuft?

Wenn du mit der freien ISE (ohne Lizenz) arbeitest, dann geht ab einer 
bestimmten Designkomplexität die Simulationsgeschwindigkeit massiv in 
die Knie (es wird auch eine entsprechende Meldung in der Konsole 
ausgegeben). Die Simulation ist dann de facto nicht mehr nutzbar.

Tobias B. schrieb:
> calib_done
> Signal auf eine LED gelegt und es passiert nichts. Müsste nicht das
> calib_done Signal '1' werden?

doch, dass sollte irgendwann auf 1 gehen. Siehst du denn wenigstens (mit 
dem Oszi), dass am Speicherbus nach der Konfiguration des FPGA 
wenigstens zwischendurch etwas wackelt?

Tobias B. schrieb:
> kann ich so den RAM beschreiben?
> if(c1_p0_wr_full = '0') then
.....
> if(c1_p0_cmd_empty = '1') then

Na ja, beim Schreiben musst du erstmal ausreichend Daten entsprechend 
deiner Burstlänge in den Daten-FIFO schieben ehe du das Kommando in den 
Kommando-FIFO absetzt. Wenn du das in einer (hier nicht von dir 
gezeigten) FSM so steuerst, dann ist es ok.

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