In this project I'm driving an old 1MB DRAM SIMM memory module with an Arduino Uno board.
The module I use is a KMM591000BN-7 manufactured by Samsungs Electronics in 10/1994.
It consists of two KM44C1000BJ 1Mx4 modules, and one KM41C1000CJ 1Mx1, so it has a total capacity of 1M bit x 9: 1M x (8bits + 1 parity bit).
I have soldered a 30-pins male header so I can plug it on a breadboard.
| Link | Description | Author |
|---|---|---|
| KMM591000BN | KMM591000BN-7 Datasheet | Samsungs Electronics |
| KM44C1000BJ | KM44C1000CJ Datasheet | Samsungs Electronics |
| KM44C1000BJ | KM41C1000CJ Datasheet | Samsungs Electronics |
| Understanding DRAM Operation | Understanding DRAM Operation | IBM |
We get the pins configuration of the SIMM module from the Datasheet. This is how I choose to map them to the Arduino board.
Due to the limited pin number of the Arduino Uno, I have used 4 bit of address bus (A0 to A3) and 4 bits of Data bus (DQ0 to DQ3):
Shematics available as Fritzing file.
Code for the Arduino sketch.
At reset or power up the Arduino should run the DRAM initialization protocol, run some tests that should verify everything is wired correctly, then show a memory dump, and show the instructions:
DRAM Initialization
Test 1
Test 2
Test 3
Memory dump:
0 1 2 3 4 5 6 7 8 9 A B C D E F
0: F F F F F F F F F F F F F F F F
1: F F F F F F F F F F F F F F F F
2: F F F F F F F F F F F F F F F F
3: F F F F F F F F F F F F F F F F
4: F F F F F F F F F F F F F F F F
5: F F F F F F F F F F F F F F F F
6: F F F F F F F F F F F F F F F F
7: F F F F F F F F F F F F F F F F
8: F F F F F F F F F F F F F F F F
9: F F F F F F F F F F F F F F F F
A: F F F F F F F F F F F F F F F F
B: F F F F F F F F F F F F F F F F
C: F F F F F F F F F F F F F F F F
D: F F F F F F F F F F F F F F F F
E: F F F F F F F F F F F F F F F F
F: F F F F F F F F F F F F F F F F
sum=F00
End of tests
Instruction:
w A D: write D(hex) at A(hex)
r A : read data at A(hex)
f D : fill all memory with D
d : dump memory map (formated)
D : dump memory, one line
z : refresh
w A5 0
d
Should output:
Memory dump:
0 1 2 3 4 5 6 7 8 9 A B C D E F
0: F F F F F F F F F F F F F F F F
1: F F F F F F F F F F F F F F F F
2: F F F F F F F F F F F F F F F F
3: F F F F F F F F F F F F F F F F
4: F F F F F F F F F F F F F F F F
5: F F F F F F F F F F F F F F F F
6: F F F F F F F F F F F F F F F F
7: F F F F F F F F F F F F F F F F
8: F F F F F F F F F F F F F F F F
9: F F F F F F F F F F F F F F F F
A: F F F F F 0 F F F F F F F F F F
B: F F F F F F F F F F F F F F F F
C: F F F F F F F F F F F F F F F F
D: F F F F F F F F F F F F F F F F
E: F F F F F F F F F F F F F F F F
F: F F F F F F F F F F F F F F F F
sum=EF1
-
Implement on-demand RAM refresh - Implement periodic RAM refresh
-
Implement different Row/Col addresses - Implement Fast page writing/reading
- Use all address and data with, either:
- serializing input/output with shift-registers (would reduce pins necesarry, but would slow the operation)
- using an Arduino Mega (more GPIO pins)
- Use Arduino port registers manipulation to operate the DRAM
- May need to reorganize the pins to put each DRAM bus on the same port register of the Arduino, to be able to assert all the pins of a same bus at the same time.
- Thanks to juhannuskameli's blog for his article, from where I have taken the initial inspiration for the code.



