Speichertypen und Zugriff auf Speicher
In diesem Artikel soll es darum gehen, welche Speicherarten es gibt und wie man auf den Speicher im Inneren des Chips zugreift.Denn mein geplanter 8-Bit-Breadboard-Computer braucht natürlich auch einen Speicher, in dem dem das Programm abläuft und einen, in dem er Variablen ablegen kann.
Aber welche Speicherarten gibt es eigentlich, und welche sind die richtigen für unsere Zwecke?
Speicherarten
Speicherart | Chipbezeichnung | Beschreibung | Foto |
---|---|---|---|
ROM | HS 23 nnn oder individuelle Hersteller-bezeichnung | Nur-Lese-Speicher (Read Only Memory). Die Chipstrukturen werden schon bei der Herstellung in der Fabrik festgelegt und können nicht mehr geändert werden. Es ist eine aufwendige Schablone, eine Maske für die Herstellung anzufertigen. Die Fertigung lohnt sich für sehr große Stückzahlen mit immer dem selben Speicherinhalt. Die Speicherinhalte sind nicht flüchtig, also bleiben auch ohne Stromversorgung erhalten, aufgrund der festen Strukturen bestimmt jahrhundertelang. Der millionfach verkaufte C64 hat z. B. drei ROMs für Character (Zeichendarstellung, 4KB), Kernal (8 KB) und Basic (8 KB). | ![]() |
PROM | HS 27 X nnn - mm | PROM steht für Programmable Read Only Memory. Dieser Nur-Lese-Speicher kann genau ein mal beschrieben werden und danach nur noch gelesen. Das Beschreiben geschieht mithilfe elektrischen Spannung. Der Speicherinhalt ist nicht flüchtig und hält viele Jahrzehnte. Den PROMs in Funktion sehr ähnlich sind OTP-ROMs (one-time programmable ROM), das sind EPROMs, denen einfach aus Kostenersparnisgründen das Fenster zum Löschen fehlt. PROMs sind günstiger als EPROMs und werden überall dort eingesetzt, wo der Speicherinhalt unverändert bleibt und die Stückzahlen die Einmalkosten für ein Masken-ROM nicht rechtfertigen. | ![]() |
EPROM | HS 27 X nnn - mm | EPROM steht für Erasable Programmable Read Only Memory. Das heißt, es kann wieder beschrieben werden, nachdem es gelöscht wurde. Allerdings ist die Löschung nicht ganz einfach und erfolgt mit UV-Licht, entweder mit einem UV-Löschgerät in Sekunden oder durch stundenlanges Legen in die Sonne (möglichst nicht hinter UV-absorbierendes Fensterglas). Auch das Beschreiben ist nicht ganz einfach, muss es doch häufig mit hohen Spannungen bis zu 15 Volt erfolgen, was ein spezielles Gerät, einen Eprommer erforderlich macht. Vielleicht spricht man auch wegen der hohen Spanunngen vom "EPROM brennen" für den Schreibvorgang. Außerdem ist nach 100 bis 200 mal löschen und beschreiben Schluss, dann funktioniert das EPROM nicht mehr. EPROMs sind aber günstig und halten die Daten viele jahrzehntelang auch ohne Strom, vorausgesetzt, man schützt es vor UV-Licht - dies ist auch der Grund von Aufklebern über den Fensterchen eines EPROMs. Es ist also die richtige Wahl für mittlere Stückzahlen, die die Anschaffung eines Eprommers (ab ca. 60 Euro) rechtfertigt. | ![]() |
EEPROM | HS 28 X nnn - mm | EEPROM steht für Electric Erasable Programmable Read Only Memory. Hier tut man sich mit dem Löschen und Wiederbeschreiben sehr viel einfacher, weil das Löschen sowie das Beschreiben mit elektrischer Spannung um die 5 Volt passieren kann. Es reicht also ein Mikrocontroller wie der Arduino zum Beschreiben aus. EEPROMs sind ein wenig teurer als EPROMs oder waren es zumindest einmal. Heute sind sie die meist die richtige Wahl. Sie halten die Speicherinhalte ohne Strom für mehrere Jahrzehnte und sind 10'000 bis 100'000 mal wieerbeschreibbar. Beim EEPROM wird (in Gegensatz zum Flash) jedes Byte einzeln geschrieben. | ![]() |
Flash | HS 28 X nnn - mm | Flash-Chips sind EEPROMs mit einer Besonderheit: vor dem Beschreiben muss der gesamte betroffene Datensektor gelöscht werden. Dafür ist Flash beim Lesen schneller als EEPROM (aber nicht so schnell wie ROM). Flash ist schnell, günstig herzustellen und kommt in den meisten modernen Applikationen zur Anwendung: als Speicher in Mikrocontrollern, zur Ablage von BIOS-Daten im Computer und allgemein Daten in elektrischen Geräten, als SSD (Solid State Disk, schneller Festplattenersatz) oder als USB-Speichersticks. Man unterscheidet zwischen Flash in NAND und NOR-Technologie, die jeweils aus diesen Gatter-Typen (siehe auch dieser Artikel) aufgebaut sind. NOR-Flash ist schneller als NAND-Flash. Flash-Speicher ist nicht flüchtig, 10'000 bis 1'000'000 (NAND ca. 10x öfter als NOR) mal wiederbeschreibbar und hält Daten einige Jahrzehnte lang. | ![]() |
SRAM | HS 62 X nnn - mm | SRAM steht für Static Random Access Memory. RAM hat keine Beschränkungen in der Anzahl der Lese- oder Schriebzugriffe und ist sehr schnell. Dafür verliert es den Speicherinhalt aber auch, sobald die Stromversorgung nicht mehr da ist. RAM muss von dem Beschreiben nicht erst gelöscht werden und wird mit geringen Spannungen um 5 Volt (oder weniger) beschrieben. Das "Static" bedeutet, dass das RAM seinen Speicherinhalt solange beibehält, wie Strom da ist - im Gegensatz zum DRAM, dass immer wieder aufgefrischt werden möchte. RAM ist im allgemeinen teurer als ROM und SRAM ist teurer als DRAM. Als Technologie kommen Flip-Flops in Form von bistalen Kippstufen (siehe auch diesen Artikel) zur Anwendung. | ![]() |
DRAM | unterschiedlich | DRAM steht für Dynamic Random Access Memory. DRAM ist günstiger als SRAM, da es eine andere Technologie zur Speicherung verwendet: winzige Kondensatoren, die über Transistoren gelesen oder beschrieben werden. Die Technologie bringt es mit sich, dass der Speicherinhalt alles zig Millisekunden aufgefrischt werden muss, man spricht dabei von einem Refresh. Dies erfordert natürlich zusätzliche Schaltungen für den Refresh, aber dort, wo es auf großen Speicher ankommt, rentiert sich der Mehraufwand schnell. Natürlich ist auch DRAM flüchtig, besonders flüchtig sozusagen - erfolgt der Refresh nicht schnell genug, ist der Speicherinhalt verloren. | ![]() |
*HS = Herstellerkürzel
X = Speichertechnologie (z. B. C=CMOS, F=Flash etc.)
nnn = Speichergröße in Kilobit (16, 32, 64, 128, 256, 512) bzw. Megabit (010, 020, 040, ...)
mm = Zugriffsgeschwindigkeit
Meistens erfolgt der Zugriff durch Parallelzugriff über entsprechend viele Adressleitungen - für ein 2716 mit 16 Kilobit, also 2048 Bytes Speicher reichen z. B. 11, weil damit binär 0 bis 211-1 Adressen ansprechbar sind, und das sind 2047. Für ein 28F040 mit 4 Megabit, gleich 524'288 Bytes braucht es schon 19 Adressleitungen. Mit mehr Speicher braucht es also auch mehr Beinchen am Chip, um die Adressleitungen ansprechen zu können.
Beim Parallelzugriff hat man außerdem noch 8 Datenleitungen, für jedes Bit eines Bytes eine, denn es werden immer gleich 8 Bit pro Adresse übertragen. Außerdem gibt es die meist die Leitungen CE für Chip Enable (Chip ansprechbar machen), OE Output Enable (Lesemodus) und WE für Write enable (Schreibmodus).
Es gibt aber auch EEPROMs mit seriellem Zugriff, die das I2C-Protokoll oder SPI-Protokoll benutzen. So kann ein 32 KB-EEPROM wie der ST24C256 (Foto siehe oben in der Tabelle bei EEPROM) mit nur acht Pins auskommen und in einem 4 x 3 mm SMD-Gehäuse unterkommen.
Der richtige Speicher für den 6502-Breadboard-Computer
Für meinen Breadboard-Computer habe ich mir als Prozessor den 6502 ausgesucht. Die MOS 6502 CPU war Ende der 1970er / Anfang der 1980er Jahren sehr populär und wurde in vielen Heimcomputern eingesetzt, wie dem Commodore PET 2001, VC20 und C64 (dort der Nachfolger 6510), dem Atari 800, sowie dem Apple I und Apple ][.Der 6502 ist eine 8-Bit-Prozessor mit 40 Pins. Ich habe mir eine CPU von Rockwell und eine von Western Design Center bestellt. Leider sind beide noch nicht angekommen, aber wir können uns ja schon man das Pinout der beiden anschauen:
Der Rockwell ist Pin-Kompatibel zum MOS 6502, der auch im VC20 steckt. Der WDC ist eine modernere Variante, bei der auch Pin 5 (ML, Memory Lock) und Pin 36 (BE, Bus Enable) belegt sind. Außerdem kennt der WDC ein paar Opcodes mehr und lässt sich höher takten. Wie man sieht, verfügt der 6502 über 16 Adressleitungen, womit er binär 216 = 65'536 Bytes adressieren kann. Er kann also 64 KB Speicher ansprechen. Jetzt brauche ich natürlich irgendeine Möglichkeit, Instruktionen in die CPU zu laden, um sie dort auszuführen, sprich einen nicht flüchtigen Programmspeicher (PROM). Außerdem brauche ich ein RAM, um dort Variablen, Stack etc. zu speichern. Es empfiehlt sich wohl, den Speicher in 2 Segmente zu teilen:
Für die Chips sieht es also immer so aus, als würden max. 32 KB adressiert. Der 6502 benutzt aber die gesamte 64 KB, die unteren 32 KB stehen für das RAM und die oberen 32 KB für das ROM. Adressiert der 6502 über 0x7FFF, dann ist A15 High und triggert mit einem invertierten A15 die CE-Leitung des ROMs. Adressiert er unter 0x8000, dann ist A15 Low und triggert die CE-Leitung des RAMs. So wird anhand der Speicheradresse automatisch zwischen Zugriff auf das RAM bzw. das ROM gewechselt. ![]() Warum das ROM in der oberen und das RAM in der unteren Speicherhälfte? Das hat einen ganz pragmatischen Grund: weil der 6502 so konstruiert ist, dass er beim Reset bei 0xFFFC und 0xFFFD nachschaut, wo er seine Instruktionen findet, also das Programm starten soll. The program counter is loaded with the reset vector from locations FFFC (low byte) and FFFD (high byte). This is the start location for program control. (Quelle: WDC 65C02-Datasheet)Und da wir das Programm im ROM liegen haben wollen, muss das ROM die obere Speicherhälfte benutzen. Das PROMDa ich anfangs nur die nackte CPU und kein Betriebssystem oder ähnliches habe, bleibt mir nichts anderes übrig, als den 6502 in direkter Maschinensprache, in Instruktionen, sogenannten Opcodes zu programmieren. Hier stehen die Zahlen 0x00 bis 0xFF jeweils für einen Befehl, dem dann eine festgelegte Anzahl Bytes Daten folgen können. Beispielsweise steht 0xEA für den einfachsten aller Befehle: NOP, No Operation. NOP ist ein 1-Byte-Befehl und macht nichts anderes, als für 2 Taktzylen nichts zu tun.In der Speicherzelle des Program Counters muss also 0xEA stehen, will ich, dass die CPU ein NOP ausführt. Aber ich kann es auch ein wenig einfacher haben. Mit einem Assembler. Dies ist im Grunde ein Editor, in den ich NOP und andere Befehle eingebe und der dann daraus später ein 0xEA macht. Die meist dreistellige Befehle sind einfacher zu merken als durchnummerierte OpCodes. Außerdem kann man mit dem Assember Sprungmarken vergeben und muss nicht jedes Bytes einzeln abzählen, an welche Adresse die CPU bei einem JMP (für Jump) denn nun springen muss. Das Programm (also die binäre Repräsentation der OpCodes) muss irgendwo hin. ROM und PROM sind Unsinn, denn ich werde mein Programm häufiger debuggen und ändern müssen. EPROMs müssten immer zwischendurch mit UV gelöscht werden - auch das ist zu aufwendig. Am einfachsten wäre ein EEPROM oder ein Flash mit mindestens 32 KB. Ein EEPROM ist am einfachsten zu programmieren. Das ginge sogar mit einer Schaltung und einem Arduino - für die Programmierung braucht es 5 Volt, womit STM32, ESP8266 etc. ausscheiden. Der Arduino kann danndie zwei Bytes der zu schreibenden Adresse über zwei 74HC595 Schieberegister (die Adresse ist ja write only) setzen und dann über 8 Datenleitungen ein Byte in das EEPROM schreiben, indem es CE auf Low hält und WE auf Low pulst. Im Grunde genommen ginge es auch mit 23 Kippschaltern (oder DIP-Schaltern, 15 für die Adressbits und 8 für die Datenbits) und einem Write-Taster. Byte für Byte, binär kodiert. Aber das ist nur etwas für den absoluten Masochisten. Bei der Arduino-Eprommer-Lösung könnte ich die Daten über den seriellen Port vom PC an den Arduino schicken und von dort aus dann an das EEPROM. Aber ich werde ich mir noch einfacher machen und habe mir einen Eprommer zugelegt. Mit der mitgelieferten Software muss ich nur eine Datei mit den Binärdaten (die der Assembler liefert) auswählen, den Chiptyp auswählen und schon schreibt er das Programm auf das EEPROM. Mit einem Eprommer ist es dann auch egal, ob ich ein EEPROM oder ein Flash beschreibe. Die Arbeit erledigt eh der Eprommer für mich. Und das Schreibprozedere mit Schreibschutz entfernen, Speicher löschen, Speicher schreiben muss mich nicht sonderlich interessieren. Nur parallel muss es sein, denn sonst ist keine Verbindung über die Adressleitungen zum 6502 möglich. Und es muss mindestens 32 KB haben. Wenn es mehr sind, schadet das auch nicht, denn dann werden einfach nur die untersten 32 KB gelesen. Ein AT28C256-EEPROM mit 32 KB wäre also zum Beispiel eine gute Wahl. Oder aber ich benutze gleich ein 4 Megabit-Chip wie den SST39F040. Der ist auch nicht viel teurer, wenn nicht sogar günstiger, denn die alten 32 KB-EEPROMs sind nicht mehr unbedingt gebräuchlich, schwierig zu bekommen und dann evtl. sogar teurer. Der F040 hat dann natürlich ein paar Adressleitungen mehr, nämlich A0 bis A18 (macht 2 19 = 524'288 (0x0'0000 bis 0x7'FFFF) Bytes Speicherplatz. Und den müssen wir gar nicht verschenken, denn wir können uns einen Trick zunutze machen: A0 bis A14 sind für die 32 KB Speicher, A15 der CPU wird für das Chip Enable gebraucht und ist damit am ROM frei. Und A16, A17, A18 sind noch nicht angeschlossen. Schließe ich diese 4 Leitungen an DIP-Switches an, dann kann ich die Adresse per Hand umschalten und auf 16 unterschiedliche Speicherbereiche zugreifen: A18 A17 A16 A15 Adresse im F040
0 0 0 0 0x0'0000 ... 0x0'7FFF Programm 1
0 0 0 1 0x0'8000 ... 0x0'FFFF Programm 2
0 0 1 0 0x1'0000 ... 0x1'7FFF Programm 3
0 0 1 1 0x1'8000 ... 0x1'FFFF Programm 4
0 1 0 0 0x2'0000 ... 0x2'7FFF Programm 5
0 1 0 1 0x2'8000 ... 0x2'FFFF Programm 6
0 1 1 0 0x3'0000 ... 0x3'7FFF Programm 7
0 1 1 1 0x3'8000 ... 0x3'FFFF Programm 8
1 0 0 0 0x4'0000 ... 0x4'7FFF Programm 9
1 0 0 1 0x4'8000 ... 0x4'FFFF Programm 10
1 0 1 0 0x5'0000 ... 0x5'7FFF Programm 11
1 0 1 1 0x5'8000 ... 0x5'FFFF Programm 12
1 1 0 0 0x6'0000 ... 0x6'7FFF Programm 13
1 1 0 1 0x6'8000 ... 0x6'FFFF Programm 14
1 1 1 0 0x7'0000 ... 0x7'7FFF Programm 15
1 1 1 1 0x7'8000 ... 0x7'FFFF Programm 16
So kann ich 16 Programme parallel auf einem EEPROM verwalten. In der Eprommer-Software wähle ich einfach 0x0'0... für das 1. Programm oder 0x0'8... für das zweite als Startadresse zum Schreiben des 32 KB Progammcodes. Später, wenn alles fertig ist, kann ich dann zwischen 16 unterschiedlichen Programme per Schalter wählen, die der Breadboard-Computer ausführen soll.Werfen wir einmal einen Blick auf das F040 mit 4 Mbit und das C256 - EEPROM mit 256 kBit:
|