SRAM・DRAM・NOR・NAND・EEPROM・FRAM・MRAM・eMMC:メモリの違いと使い分け
「不揮発で、書き換えられて、速い」メモリはありません。あるのは、書き換え回数・容量・速度・価格のどれかを捨てたメモリです。何を捨ててよいかは用途で決まるので、用途から逆引きできるように整理します。
まず 3 つに分ける
メモリは、電源を切ると消える揮発性(SRAM、DRAM)、電源を切っても残るがブロック単位でしか消せないフラッシュ系(NOR、NAND、EEPROM、eMMC)、電源を切っても残りバイト単位で書ける新しい不揮発メモリ(FRAM、MRAM)の 3 群に分けると見通しがよくなります。
SDRAM は DRAM の一種(同期式)、DDR はさらにその世代名です。eMMC は NAND にコントローラを載せて 1 パッケージにしたもので、中身は NAND です。「FLASH」は NOR と NAND の総称で、EEPROM もフローティングゲートという意味では同じ原理ですが、バイト単位で書けるように作ったものを EEPROM と呼び分けます。
| 種類 | 揮発 | 容量 | 書き換え単位 | 書き換え回数 | 書き込み時間 | 主な用途 |
|---|---|---|---|---|---|---|
| SRAM | する | 数 kB〜数 MB | バイト | 無制限 | 数 ns | MCU 内蔵 RAM、キャッシュ |
| DRAM / SDRAM / DDR | する | 64MB〜数 GB | バイト(バースト) | 無制限 | 数十 ns | OS を動かす主記憶 |
| NOR フラッシュ | しない | 1MB〜256MB | 書き: バイト、消去: セクタ(4k〜64kB) | 10 万回 | 書き µs、消去 数百 ms | 起動コード、XIP |
| NAND フラッシュ(生) | しない | 1GB〜数 TB | 書き: ページ(数 kB)、消去: ブロック(MB) | SLC 10 万、TLC 3 千回 | 書き 数百 µs、消去 数 ms | 大容量データ |
| eMMC | しない | 4GB〜256GB | セクタ(512B、内部は NAND) | コントローラが管理 | 数百 µs〜 | Linux のルート FS |
| EEPROM | しない | 1kbit〜4Mbit | バイト | 100 万回 | 5ms(ページ) | 設定値、校正値 |
| FRAM | しない | 4kbit〜16Mbit | バイト | 10¹⁴ 回 | 数十 ns(待ちなし) | 頻繁に書く設定・ログ |
| MRAM | しない | 1Mbit〜1Gbit | バイト | 無制限(10¹⁵ 以上) | 数十 ns | 不揮発 SRAM の置き換え |
揮発性:SRAM と DRAM
SRAM は 1 ビットにトランジスタ 6 個を使うフリップフロップです。電源がある限り保持し、リフレッシュが要らず、アドレスを与えれば数 ns で読み書きできます。セルが大きいので容量あたりの価格が高く、マイコン内蔵で数十〜数百 kB、外付けのパラレル SRAM で数 MB が上限です。
DRAM は 1 ビットがトランジスタ 1 個とコンデンサ 1 個です。コンデンサの電荷は漏れるので、数十 ms ごとに読み出して書き戻す(リフレッシュ)必要があります。セルが小さく、GB 単位が安く手に入ります。SDRAM はクロックに同期してバースト転送する DRAM で、DDR / DDR2 / 3 / 4 / 5 とその低電力版 LPDDR がその世代です。
DRAM を使うには、リフレッシュ・バンク管理・タイミング制御を行うメモリコントローラがプロセッサ側に要ります。コントローラを持たないマイコンには DRAM はつなげません。逆に、Linux を動かすプロセッサには必ず DDR コントローラがあり、数百 MB 以上の主記憶として DRAM を前提にしています。
選択の基準は単純で、数 MB 以下なら SRAM、それ以上なら DRAMです。中間の「数 MB の SRAM が欲しい」は価格が合わず、QSPI 接続の疑似 SRAM(PSRAM、内部は DRAM でリフレッシュを内蔵)が使われます。
フラッシュ系:NOR、NAND、EEPROM、eMMC
フラッシュはフローティングゲートに電子を閉じ込めて記憶します。書き込み(電子を入れる)はビット単位でできますが、消去(電子を抜く)はまとまった単位でしか行えません。「1 を 0 にはできるが、0 を 1 に戻すには消去が要る」と覚えると、ほぼすべての制約が説明できます。
NOR フラッシュは、セルが並列につながっていて、任意のアドレスをランダムに読めます。プロセッサが直接命令を読み出す(XIP、Execute In Place)ことができるので、起動コードやファームウェアの置き場です。SPI / QSPI 接続の 1〜256MB が主流。消去はセクタ単位(4kB〜64kB)で数百 ms かかり、書き換え回数は 10 万回程度です。
NAND フラッシュは、セルを直列につないで面積を詰めたもので、ページ(数 kB)単位でしか読み書きできず、消去はブロック(数百 kB〜数 MB)単位です。ビットエラーが日常的に起き、ECC(誤り訂正)と不良ブロック管理が必須です。SLC(1 ビット/セル)で 10 万回、MLC で 1 万回、TLC で 3 千回、QLC で 1 千回と、多値化するほど安く、書き換えに弱くなります。
eMMC は NAND にコントローラを載せて、ECC・ウェアレベリング・不良ブロック管理を内部で済ませたものです。外からは 512B セクタの読み書きだけで、SD カードと同じ MMC インターフェースでつなぎます。Linux のルートファイルシステムを置く標準的な選択肢で、生の NAND を扱う手間(Linux なら MTD + UBI)を省けます。
EEPROM は、バイト単位で消去・書き込みできるように作った不揮発メモリです。容量は小さく(数 kbit〜数 Mbit)、書き込みに 5ms 程度かかりますが、100 万回書け、I²C / SPI で数十円からあります。設定値・校正値・シリアル番号の置き場です。
「フラッシュに設定値を保存する」設計は、消去単位と回数の制約にぶつかります。4kB セクタに 16 バイトの設定を書き換えるたびに消去すると、10 万回で寿命です。ウェアレベリング(セクタ内で書く位置をずらす)を自分で実装するか、EEPROM か FRAM を別に持つほうが確実です。
FRAM と MRAM:バイト単位で書ける不揮発
FRAM(強誘電体メモリ)は、強誘電体の分極方向で記憶します。SRAM と同じようにバイト単位で、待ち時間なしで書け(書き込みサイクル数十 ns)、10¹⁴ 回書き換えられます。EEPROM の 5ms の書き込み待ちがなく、書き込み中に電源が落ちてもデータが壊れません。容量は 16Mbit 程度までで、EEPROM より高価です。読み出しで分極が壊れるので内部で書き戻しており、読み出し回数にも上限がありますが、10¹⁴ 回なので実用上は無制限です。
MRAM(磁気抵抗メモリ)は、磁性層の磁化方向で記憶します。書き換え回数は事実上無制限で、SRAM と同じ速度・インターフェースの品種があり、電池でバックアップした SRAM の置き換えとして使われます。STT-MRAM で 1Gbit 級まで出ていますが、価格は DRAM の数十倍です。強い磁界に弱い品種があるので、実装位置に注意します。
どちらも、「頻繁に書く、電源断があり得る、容量は小さくてよい」という用途に向きます。積算値、稼働時間、直近のイベントログ、電源断時の状態保存などです。フラッシュで同じことをするには、ウェアレベリングと電源断対策のジャーナリングが要り、それを作るより FRAM を 1 個足すほうが安く済むことがほとんどです。
用途から選ぶ
- 起動コード・ファームウェア。マイコン内蔵フラッシュで足りなければ QSPI NOR。XIP できること、ランダム読み出しが速いことが理由。NAND は起動用の小さな NOR と組み合わせるか、eMMC のブートパーティションを使う。
- 作業用メモリ。数百 kB までは内蔵 SRAM、数 MB なら PSRAM か外付け SRAM、それ以上は DDR(コントローラを持つプロセッサが前提)。
- 設定値・校正値(書き換えは年に数回〜日に数回)。I²C EEPROM。マイコン内蔵フラッシュのエミュレーションでもよいが、消去単位と回数を計算する。
- 積算値・カウンタ・状態(秒〜分ごとに書く)。FRAM か MRAM。EEPROM では 100 万回を数週間で使い切る。
- ログ・測定データ(大量、追記)。SPI NAND か eMMC か SD カード。生 NAND は ECC と不良ブロック管理を自分で持つ覚悟が要る。
- OS のファイルシステム。eMMC。SD カードは抜き差し・粗悪品のリスクがあり、量産品では eMMC が標準。
- 電源断で消えてはいけない直前の状態。FRAM か MRAM。書き込み中の電源断でデータが壊れない。
よくある失敗
- フラッシュに毎秒書く。消去回数の上限に数日で達する。FRAM に替えるか、RAM に貯めて間隔を空けて書く。
- EEPROM の書き込み完了を待たない。書き込み中(5ms)に次の書き込みやリードをすると、応答しない(ACK ポーリングで待つ)。
- 書き込み中の電源断。フラッシュも EEPROM も、書き込み中に電源が落ちるとそのページが不定になる。2 面に交互に書いて CRC で選ぶか、FRAM を使う。
- 生 NAND を ECC なしで使う。出荷時から不良ブロックがあり、使用中にビット化けする。SLC でも ECC は必須。
- eMMC の寿命を無視する。内部は TLC NAND で、書き込み総量に上限がある(TBW)。ログを高頻度で書く用途では、寿命を計算し、SLC モードや産業用グレードを検討する。
- DRAM の配線を軽く見る。DDR3 以上は等長・インピーダンス・終端の設計が要り、4 層では厳しい。メモリを載せたモジュール(SOM)を使う選択肢も含めて判断する。
- MRAM の近くに磁石を置く。スピーカやリレー、ホールセンサ用の磁石が近いとデータが化ける品種がある。データシートの磁界耐性を確認する。
よくある質問
EEPROM とフラッシュの違いは何ですか。
SDRAM と DDR は別のものですか。
eMMC と SD カードは何が違いますか。
FRAM と MRAM のどちらを選べばよいですか。
参考にした規格・資料
- JEDEC JESD79 シリーズ / JESD84(eMMC) — DDR SDRAM と eMMC の規格
- ONFI(Open NAND Flash Interface)仕様 — 生 NAND のインターフェースと ECC 要件
- 各メモリメーカのデータシート — 書き換え回数、データ保持期間、書き込み時間、TBW