Hi,
ich würde gerne von meinem FPGA Board den SRAM Speicher testen.
Der Speicherbereich liegt von 0x00800000 - 0x008FFFFF. Also Sprich
1.048.576 Adressen. Sehe ich das richtig?
Frage ich jetzt mit Hilfe von
1
test=IORD_16DIRECT(DBC3C40_SRAM_BASE,0);
ab, bekomme ich an Speicherstelle "0x00800000" also ohne Offset da ja
"0" im Read Befehl meinen Speicherinhalt doppelt ausgegeben! Also sprich
dieselben Daten wenn ich
Liest du Wortweise aus (das 16 deutet da irgendwie drauf hin)?
Dann kann es sein, dass du auf ungeraden Adressen mit diesem wortweisen
Zugriff immer das Wort "darunter" ausliest. Also z.B. auch
ja genau das ist der Fall!
das erhalte ich wenn ich auf stelle 0x0000 schreibe.. "spiegel" er das
auch auf Adresse 0x0001.
0x0000 - 1234
0x0001 - 1234
0x0002 - 5678
0x0003 - 5678
warum ist das so? Weil ich Wortweise meine Daten ein/auslese?
izloh schrieb:> warum ist das so? Weil ich Wortweise meine Daten ein/auslese?
Wie Breit ist denn Dein SRAM? Und wie breit Dein Prozessorinterface?
Duke
also auf dem Baustein steht IS61LV51216
laut meinem Verständnis hat der dann 512K * 16.
Ist das die Antwort auf deine Frage @Duke?
@Lothar: Ich verstehe nicht wie der einfach das unterste Bit ignorieren
kann und zu 0 setzt!?
izloh schrieb:> Ich verstehe nicht wie der einfach das unterste Bit ignorieren> kann und zu 0 setzt!?
Na, wortweiser Zugriff eben...
> laut meinem Verständnis hat der dann 512K * 16.
Dein RAM kann also nur gerade Adressen adressieren. Wenn wenn du also
von einer ungeraden Adresse 16 Bit lesen willst, dann muß das auf 2
Einzelzugriffe auf nacheinenderfolgende (gerade) Adressen und
anschliessendes Zusammenbasteln der Daten aufgedröselt werden.
@Lothar: Aber ich muss ja ansich gar nicht auf die ungeraden Adressen
schreiben bzw lesen. Ich kann mir doch sofort immer die geraden
Anweisungen angucken!
so setze ich zuerst den Inhalt der Adresse zurück
1
for(i=0;i<32;i++)
2
{
3
IOWR_16DIRECT(DBC3C40_SRAM_BASE,i,0x0000);
4
}
dann erhalte ich
Nr: 0 - 0
Nr: 1 - 0
..
Nr: 31 - 0 <- mit ensprechender IORD Befehl
Versuche ich jetzt aber alles auf 0 zu setzen über "32" also würde ich
die oben dokumentierte Schleife auf 33 setzen macht er nichts mehr!
Warum?
wenn ich folgendes schreibe
1
IOWR_16DIRECT(DBC3C40_SRAM_BASE,1,0xFFFF);
2
IOWR_16DIRECT(DBC3C40_SRAM_BASE,2,0x1234);
erhalte ich
Nr: 0 - ffff
Nr: 1 - ffff
Nr: 2 - 1234
Nr: 3 - 1234
Nr: 4 - 0
Nr: 5 - 0
..
hier kann ich doch ansich nur noch entweder die geraden oder nur noch
ungeraden beschreiben? Bzw auslesen!
izloh schrieb:> wenn ich folgendes schreibe> IOWR_16DIRECT(DBC3C40_SRAM_BASE, 1, 0xFFFF);
Hier passiert folgendes:
Offset 0x 00001
+Base 0x00800000
= 0x00800001
Maske 0xFFFFFFFE <<- weil RAM nur wortweise adressierbar!!!
Addresse 0x00800000
> IOWR_16DIRECT(DBC3C40_SRAM_BASE, 2, 0x1234);
Ergibt:
Offset 0x 00002
+Base 0x00800000
= 0x00800002
Maske 0xFFFFFFFE
Addresse 0x00800002
> hier kann ich doch ansich nur noch entweder die geraden oder nur noch> ungeraden beschreiben? Bzw auslesen!
Du kannst eigentlich immer nur die geraden Adressen bearbeiten.
Ungerade Adressen werden automatisch "begradigt", indem das LSB auf 0
gesetzt wird.
super Danke Lothar, das habe ich jetzt verstanden!
Aber warum kann ich nicht eine höhere Adresse beschreiben?
izloh schrieb:> so setze ich zuerst den Inhalt der Adresse zurück> for(i=0;i<32;i++)> {> IOWR_16DIRECT(DBC3C40_SRAM_BASE, i, 0x0000);> }>> dann erhalte ich>> Nr: 0 - 0> Nr: 1 - 0> ..> Nr: 31 - 0 <- mit ensprechender IORD Befehl>> Versuche ich jetzt aber alles auf 0 zu setzen über "32" also würde ich> die oben dokumentierte Schleife auf 33 setzen macht er nichts mehr!> Warum?
> Versuche ich jetzt aber alles auf 0 zu setzen über "32" also würde ich> die oben dokumentierte Schleife auf 33 setzen macht er nichts mehr!> Warum?
Tja, kann ja durchaus sein, dass dein Programm sich irgendwo im diesem
Speicher tummelt, und du es einfach überschreibst...
izloh schrieb:> jedoch sollte der C-Code aus NIOS im Flash abgelegt werden?!
Aber der Stack und irgendwelche Variablen werden garantiert im RAM
abgelegt.
Hallo izloh,
zwei Sachen hätt ich da. Zum einen könntest Du doch die ganze
Zugreiferei über Macros umgehen indem Du einen Pointer auf die
Basisadresse setzt und dann über diesen Pointer zugreifst. Und zum
anderen würde ich dir raten, ein internes RAM ins SOPC zu bauen und dort
Code, Daten und Stack hinzulegen.
Grüße,
Harald
Hi,
wenn ich mich mal einmischen darf:
Das mit dem Pointer ist keine gute Idee wenn man in seinem System einen
Nios mit Cache hat, denn genau dafür sind die IORD_..DIRECT Macros
gemacht: Den Cache umgehen und direkt aus dem SRAM lesen.
Was die Addressierung angeht: Hier habe ich etwas ganz ähnliches im
Altera Forum diskutiert. Vielleicht hilft es ja.
http://www.alteraforum.com/forum/showthread.php?t=27574
Gruß,
Maik