Hi. Ich arbeite im Moment mit NIOSII + SDRAM auf DE1 Board, und habe eine frage bezüglich der Speicherorganisation. Ich habe bemerkt, dass mein SDRAM Chip zwar in 4194804 Adressen je 16 bit geteilt ist(so steht es auch in Qsys), aber für NIOSII wird er in 8 bit Partitionen dargestellt. Deswegen beläuft die Adresse in Qsys von 0x800000 bis 0xFFFFFF (das doppelte von 4194804). Schreibe ich jetzt ein 16 bit langer Wert an die Adresse 0 mit IOWR_16DIRECT Befehl rein, so gehen die ersten 8 bit des Werts in die Adresse 0, und die zweite Hälfte in Adresse 1. Außerdem kann ich komischerweise nicht direkt in die Adresse 1 Schreiben, nur lesen. Erst in die Adresse 2 kann ein neuer Wert gespeichert werden. Nehme ich IOWR_8DIRECT und ein 8-bit Wert, so kann ich ohne Probleme jede Adresse lesen/schreiben. Sieht so aus, als wird der ganze Speicher in 8-bit Einheiten unterteilt, was eigentlich auch kein Problem ist, nur frage ich mich, wieso ich nur jede zweite Adresse mit 16 bit überschreiben darf?
Die "externe" Adressierung des Speichers (in diesem Fall 16 Bit Worte) hat mit der internen Zählweise des Prozessors meist nichts zu tun. Die meisten Prozessoren zählen die internen Addressen in Byte, auch wenn sie 16 oder 32 Bit Prozessoren sind. In diesem Fall werden 16 Bit Worte an geraden, 32 Bit Worte an jedem 4. Byte abgelegt. Dies nennt man aligned access. Das Gegenteil ist ein unaligned access, bei dem ein 16 Bit Wort an einer ungeraden Adresse abgelegt wird, oder ein 32 Bit Wort an einer Adresse, die nicht durch 4 teilbar ist. Unabhängig davon ist das Speicher-Interface zum externen Speicher dafür verantwortlich, diese Speicherzugriffe korrekt auszuführen. Ist der externe Speicher z.B. 16 Bit breit, dann darf ein 8 Bit Schreibzugriff z.B. nur die Hälfte des Wortes ändern, der andere Teil darf nicht geändert werden. Die Hardware muss so gebaut werden, dass dies möglich ist. Bei einem 32 Bit Schreibzugriff muss der externe Speicher in diesem Fall 2 16 Bit Zugriffe ausführen. Dies geschieht immer transparent für den Prozessor, dieser sollte (außer an der Geschwindigkeit) keinen Unterschied sehen, ob der externe Speicher nun mit 8 Bit Zugriffen, 16 oder 32 Bit Zugriffen arbeitet. Manche Prozessoren erlauben das Schreiben oder Lesen von "unaligned" Daten, manche nicht. In jedem Fall geht das aber auf Kosten von Geschwindigkeit, da z.B. ein unaligned Schreibzugriff von 16 Bit Daten auf Speicheradresse 35 erfordert, dass einmal die Speicheradresse 34 und dann die 36 geschrieben wird.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.