Forum: FPGA, VHDL & Co. Spartan 6 + DDR RAM


von Tobias B. (tb_1988)


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

von Valko Z. (hydravliska)


Lesenswert?

Hi

hast du schon ein Speichercontroller in deinem Desing integriert (MIG 
Interface)? Falls nicht dann könntest du den Core Generator dafür 
verwenden.

Gruß

von Tobias B. (tb_1988)


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?

von Valko Z. (hydravliska)


Lesenswert?

Ich habe bis jetzt keine Virtual FIFOs verwendet deswegen weiss ich 
nicht wie die zu bedienen sind. Der Speichercontroller bietet dir ein 
User Interface was du dann beschreiben kannst. Oder willst du gar nicht 
das mittels VHDL bzw. Verilog realisieren?

von dadada (Gast)


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

von wosnet (Gast)


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

von Rolf S. (audiorolf)


Lesenswert?

Ich schlage mich gerade mit dem DDR3- Controller bei Altera herum. Die 
"kleine" state machine, die man braucht, um seine Daten rein und raus zu 
kriegen und zu cachen, ist schon 8 DIN a4 Seiten lang.

Ist das beim Xilinx einfacher? Hört sich so an!

von dadada (Gast)


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.

von Rolf S. (audiorolf)


Lesenswert?

Was mir beim kurzen Blick auf das Vivado aufgefallen ist: die haben 
jetzt einen anderen MIG drin, der keinen normalen Controller mehr 
aufbauen kann. Ist das nicht mehr vorgesehen bei den Xilinx FPGAs? Oder 
hat es mit der Strategie zu tun, alles über Busse zu machen?

von Christian R. (supachris)


Lesenswert?

Doch, das geht schon noch. Jedenfalls bei DDR2 kann man auch noch das 
"alte" Interface benutzen. Manchmal ist das auch bissl abhängig von der 
Einstellung ob VHDL oder Verilog, etwas verwirrend. Liegt sicher an der 
AXI Strategie oder daran dass die 7er Serie keinen Hard-Block mehr drin 
hat.

von Tobias B. (tb_1988)


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

von Hans-Georg L. (h-g-l)


Lesenswert?

Hallo Tobias,

hast du dir mal von Trenz die TE6000 Referenz Designs heruntergeladen 
und angeschaut ?

Da ist auch ein Beispiel für dem MIG Generator dabei.

von Tobias B. (tb_1988)


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;

von Hans-Georg L. (h-g-l)


Lesenswert?

Auf dem 630 Board ist doch ein FX2 von Cypress drauf oder ?

Dafür gibt es doch Applikationen, welche Daten ins Ram schreiben und 
wieder zurücklesen. Das gibts bestimmt auch bei Trenz. Sonst bei 
Cypress, Ztex oder ähnlichen Spartan6 Boards schauen.

von Achim S. (Gast)


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.

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.