概要
DRAM(Dynamic Random Access Memory: ダイナミックRAM)は、1個のトランジスタと1個のキャパシタ(コンデンサ)でデータを記憶する揮発性半導体メモリです。「ダイナミック」の名称は、キャパシタの電荷が時間とともに自然放電するため、定期的にリフレッシュ(再書き込み)する必要があることに由来します。
DRAMはSRAMと比較してセルが単純(1T1C構造)なため、高集積度・大容量・低コストを実現できます。現在のPCやスマートフォン・組み込みLinux機のGBクラス主記憶は、ほぼすべてDRAMで構成されています。
組み込みシステムでは、DRAMはLinuxカーネル・アプリケーション・フレームバッファなど大容量メモリを必要とするシステムで使われます。マイコン(MCU)ベースの小規模システムでは内蔵SRAMで間に合うことが多く、DRAMはMPU・SoCベースの組み込みLinux機で主に利用されます。
歴史・背景
DRAMは1966年にIBMのRobert Dennardが発明し、1970年にIntelが「1103」として世界初の商用DRAM(1Kbit)を発売しました。磁気コアメモリを置き換える半導体メモリとして急速に普及し、PCメモリの標準となりました。
1990年代にSDRAM(Synchronous DRAM)が登場し、クロック同期でデータを転送できるようになりました。DDR(Double Data Rate)SDRAMは2000年に登場し、クロックの立ち上がりと立ち下がりの両方でデータを転送することで帯域幅を倍増しました。
その後、DDR2(2003年)・DDR3(2007年)・DDR4(2014年)・DDR5(2020年)と世代を重ね、転送速度と消費電力効率が向上し続けています。
組み込み向けにはLPDDR(Low Power DDR)シリーズが開発されました。LPDDR4では最大4267MT/s、LPDDR5では最大6400MT/sを実現し、スマートフォン・タブレット・組み込みLinux機の主記憶として広く使われています。車載向けにはWide I/O・LPDDR4Xが使われ、自動運転ECUでは高帯域幅が求められることからGDDR6やHBMも採用事例があります。
技術仕様
規格別スペック比較
| 規格 | 転送レート | 動作電圧 | バス幅 | 帯域幅(x64) |
|---|---|---|---|---|
| DDR3-1600 | 1600MT/s | 1.5V | 64bit | 12.8GB/s |
| DDR4-3200 | 3200MT/s | 1.2V | 64bit | 25.6GB/s |
| DDR5-6400 | 6400MT/s | 1.1V | 64bit | 51.2GB/s |
| LPDDR4-4267 | 4267MT/s | 1.1V | 32/64bit | 34.1GB/s |
| LPDDR5-6400 | 6400MT/s | 1.05V | 16/32bit | 51.2GB/s |
組み込み向けDRAM規格
| 規格 | 特徴 | 用途 |
|---|---|---|
| LPDDR4/4X | 低電力、〜4267MT/s | スマホ・組み込みLinux |
| LPDDR5 | さらに低電力・高速 | 最新スマホ・AIエッジ |
| DDR3L (1.35V) | 低電圧版DDR3 | 産業用SBC(Raspberry Pi等) |
| SDRAM (133MHz) | 旧来、低コスト | マイコン外付け、レガシー |
| HyperRAM | SPI互換・低ピン数 | マイコン外付け拡張RAM |
リフレッシュ特性
DRAMセルのキャパシタは約64ms以内にリフレッシュが必要です。DRAMコントローラが自動的に行いますが、リフレッシュ中はメモリアクセスが一時停止するため、リアルタイム性に影響します。
- リフレッシュ周期: 64ms(標準温度)、32ms(高温: 85℃以上)
- リフレッシュコマンド: tREFIごと(例: DDR4-8GBit = 7.8µs間隔)
動作原理
セル構造(1T1C)
DRAMの最小セルは1個のアクセストランジスタ(T)と1個のストレージキャパシタ(C)で構成されます:
ワード線(WL)
|
┌───[T]───┐
| |
ビット線 キャパシタ(C)
(BL) |
GND
キャパシタに電荷が蓄積されているかどうかで1ビットを表します。電荷がある→「1」、ない→「0」。ただし自然放電するため、定期的にリフレッシュが必要です。
読み出し・書き込み
読み出し(Destructive Read):
- ビット線をVDD/2にプリチャージ
- ワード線をHighにしてセルのトランジスタをON
- キャパシタの電荷がビット線に流れ込み、電位が微小変化(数十mV)
- センスアンプがこの差を増幅して「0」「1」を判定
- 読み出し後にセルへ書き戻し(リストア)が必要
書き込み:
- ワード線をHighにしてアクセストランジスタをON
- ビット線に強制的にVDDまたはGNDをドライブ
- キャパシタが充電または放電される
DDRの動作原理
DDR(Double Data Rate)はクロックの立ち上がりと立ち下がりの両方でデータを転送します:
CLK: ___/‾‾‾\___/‾‾‾\___/‾‾‾\___
DQ : |D0 |D1 |D2 |D3 |D4 |D5 |
↑ ↑ ↑ ↑ ↑ ↑
立上 立下 立上 立下 立上 立下
DDR5では1クロックで16バイト(128ビット)のバーストが可能です。
リフレッシュ動作
DRAMコントローラはタイマーによって定期的にAuto-Refresh(自動リフレッシュ)コマンドを発行します。リフレッシュ中は全行(Row)を順番にリフレッシュします(Row Hammering対策含む)。リフレッシュ中のメモリアクセスは一時停止(tRFC: 数十〜数百ns)します。
用途・ユースケース
組み込みLinuxの主記憶
Raspberry Pi(LPDDR4/5)・NVIDIA Jetson(LPDDR5)・STM32MP1(DDR3L)など、組み込みLinuxを動かすSBC・SoMはすべてDRAMを搭載しています。Linuxカーネル・デバイスツリー・ルートファイルシステム・アプリケーションを展開するために、最低256MB〜数GBのDRAMが必要です。
# メモリ使用量確認
$ free -h
total used free shared buff/cache available
Mem: 1.8G 512M 800M 20M 512M 1.2G
Swap: 0B 0B 0B
# プロセスごとのメモリ使用量
$ top
PID USER RES SHR %MEM COMMAND
1234 root 256M 12M 14% myapp
フレームバッファ・グラフィックス
ディスプレイを持つ組み込み機器では、フレームバッファ(表示用ピクセルデータ)をDRAMに格納します。FHD(1920×1080)のRGB888フレームバッファは約6MB、4K(3840×2160)では約24MBです。GPUはDRAM(またはGDDR)から高速でデータを読み出してレンダリングします。
DDR外付け(マイコン+外付けDRAM)
STM32F4/H7の一部やAT32等の高性能マイコンはFMC(Flexible Memory Controller)を持ち、外付けSDRAMを接続できます。大きなバッファが必要な動画・グラフィック処理向けです。
// STM32 HALによる外付けSDRAM初期化例
SDRAM_HandleTypeDef hsdram;
FMC_SDRAM_TimingTypeDef SdramTiming;
hsdram.Init.SDBank = FMC_SDRAM_BANK1;
hsdram.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
hsdram.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
hsdram.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
hsdram.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
hsdram.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
hsdram.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;
HAL_SDRAM_Init(&hsdram, &SdramTiming);
HyperRAM(組み込みマイコン向け)
HyperBusインターフェース(SPI互換、8本の信号線)で接続するHyperRAM(Winbond・Cypress等)は、ピン数を抑えながら高速(〜333MB/s)にDRAMを拡張できます。ESP32-S3等の高性能マイコンの外部RAM拡張に使われます。
実装・開発のポイント
DDRタイミングパラメータの設定
DRAMを外付けする場合、正確なタイミングパラメータ(tRCD・tRP・tWR・tCL等)をDRAMのデータシートに従って設定する必要があります。誤った設定は動作不安定・データ化けの原因になります。
// タイミングパラメータ例(JEDEC DDR3-1333の場合)
// tCL (CAS Latency) = 9 クロック
// tRCD (RAS-to-CAS Delay) = 9 クロック
// tRP (Row Precharge) = 9 クロック
// tRAS (Row Active Time) = 24 クロック
ECC DRAM
サーバー・産業用途では1ビットエラーを訂正できるECC(Error Correcting Code)付きDRAMを使います。通常のDDR4は64bit幅ですが、ECC対応は72bit幅でチェックビットを付加します。組み込みではNVIDIA Jetsonの一部モデルがECC対応LPDDR5を搭載しています。
Rowhammer攻撃への対策
Rowhammerは、特定のDRAMセル行を連続アクセスすることで隣接行のビットを反転させるサイドチャネル攻撃です。重要なシステムではECC DRAMやTarget Row Refresh(TRR)対応製品を採用します。
メモリリークの監視
組み込みLinuxシステムではDRAMのメモリリークが長時間稼働で問題になります。valgrindやmassif(ヒーププロファイラ)、/proc/meminfo・/proc/PID/statusで定期的にモニタリングします。
# メモリリーク確認
watch -n 5 'cat /proc/meminfo | grep -E "MemFree|Cached|Buffers"'
# プロセスのメモリ使用量追跡
cat /proc/$(pgrep myapp)/status | grep VmRSS
他技術との比較
DRAM vs SRAM
| 項目 | DRAM | SRAM |
|---|---|---|
| セル構造 | 1T1C(単純) | 6T(複雑) |
| リフレッシュ | 必要 | 不要 |
| アクセス速度 | 遅い(数十ns) | 速い(数ns) |
| ビット単価 | 低い | 高い |
| 集積度 | 高い(GB級) | 低い(MB級以下) |
| 用途 | 主記憶 | キャッシュ・MCU RAM |
DRAM vs フラッシュ
| 項目 | DRAM | フラッシュ |
|---|---|---|
| 揮発性 | 揮発性 | 不揮発性 |
| 読み出し速度 | 高速(GB/s級) | 低速(100MB/s以下) |
| 書き込み速度 | 高速 | 遅い(ページ消去が必要) |
| 書き換え寿命 | 制限なし(実質無制限) | 有限(100〜100,000回) |
| 用途 | 実行時メモリ | 永続ストレージ |
組み込みLinuxシステムの基本構成は「フラッシュにOSを格納 → 起動時にDRAMに展開 → DRAM上でOSが動作」という役割分担です。