mikrocontroller.net

Forum: FPGA, VHDL & Co. SRAM Speicher testen


Autor: izloh (Gast)
Datum:

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

warum?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
IORD_16DIRECT(DBC3C40_SRAM_BASE, 6) == IORD_16DIRECT(DBC3C40_SRAM_BASE, 7)
oder
IORD_16DIRECT(DBC3C40_SRAM_BASE, 12344) == IORD_16DIRECT(DBC3C40_SRAM_BASE, 12345)

Autor: izloh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: izloh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: izloh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
    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?

wenn ich folgendes schreibe
    IOWR_16DIRECT(DBC3C40_SRAM_BASE, 1, 0xFFFF);
    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!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: izloh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: izloh (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Harald Flügel (hfl)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maik Ritter (kiamur)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.