1. 存储系统概述:NAND Flash vs NOR Flash,存储控制器在SoC中的角色,课程整体架构

大家好,我是你们的讲师。在芯片验证和嵌入式存储这个领域摸爬滚打了十几年,今天咱们正式开始这门课的第一讲。

说实话,每次带新人做项目,我都要先问一个问题:你搞懂存储了吗?很多人觉得不就是存数据嘛,有什么难的。但等你真正遇到系统卡死、数据丢失、启动失败的时候,才会发现——存储这块水很深。

这一章,我们先搭个框架。把NAND和NOR的区别搞清楚,看看存储控制器在SoC里到底扮演什么角色,最后再聊聊这门课的整体脉络。

1.1 NAND Flash vs NOR Flash:两种截然不同的存储哲学

先说说Flash。市面上主流的非易失性存储,就这两大类。我当年刚入行时,也傻傻分不清。后来被项目逼着啃了几个月spec,才算真正吃透。

1.1.1 NOR Flash:简单、可靠、但慢

NOR Flash最大的特点是什么?支持随机访问。你想想看,CPU可以直接在NOR上执行代码,不需要先把代码拷贝到RAM里。这就是所谓的「XIP(Execute In Place)」能力。

我在一个物联网项目里用过NOR Flash做启动芯片。当时客户要求上电即运行,不能有延迟。NOR Flash正好满足这个需求。它的接口跟SRAM很像,地址线、数据线直接连到SoC上,读操作跟读内存一样简单。

NOR Flash的核心特性:

  • 读速度快(随机读约80-100ns)
  • 写速度慢(擦除需要秒级)
  • 容量小(主流8MB-256MB)
  • 可靠性高(比特翻转率极低)
  • 接口简单(SRAM-like接口)

但NOR有个致命缺点——容量做不大。为什么?因为它的存储单元是并联的,每个单元都需要独立的接触孔,芯片面积大,成本高。你想想看,一个256MB的NOR Flash,价格可能比8GB的NAND还贵。

1.1.2 NAND Flash:大容量、低成本、但复杂

NAND Flash就不一样了。它的存储单元是串联的,面积小,容量可以做得很大。现在一颗3D NAND芯片,容量能做到1TB甚至更高。

但代价是什么?操作复杂。NAND Flash不支持随机访问,只能按页读写、按块擦除。而且天生就有坏块,需要ECC纠错,需要磨损均衡,需要垃圾回收……

我记得第一次调NAND驱动时,被坏块管理搞得焦头烂额。明明写进去了,读出来却是错的。后来才发现,那个块早就标记为坏块了,但我的驱动没检查状态寄存器。

避坑指南:我曾经在量产阶段发现一批NAND芯片的坏块率异常高。排查了三天,最后发现是供应商的工艺参数漂移了。从那以后,我养成了一个习惯——每次换批次都要重新做坏块扫描,不能完全相信芯片出厂时的标记。

对比项 NOR Flash NAND Flash
存储单元结构 并联 串联
访问方式 随机访问 页访问
读速度 快(~80ns) 较慢(~25μs页读取)
写速度 慢(~1s擦除) 快(~200μs页编程)
容量 小(MB级) 大(GB级)
可靠性 需要ECC
成本
典型应用 启动代码、固件 文件系统、大容量存储

1.2 存储控制器在SoC中的角色

好了,现在你知道了NAND和NOR的区别。但问题来了——SoC怎么跟它们通信?

直接连?不行。因为Flash的时序、协议、电压等级跟SoC内部总线完全不匹配。这时候就需要一个中间人——存储控制器

存储控制器,说白了就是SoC和Flash之间的翻译官。它负责把SoC发出的读写请求,转换成Flash能理解的命令序列和时序信号。

1.2.1 存储控制器到底干了什么?

