FLASH存储器又称为闪存,它也是可重复擦写的储器,部分书籍会把FLASH存储器称为FLASH ROM,但它的容量一般比EEPROM大得多,且在擦除时,一般以多个字节为单位。如有的FLASH存储器以4096 个字节为扇区,最小的擦除单位为一个扇区。根据存储单元电路的不同,FLASH存储器又分为NOR FLASH 和NAND FLASH,见下表。
特性 | NOR FLASH | NAND FLASH |
同容量存储器成本 | 较贵 | 较便宜 |
集成度 | 较低 | 较高 |
介质类型 | 随机存储 | 连续存储 |
地址线和数据线 | 独立分开 | 共用 |
擦除单元 | 以“扇区/块”擦除 | 以“扇区/块”擦除 |
读写单元 | 可以基于字节读写 | 必须以“块”为单位读写 |
读取速度 | 较高 | 较低 |
写入速度 | 较低 | 较高 |
坏块 | 较少 | 较多 |
是否支持XIP | 支持 | 不支持 |
NOR与NAND的共性是在数据写入前都需要有擦除操作,而擦除操作一般是以“扇区/块”为单位的。而NOR与NAND特性的差别,主要是由于其内部“地址/数据线”是否分开导致的。
由于NOR的地址线和数据线分开,它可以按“字节”读写数据,符合CPU的指令译码执行要求,所以假如NOR上存储了代码指令,CPU给NOR一个地址,NOR 就能向CPU 返回一个数据让CPU 执行,中间不需要额外的处理操作。
而由于NAND的数据和地址线共用,只能按“块”来读写数据,假如NAND上存储了代码指令,CPU给NAND 地址后,它无法直接返回该地址的数据,所以不符合指令译码要求。表中的最后一项“是否支持XIP”描述的就是这种立即执行的特性(eXecute In
Place)。
若代码存储在NAND上,可以把它先加载到RAM存储器上,再由CPU执行。所以在功能上可以认为NOR是一种断电后数据不丢失的RAM,但它的擦除单位与RAM有区别,且读写速度比RAM要慢得多。
另外,FLASH的擦除次数都是有限的(现在普遍是10万次左右),当它的使用接近寿命的时候,可能会出现写操作失败。由于NAND通常是整块擦写,块内有一位失效整个块就会失效,这被称为坏块,而且由于擦写过程复杂,从整体来说NOR坏块少,寿命更长。由于可能存在坏块,所以FLASH存储器需要“探测/错误更正(EDC/ECC)”算法来确保数据的正确性。
由于两种FLASH 存储器特性的差异,NOR FLASH一般应用在代码存储的场合,如嵌入式控制器内部的程序存储空间。而NAND FLASH一般应用在大数据量存储的场合,包括SD卡、U盘以及固态硬盘等,都是NAND FLASH类型的。