Forum: FPGA, VHDL & Co. SRAM Speicher testen


von izloh (Gast)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)

von izloh (Gast)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

izloh schrieb:
> Weil ich Wortweise meine Daten ein/auslese?
Ja. Dabei wird einfach das unterste Bit ignoriert und zu 0 gesetzt.

von Duke Scarring (Gast)


Lesenswert?

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

von izloh (Gast)


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!?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von izloh (Gast)


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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von izloh (Gast)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von izloh (Gast)


Lesenswert?

mh das mag wohl möglich sein, jedoch sollte der C-Code aus NIOS im Flash 
abgelegt werden?!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

izloh schrieb:
> jedoch sollte der C-Code aus NIOS im Flash abgelegt werden?!
Aber der Stack und irgendwelche Variablen werden garantiert im RAM 
abgelegt.

von Harald F. (hfl)


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

von Maik R. (kiamur)


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

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.