Arduinoから擬似「1 bit DRAM」を制御
擬似的な「1 bit DRAM」をマイコン(Arduino)から制御する。
DRAMの原理
上記URLなどに適切な説明が見つかる。MOSFETやトランジスタとコンデンサを利用し、電化の有無で、'1'を'0'を記憶するものである。最後のサイトの図を使って説明。
Write
"W"ラインをHighにして、"B"ラインをHighまたはLowにして、コンデンサに'1'または'0'の状態をつくる。
Read
"W"ラインをHighにして、"B"ラインの状態を読み込み、Highであれば'1'、Lowであれば'0'と判断する。ただし、'1'の場合、放電されてしまうため、再度、"B"ラインをHighにして、コンデンサに'1'の状態をつくることが必要である。
実回路
接続は下記のとおり。
MOSFET | 接続先 |
---|---|
Gate | Arduino Pin 2 |
Drain | Arduino Pin 4 |
Source | Capcitor & GND |
ソースコード
#define G_PIN 2
#define D_PIN 4
void setup() {
Serial.begin(9600);
pinMode(G_PIN, OUTPUT);
}
void write_data(uint8_t data) {
digitalWrite(G_PIN, HIGH);
pinMode(D_PIN, OUTPUT);
Serial.print("Write data: ");
Serial.println(data);
digitalWrite(D_PIN, (data? HIGH:LOW));
delay(1);
digitalWrite(G_PIN, LOW);
}
void read_data() {
digitalWrite(G_PIN, HIGH);
pinMode(D_PIN, INPUT);
uint8_t data = digitalRead(D_PIN);
Serial.print("Read data: ");
Serial.println(data);
if (data) { // ①
pinMode(D_PIN, OUTPUT); // ①
digitalWrite(D_PIN, HIGH); // ①
} // ①
delay(1);
digitalWrite(G_PIN, LOW);
}
// 0: 0-Write 1: 1-Write Others: Read
void loop() {
if (Serial.available() > 0) {
String input = Serial.readStringUntil('\n');
uint8_t val = input.toInt();
if (val < 2) {
write_data(val);
} else {
read_data();
}
}
}
アルゴリズム的には下記となる。
シリアル入力 | 0 | 1 | それ以外 |
---|---|---|---|
Action | '0'書き込み | '1'書き込み | 読み込み |
※ エラー入力は未考慮
実験
'0'を書き込んだあとの読み取りは'0'、'1'を書き込んだあとの読み取りは'1'となり、期待どおりの動作をしている。
また、上記コードの①の部分をコメント化(読み込み後の書き込みなし)すると、下記のように、'1'の書き込み後、すぐに読み出せば'1'となるが、その後は'0'となる(期待どおり)。
終わりに
本当にこれで正しいのか自信はないが、DRAM制御の基本的な考え方はある程度理解したつもりである。