メモリ・ストレージ

フラッシュメモリ

電源を切っても消えない不揮発メモリ。プログラム格納に使う。

概要

フラッシュメモリ(Flash Memory)は、電源を切っても記憶内容が消えない不揮発性半導体メモリです。電気的に書き込み・消去ができ、機械的可動部を持たないため、ハードディスクより衝撃に強く、小型・低消費電力という特徴を持ちます。

組み込みシステムにおいてフラッシュメモリは欠かせない存在です。マイコン(MCU)内部に内蔵されるプログラム格納領域から、eMMC・SDカードといった外付けストレージまで、幅広い形態で利用されています。プログラムコード・設定データ・ファームウェアの保持に使われ、組み込み開発者が日常的に扱う最重要メモリ技術の一つです。

大きくNORフラッシュNANDフラッシュの2種類に分類され、用途・特性が大きく異なります。また、書き込み・消去の繰り返しによって劣化するという特性から、ウェアレベリングなどの管理技術が重要です。

歴史・背景

フラッシュメモリは1984年に東芝の舛岡富士雄氏が発明しました。EEPROMの課題であった「バイト単位での消去に時間がかかる」という問題を解決するため、ブロック単位で一括消去(フラッシュ消去)できる構造を考案したことが名称の由来です。

1988年にIntelが初の商用NORフラッシュを製品化し、主にBIOS格納などに利用されました。一方、舛岡氏が考案したNANDフラッシュは1989年に東芝が製品化し、高密度・大容量のデータストレージ用途で急速に普及しました。

2000年代以降、NANDフラッシュはデジタルカメラ・携帯電話・USBメモリといった民生機器に大量採用され、価格が急落。2010年代にはSSD(Solid State Drive)がHDDを置き換え始め、2020年代にはスマートフォン・データセンター・自動車・産業機器のあらゆる分野でフラッシュメモリが主役となっています。

セルの微細化技術も進化し、SLC(1ビット/セル)からMLC(2ビット/セル)・TLC(3ビット/セル)・QLC(4ビット/セル)へと大容量化が進む一方、書き換え耐久性とのトレードオフが課題となっています。

技術仕様

セル種別と特性

種別ビット数/セル書き換え回数読み出し速度用途
SLC (Single Level Cell)1100,000回以上高速産業用・高信頼要求
MLC (Multi Level Cell)23,000〜10,000回中程度コンシューマSSD
TLC (Triple Level Cell)31,000〜3,000回やや低速スマホ・大容量SSD
QLC (Quad Level Cell)4100〜1,000回低速大容量アーカイブ

NOR vs NAND 比較

項目NORフラッシュNANDフラッシュ
セル接続並列(AND回路なし)直列(NAND回路)
ランダムアクセス高速(バイト単位読み出し)低速(ページ単位)
書き込み単位バイト〜ワードページ(512B〜16KB)
消去単位セクタ(8KB〜64KB)ブロック(数百KB〜MB)
容量密度低い(MB〜数百MB)高い(GB〜TB)
用途コード実行(XIP)データストレージ

電気的特性

  • 動作電圧: 1.8V / 3.3V が一般的(製品により異なる)
  • 読み出し電流: 10〜50mA(動作時)、スタンバイ時は数十µA以下
  • 消去・書き込み電圧: 内部チャージポンプで高電圧(10〜20V)を生成
  • データ保持期間: 常温で10〜20年以上(ただし書き換え回数が増えると短くなる)
  • インターフェース: SPI・パラレル・ONFI (Open NAND Flash Interface)・Toggle DRAMなど

動作原理

フラッシュメモリの基本セルはフローティングゲートMOSFET(あるいは新世代のチャージトラップ型)です。

フローティングゲート構造

    コントロールゲート
         |
    酸化膜(トンネル酸化膜)
         |
    フローティングゲート  ← 電子をここに閉じ込める
         |
    酸化膜
         |
  ソース---|---ドレイン
         基板

書き込み(プログラム)

フローティングゲートに電子を注入することで閾値電圧を高くし、「0」状態にします。ホットキャリア注入またはFowler-Nordheimトンネリングを利用します。

コントロールゲートに高電圧(約10V)印加
  → 電子がトンネル酸化膜を通過してフローティングゲートへ注入
  → 閾値電圧が上昇 → セルはOFF状態(=「0」)

消去

フローティングゲートの電子を引き抜くことで閾値電圧を下げ、「1」状態(消去済み)にします。NANDフラッシュはブロック単位でしか消去できません。

基板に高電圧印加
  → 電子がフローティングゲートから基板へ引き抜かれる
  → 閾値電圧が低下 → セルはON状態(=「1」)

