从逻辑门到闪存:NAND与NOR命名的底层逻辑与工程应用
1. 从逻辑门到存储单元NAND与NOR的命名本源在嵌入式开发、FPGA设计乃至日常的电子产品选型中NAND Flash和NOR Flash是绕不开的两个核心存储器件。很多工程师朋友都知道它们一个适合存储大容量数据一个适合执行代码但你是否曾好奇为什么它们会叫“NAND”和“NOR”这么奇怪的名字这背后并非随意为之而是深刻植根于其最底层的晶体管阵列结构和布尔逻辑运算。今天我们就抛开那些复杂的性能参数表从最基础的逻辑门电路出发彻底搞懂这两个名字的由来以及这种命名如何决定了它们截然不同的“性格”与用途。简单来说NAND和NOR的名称直接来源于它们内部存储单元阵列所实现的逻辑功能。NAND Flash的阵列结构其输入与输出之间的电信号关系恰好符合数字电路中“与非门”NOT-AND NAND的真值表而NOR Flash则符合“或非门”NOT-OR NOR的真值表。这不仅仅是命名上的巧合更是理解两者在读取方式、性能特性和应用场景上根本差异的钥匙。理解了这一点你就能明白为什么NOR可以像RAM一样随机访问任意地址执行代码而NAND则更适合以“页”为单位进行大数据块的顺序读写。2. 逻辑门基础AND OR NAND NOR的真值表回顾要理解NAND和NOR我们必须先回到数字逻辑的起点。在布尔代数中最基本的逻辑运算有“与”AND、“或”OR、“非”NOT。它们的组合衍生出了“与非”NAND和“或非”NOR。2.1 “与”门AND Gate“与”运算的逻辑是只有当所有输入都为“真”通常用高电平“1”表示时输出才为“真”“1”。只要有一个输入为“假”低电平“0”输出就为“假”“0”。其真值表如下以两输入为例输入A输入B输出Y (A AND B)000010100111你可以把它想象成一个串联电路只有两个开关A和B都闭合1灯泡Y才会亮1。2.2 “或”门OR Gate“或”运算的逻辑是只要有一个或多个输入为“真”1输出就为“真”1。只有当所有输入都为“假”0时输出才为“假”0。其真值表如下输入A输入B输出Y (A OR B)000011101111这就像一个并联电路任意一个开关闭合1灯泡Y就会亮1。2.3 “与非”门NAND Gate“与非”门就是“与”门后面接一个“非”门反相器。所以它的逻辑是先进行“与”运算然后将结果取反。因此它的输出与“与”门正好相反只有当所有输入都为“1”时输出才为“0”只要有一个输入为“0”输出就为“1”。真值表如下输入A输入B输出Y (A NAND B)0010111011102.4 “或非”门NOR Gate同理“或非”门是“或”门后面接“非”门。它的逻辑是先进行“或”运算然后将结果取反。因此它的输出与“或”门相反只有当所有输入都为“0”时输出才为“1”只要有一个输入为“1”输出就为“0”。真值表如下输入A输入B输出Y (A NOR B)001010100110注意这里有一个非常关键且容易混淆的点也是理解闪存命名的核心在数字电路分析中我们通常关注的是逻辑功能本身。但在实际的物理电路尤其是MOS管构成的闪存阵列中我们还需要定义“高电平”和“低电平”究竟代表逻辑“1”还是“0”。这个定义是人为的但一旦定义好整个系统的逻辑关系就确定了。接下来我们会看到闪存内部恰恰采用了一种特殊的电平-逻辑映射关系。3. 闪存单元的逻辑状态定义导通与截止的“是非观”现在让我们进入闪存的世界。无论是NAND还是NOR其基本存储单元都是一个浮栅MOS晶体管。这个晶体管有一个特殊的“浮栅”可以通过注入或移除电子来长期存储电荷从而改变晶体管的阈值电压实现数据的存储。这里就引出了项目正文中最核心的一句话“在闪存中将晶体管导通视为‘1’晶体管截止视为‘0’。”这个定义至关重要而且与许多初学者从数字逻辑门直接迁移过来的直觉可能相反。我们通常容易认为晶体管导通有电流代表“真”或“有效”似乎更像逻辑“1”。但在这个上下文中我们需要仔细区分“物理状态”和“存储的数据”。让我们拆解一下物理状态晶体管导通电流可以通过或截止电流无法通过。存储的数据逻辑值由浮栅上的电荷决定。浮栅有负电荷 - 晶体管阈值电压变高 - 在相同栅压字线电压下更难以导通 - 我们将其定义为存储了逻辑“0”。反之浮栅无或很少负电荷 - 晶体管容易导通 -定义为存储了逻辑“1”。所以“导通1 截止0”这个定义指的是晶体管在当前读取操作下的“行为状态”而非其内部存储的数据值。更准确的理解是当字线施加读取电压时如果存储单元存储的是‘1’那么晶体管就会“导通”如果存储的是‘0’晶体管就会“截止”。这个定义是整个闪存阵列逻辑分析的基石。基于此我们再来看阵列的输入和输出。输入施加在“字线”Word Line上的电压信号。为了读取某个单元我们会在其所在的字线上施加一个特定的读取电压比如Vread。在逻辑分析中我们把这个“施加了有效读取电压”的动作视为输入逻辑“1”表示“选中并尝试读取这个单元”。反之未选中或施加无效电压视为输入“0”。输出从“位线”Bit Line上检测到的电流或电压信号。位线是连接一列晶体管的公共线。根据多个被选中的单元是导通还是截止位线上会呈现出不同的电平。有了“导通1 截止0”这个定义以及输入输出的概念我们就可以把整个存储阵列的读写操作抽象成一个多输入、单输出的巨型逻辑门电路。而这个“逻辑门”的类型就是NAND和NOR名称的由来。4. NOR闪存为何是“或非”逻辑我们先看相对直观的NOR Flash。它的存储单元在阵列中是并联在字线和位线之间的。下图是一个简化的2x2 NOR阵列示意图用开关代表晶体管的导通/截止闭合导通1 断开截止0WL0 WL1 | | --S00-- --S10-- | | | | BL0 -- -- -- (通过上拉电阻连接到Vcc) | | | | --S01-- --S11-- | | GND GND (S00, S01, S10, S11 代表四个存储单元)工作原理分析 假设我们想读取连接在位线BL0上的两个单元S00和S10。我们同时给WL0和WL1施加读取电压输入“1”。情况AS00存储‘1’导通 S10存储‘0’截止。那么电流路径为Vcc - 上拉电阻 - BL0 - S00 - GND。由于存在这条到地的导通路径位线BL0被拉低到接近地电平低电平。根据常见的数字电路约定低电平通常代表逻辑“0”。情况BS00存储‘0’截止 S10存储‘1’导通。同理BL0通过S10被拉低到低电平逻辑“0”。情况CS00和S10都存储‘1’都导通。BL0同样被拉低到低电平逻辑“0”。情况DS00和S10都存储‘0’都截止。此时BL0到地之间没有导通路径。位线BL0通过上拉电阻保持在高电平Vcc附近即逻辑“1”。现在让我们把输入字线选择均为1和输出位线电平的逻辑值整理一下。记住我们的映射物理上位线低电平有电流输出逻辑‘0’高电平无电流输出逻辑‘1’。单元S00状态 (输入A)单元S10状态 (输入B)位线BL0电平 (物理)输出逻辑Y截止 (0)截止 (0)高 (Vcc)1截止 (0)导通 (1)低 (GND)0导通 (1)截止 (0)低 (GND)0导通 (1)导通 (1)低 (GND)0看这个真值表只要有一个或以上的单元导通输入为1输出就是0只有当所有单元都截止输入为0时输出才是1。这完美符合我们前面回顾的“或非门”NOR的真值表A NOR B。因此这种并联结构的闪存就被称为NOR Flash。实操心得正因为NOR阵列是并联结构每个存储单元都有独立的位线触点所以它可以像内存一样通过地址线直接访问任意一个单元进行读取这就是它支持“随机访问”和“片上执行”XIP的物理基础。但并联也意味着每个单元都需要独立的位线连接导致芯片面积利用率低成本高容量难以做大。5. NAND闪存为何是“与非”逻辑NAND Flash的结构则完全不同它的存储单元是串联在一起的形成一个“串”String多个串再并联到位线上。一个简化版例如4个单元串联的NAND串如下BL0 --[选择管]--[S0]--[S1]--[S2]--[S3]--[地线选择管]-- GND | | | | | | WL_sel WL0 WL1 WL2 WL3 WL_sel_src工作原理分析 要读取串中某个单元比如S1需要执行一个复杂的操作将目标单元S1所在字线WL1的电压设为Vread约0V输入“1”。将串中其他所有非目标单元S0 S2 S3所在字线WL0 WL2 WL3的电压设为较高的Vpass比如4-5V远高于其阈值电压确保无论它们存储什么数据都强制导通。在逻辑上我们可以将这些被强制导通的单元视为输入“1”因为它们在电路中表现为导通状态。打开串两端的开关管。观察位线BL0的电位变化。此时整个串联通路能否导通完全取决于被读取的目标单元S1的状态如果S1存储的是‘1’浮栅无电荷易导通在Vread电压下S1导通状态为1。那么整个串联通路从BL0到GND全部导通形成电流将位线BL0放电至低电平。根据映射低电平输出逻辑‘0’。如果S1存储的是‘0’浮栅有负电荷难导通在Vread电压下S1截止状态为0。那么即使其他单元都导通串联通路也会在S1处断开没有电流。位线BL0保持预充电的高电平。高电平输出逻辑‘1’。现在我们抽象一下这个逻辑过程。在读取S1时我们“输入”的是串上所有单元的状态在读取偏置下非目标单元被强制置为“导通”1目标单元S1的状态待检测可能是1或0。而“输出”是位线的逻辑值。让我们构建一个极端但能说明问题的简化模型假设一个NAND串只有两个单元S0和S1我们读取S1。那么读取时S0被偏置为强制导通输入A1S1的状态是待检测的输入B。根据上述分析当 S11导通时通路通BL低电平输出逻辑0。当 S10截止时通路断BL高电平输出逻辑1。但注意此时S0是强制导通的1。所以输入A (S0)输入B (S1)输出Y (BL)101110这看起来像是一个输入A恒为1的“非门”NOT B。但NAND的逻辑体现在哪里呢关键在于NAND的“与非”特性体现在对整个串进行“擦除”后验证或特定测试模式的读取上。更经典的理解方式是如果我们把“字线输入数据”看作是对该单元施加了使其尝试导通的电压逻辑1那么对于整个NAND串只有当串上所有被施加了“1”的单元都导通时位线才会被拉低输出0只要其中任何一个单元截止输入为0位线就会保持高电平输出1。这正是“与非门”NAND的真值表全1出0有0出1。项目正文中提到的例子非常精辟“对于NAND型闪存来说只要字线输入的数据中有一个为‘0’位线上就输出‘1’”。这里的“字线输入的数据”可以理解为在某种特定读取或验证模式下施加在各字线上的一组电压模式所对应的逻辑值。这种输入输出关系严格对应了NAND逻辑。注意事项理解NAND逻辑的关键在于要将整个串联的晶体管链看作一个整体。它的输出位线状态是所有串联单元状态的“与”运算结果再取反。因为串联电路中所有开关必须全部闭合全1电路才通电流大电压低对应逻辑0任何一个开关断开有0电路就断无电流电压高对应逻辑1。这个“全1出0有0出1”正是NAND门的核心特征。这种串联结构极大地提高了存储密度一个串共享一对位线触点但也导致了必须按“页”顺序读写的特性无法像NOR那样真正随机访问。6. 命名背后的深远影响架构决定特性理解了NAND和NOR命名的逻辑根源我们就能自然而然地推导出它们几乎所有的特性差异这比死记硬背参数表要深刻得多。6.1 访问方式随机 vs. 顺序NOR并联结构每个单元独立编址。就像一排并联的独立房间你有每个房间的钥匙可以直接开门进去随机读取。因此CPU可以通过地址总线直接访问NOR中的任意字节实现片上执行。NAND串联结构单元以“页”为单位组织在一个串里。就像一列串联的火车车厢你必须从车头串的一端开始顺序经过前面的车厢才能到达目标车厢顺序读取。因此NAND的访问必须以“页”例如4KB为单位进行地址是逻辑的需要通过复杂的控制器进行映射和管理。6.2 读取性能NOR随机读取延迟极低~100ns与DRAM/SRAM同量级适合代码执行。NAND随机读取延迟高约10-50us但连续读取的带宽极高因为一页数据被连续读出。适合大数据流的存储和加载。6.3 写入与擦除NOR以“扇区”为单位擦除例如64KB。写入编程前必须先擦除整个扇区。写入速度慢。NAND以“块”为单位擦除例如256KB以“页”为单位编程。写入速度远快于NOR。但NAND的块在擦写一定次数后会损坏需要坏块管理和磨损均衡算法这由控制器完成。6.4 容量与成本NOR单元面积大密度低。在相同工艺下容量远小于NAND成本更高。通常用于存储1MB~1GB的启动代码、固件。NAND单元面积小密度高。是追求大容量、低成本存储的不二之选从几GB到数TB广泛应用于SSD、eMMC、U盘、SD卡。6.5 可靠性NOR位翻转错误率低数据保存期长通常无需ECC校验。NAND存在较高的位错误率必须使用ECC纠错码来保证数据完整性。这也是NAND控制器的一个重要功能。7. 工程师选型指南与常见误区在实际项目中如何选择这里有一些基于底层理解的选型思路和常见问题排查。7.1 选型决策树需要芯片上电直接运行代码吗是- 选择NOR Flash。这是它的主场尤其是存储Bootloader、RTOS或关键安全固件。否- 进入下一步。对存储容量需求大吗通常 16MB是- 选择NAND Flash。搭配MCU或MPU使用数据需要先加载到RAM中运行。否- 两者均可考虑成本、接口和可靠性。对数据可靠性要求极高且没有复杂文件系统或控制器支持是- 倾向于NOR Flash。它更“简单粗暴”地可靠。否-NAND Flash配合成熟的主控和文件系统如YAFFS2 UBIFS F2FS是更经济的选择。7.2 常见问题与排查技巧实录问题1我的MCU支持XIP但连接NOR Flash后启动失败。排查首先确认硬件连接特别是地址线、数据线是否与MCU的存储器接口正确对应。然后检查NOR Flash的初始化序列如上电、复位、进入读取模式是否正确。一个关键点NOR Flash通常有不同的读取模式如异步、同步突发需要根据MCU的时钟和时序要求进行配置。用逻辑分析仪抓取MCU复位后的最初几次读访问波形与NOR Flash数据手册的时序图对比是最高效的调试方法。问题2NAND Flash系统运行一段时间后出现文件系统错误或数据损坏。排查这几乎是NAND系统的“标配”问题。首先确认你的驱动或文件系统是否启用了ECC功能并且ECC的强度是否与NAND芯片的规格匹配如1-bit/512Byte ECC可能不够需要4-bit或更强。其次检查坏块管理算法。新的坏块是否被正确标记和隔离最后对于频繁读写的区域检查磨损均衡算法是否工作正常。可以使用芯片厂商提供的工具或自行在驱动中增加日志统计各块的擦写次数。问题3如何为NAND Flash选择合适的文件系统经验分享对于嵌入式LinuxUBIFS是针对原始NAND特性设计的比传统的JFFS2有更好的性能和磨损均衡是首选。对于单片机系统LittleFS或SPIFFS是轻量级且带掉电保护的好选择。FatFS虽然通用但它本身不处理坏块和磨损均衡需要底层驱动或中间层来实现在NAND上使用需谨慎。问题4NOR Flash的写入速度太慢影响固件升级体验。优化技巧NOR的写入编程确实慢。可以采取以下策略1)使用缓冲将待升级的固件镜像先全部下载到RAM或外部SDRAM中然后再一次性擦写NOR避免边下载边擦写带来的频繁等待。2)利用扇区结构如果固件分为多个相对独立的部分如Bootloader App 参数区可以只擦写需要更新的部分而不是全片擦除。3)考虑双镜像差分升级存储两个应用镜像通过差分算法只升级变化的部分极大减少写入数据量。从两个简单的逻辑门名字出发我们深入到了半导体物理结构、数字电路抽象、系统架构选型乃至实际开发调试的层面。NAND和NOR的命名就像一把钥匙打开了理解现代非易失性存储器世界的大门。下次当你再看到这两个词时希望脑海里浮现的不再是枯燥的参数而是那串联与并联的晶体管阵列以及它们所忠实演绎的布尔逻辑。这种从本质出发的理解能让你在纷繁复杂的技术选项中做出更清醒、更坚定的选择。