SRAM Speicher testen

Gast #2054762
Lesenswert?

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
1
test = IORD_16DIRECT(DBC3C40_SRAM_BASE, 0);
2
test = IORD_16DIRECT(DBC3C40_SRAM_BASE, 1);

warum?
Moderator (Firma: Titel) Persönliche Seite #2054781
Lesenswert?

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
1
IORD_16DIRECT(DBC3C40_SRAM_BASE, 6) == IORD_16DIRECT(DBC3C40_SRAM_BASE, 7)
oder
1
IORD_16DIRECT(DBC3C40_SRAM_BASE, 12344) == IORD_16DIRECT(DBC3C40_SRAM_BASE, 12345)
Gast #2054835
Lesenswert?

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?
Gast #2054867
Lesenswert?

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!?
Moderator (Firma: Titel) Persönliche Seite #2054879
Lesenswert?

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.
Gast #2054886
Lesenswert?

@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!
Moderator (Firma: Titel) Persönliche Seite #2054915
Lesenswert?

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.
Gast #2054923
Lesenswert?

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?
#2055217
Lesenswert?

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
#2066459
Lesenswert?

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

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