我习惯把存储控制器的功能分成三层:

  1. 协议层:解析SoC总线的读写请求,生成对应的Flash命令。比如读页、写页、擦除块、读状态等。
  2. 时序层:控制信号线的时序。tR、tPROG、tBERS这些参数,都是在这里实现的。时序错了,Flash就不干活。
  3. 管理层:处理坏块、ECC、磨损均衡等高级功能。这部分通常由软件(FTL)完成,但有些控制器也支持硬件加速。

个人经验:我建议你在设计存储控制器时,把协议层和时序层分开。为什么?因为协议层可能会随着Flash标准升级而改变(比如从ONFI 3.0到4.0),但时序层相对稳定。分开设计,后期升级时只需要改协议层,不用动时序逻辑。

1.2.2 存储控制器在SoC中的位置

你想想看,一个典型的SoC架构里,存储控制器通常挂在系统总线上。CPU通过总线访问控制器,控制器再访问Flash。

这里有个关键点——存储控制器通常自带DMA。为什么?因为Flash的读写速度跟CPU的处理速度不匹配。如果每次读写都让CPU参与,CPU会被拖死。DMA可以自动搬运数据,CPU只需要发个命令就行。

我记得有个项目,同事没开DMA,直接用CPU轮询方式读NAND。结果系统性能惨不忍睹,CPU占用率飙到90%以上。后来改成DMA模式,CPU占用率直接降到5%。

1.3 课程整体架构

这门课一共30章,我把它分成了四个阶段。每个阶段都有明确的目标。

第一阶段:基础篇(第1-8章)

这个阶段的目标是让你彻底搞懂存储原理。我们会从Flash的物理结构讲起,到存储控制器的硬件设计,再到驱动开发的基础知识。

  • 第1章:存储系统概述(就是本章)
  • 第2-3章:NAND Flash协议详解(ONFI、Toggle)
  • 第4-5章:NOR Flash接口与驱动
  • 第6-8章:存储控制器架构与设计

第二阶段:驱动篇(第9-16章)

这个阶段是实战驱动开发。我们会从零开始写一个NAND Flash驱动,包括初始化、读写、擦除、坏块管理等。

  • 第9-10章:Linux MTD子系统分析
  • 第11-12章:NAND驱动核心代码实现
  • 第13-14章:ECC与BCH编解码
  • 第15-16章:坏块管理与磨损均衡

第三阶段:验证篇(第17-24章)

这个阶段是验证方法论。芯片设计出来,怎么保证它是对的?我们会讲UVM验证环境、时序仿真、覆盖率分析等。

  • 第17-18章:存储控制器验证环境搭建
  • 第19-20章:时序验证与后仿真
  • 第21-22章:随机测试与覆盖率驱动
  • 第23-24章:FPGA原型验证

第四阶段:进阶篇(第25-30章)

这个阶段是工程实践与优化。我们会讨论性能调优、低功耗设计、多芯片互连等高级话题。

  • 第25-26章:存储性能优化
  • 第27-28章:低功耗存储设计
  • 第29-30章:多通道与3D NAND技术

学习建议:我个人建议你按照这个顺序来学,不要跳着看。因为每一章都依赖前面的知识。特别是驱动篇,如果你不懂Flash协议,写出来的驱动肯定有bug。我见过太多人上来就写代码,结果时序配错了,芯片不工作,还以为是硬件问题。

1.4 小结

这一章我们聊了三个核心问题:

  • NAND vs NOR:NOR简单可靠但容量小,NAND容量大但操作复杂。选型时要根据应用场景来定。
  • 存储控制器的角色:它是SoC和Flash之间的桥梁,负责协议转换、时序控制和管理功能。
  • 课程架构:从基础到驱动,从验证到优化,一步步带你成为存储领域的专家。

下一章,我们会深入NAND Flash的协议细节。你会看到那些时序参数到底是什么意思,为什么tR是25μs而不是20μs。嗯,这些细节决定了你的驱动能不能稳定工作。

咱们下章见。


公众号:蓝海资料掘金营,微信deep3321