読み出し

コントロールゲートに中間電圧を印加し、ドレイン電流の有無でセルの状態を判定します。MLCやTLCでは電圧レベルを細かく判定して複数ビットを読み出します。

用途・ユースケース

マイコン内蔵フラッシュ

MCUに内蔵されるフラッシュメモリは主にNOR型で、プログラムコードをそのまま実行(XIP: eXecute In Place)できます。STM32F4では最大2MB、ESP32では外付けSPI NORフラッシュ(通常4〜16MB)にファームウェアを格納します。

// STM32 HALによるフラッシュ書き込み例
HAL_FLASH_Unlock();
FLASH_EraseInitTypeDef eraseInit = {
    .TypeErase = FLASH_TYPEERASE_SECTORS,
    .Sector    = FLASH_SECTOR_11,
    .NbSectors = 1,
    .VoltageRange = FLASH_VOLTAGE_RANGE_3,
};
uint32_t sectorError;
HAL_FLASHEx_Erase(&eraseInit, &sectorError);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, targetAddress, data);
HAL_FLASH_Lock();

ファームウェア格納・OTA更新

組み込みLinux機ではeMMC(内部NAND)にOSイメージ・アプリケーションを格納します。OTA(Over-The-Air)アップデートでは、現行ファームウェアを稼働させながら別パーティションに新ファームウェアを書き込み、再起動後に切り替えるA/Bアップデート方式が一般的です。

産業用途

SLC NANDや産業グレードのNORフラッシュは、書き換え耐久性・動作温度範囲(-40℃〜+85℃以上)・長期供給保証が求められる産業機器・車載機器で使われます。

実装・開発のポイント

書き込み前の消去

フラッシュメモリは書き込み前に必ずブロック単位で消去が必要です(消去済み状態が「全1」、書き込みで「0」にする)。この特性を無視するとデータが壊れます。

// 誤り: 消去せずに書き込む
flash_write(addr, new_data);  // NG: 既存データとORされる

// 正しい手順
flash_erase_block(block_addr);  // まずブロック消去
flash_write(addr, new_data);    // 次に書き込み

書き換え寿命の管理

フラッシュメモリの書き換え回数には上限があります(SLC: 約100,000回、TLC: 約1,000〜3,000回)。設定値の保存などで特定アドレスを繰り返し書き換えると、そこだけ先に劣化します。ウェアレベリングアルゴリズムで書き込みを分散させることが重要です。

ECC(エラー訂正符号)

NANDフラッシュはビット化けが起きやすく、ECC(Error Correcting Code)が必須です。Hamming符号(1ビット訂正)やBCH符号(多ビット訂正)を使います。LinuxのMTDサブシステムやNANDコントローラハードウェアがECCを自動処理する場合が多いです。

Bad Block管理

NANDフラッシュは製造時から不良ブロック(Bad Block)が存在することがあり、使用中に発生することもあります。フラッシュ管理ソフトウェア(FTL: Flash Translation Layer)またはMTD/UBIがBad Block Tableを維持し、不良ブロックを自動的にスキップします。

電源断対策

書き込み中に電源が落ちるとデータが壊れる可能性があります。重要なデータは書き込み完了後にベリファイ(読み返し確認)し、ジャーナリングファイルシステム(ext4 journal、UBIFS、LittleFSなど)を使って原子性を保証します。

// ベリファイの例
flash_write(addr, data, len);
uint8_t readback[len];
flash_read(addr, readback, len);
if (memcmp(data, readback, len) != 0) {
    // 書き込みエラー処理
    handle_write_error();
}

他技術との比較

フラッシュ vs EEPROM

EEPROMはバイト単位で消去・書き込みが可能で、少量データの書き換えに便利です。一方、フラッシュはブロック単位消去が必要ですが、大容量かつ安価です。現代のマイコンではフラッシュの一部をEEPROM的に使うエミュレーション機能(STM32のEEPROM Emulation等)を持つものが多くなっています。

フラッシュ vs SRAM

SRAMは読み書き自由で非常に高速ですが、電源断でデータが消えます(揮発性)。フラッシュは不揮発ですが、書き込みが遅く書き換え回数制限があります。組み込みシステムでは両者を組み合わせ、実行時データはSRAM、永続データはフラッシュに格納するのが基本パターンです。

フラッシュ vs HDD

HDDは機械的な磁気ディスクを使うためランダムアクセスが遅く、衝撃・振動に弱いです。フラッシュは電子的に動作するため高速・衝撃耐性があり、組み込み用途ではフラッシュベースのストレージ(eMMC・SSD)がほぼHDDを置き換えています。

関連用語

参考リンク