我在嵌入式应用程序中使用过非易失性存储器,如 EEPROM 和 FLASH 存储器,我一直发现未使用的存储器 (EEPROM/FLASH) 位位置始终1
默认设置为。为什么用 this 而不是0
?
例如一个地址,比如第 0 个地址(内存的第一个字节),如果用户没有写入,则始终存储0xff
而不是0x00
. 为什么制造存储芯片的人会保持这种状态?我确信保留默认内存位置0xff
会为制造商提供一些优势或重要的东西。
内存芯片中这种结构背后的原因是什么?
我在嵌入式应用程序中使用过非易失性存储器,如 EEPROM 和 FLASH 存储器,我一直发现未使用的存储器 (EEPROM/FLASH) 位位置始终1
默认设置为。为什么用 this 而不是0
?
例如一个地址,比如第 0 个地址(内存的第一个字节),如果用户没有写入,则始终存储0xff
而不是0x00
. 为什么制造存储芯片的人会保持这种状态?我确信保留默认内存位置0xff
会为制造商提供一些优势或重要的东西。
内存芯片中这种结构背后的原因是什么?
我将讨论闪存编程,但很多材料将类似于 EEPROM(电可擦可编程 ROM),因为闪存源自 1980 年代中期的 EEPROM。如下所述,从物理的角度来看,默认状态是 1。但更重要的是,我将解释为什么会有一个默认状态——你不能随意地在上次已经编程的内容之上进行编程。
程序闪存几乎总是选择 NOR 闪存,因为该接口最适合将数据放置在微控制器的内存映射中——完整地址和数据总线模仿 RAM 并允许随机访问任何位置。数据可以一次读取一个字,其中一个字定义为微控制器的数据宽度,通常为 8、16 或 32 位。另一方面,NAND 闪存的开发是为了替代硬盘驱动器并按顺序工作。
然而,编程变得有点复杂。如前所述,NOR 闪存和其他非易失性存储器(如 NAND 闪存、EEPROM 甚至 EPROM)的默认状态是逻辑 1。 您不能将 1 写入这些设备,只能将 0 写入。 因此,例如,如果您有一个包含 0x0123 的字节并且您想将其更改为 0x3210,那么您不能像在 RAM 中写入一个字节那样直接这样做。
相反,必须擦除内存中的位,这将它们置于已经提到的默认状态 1。这只能在块中完成,而不是单词。在我最近使用的 Microchip PIC32 上,可以擦除的最小块大小为 4096 字节。因此,如果您只想更改一个字(32 位),则必须读取 4K 内存,擦除块,然后将 4K 内存写回闪存,但根据需要包括新的 32 位值。这种擦除可能需要一些时间——大约一秒钟。
以下是闪存单元的图片。闪存通过在浮栅上移除或放置电子来存储数据。当电子出现在浮栅上时,没有电流流过晶体管,表示为 0。当电子从浮栅上移开时,晶体管开始导通,表示为 1。(这是按照惯例 - 它可能是其他方式,但需要所有数据线上的反相器。)
擦除操作。 闪存单元(单级 NOR 闪存单元)的默认状态为 1,因为浮动栅极不携带负电荷。擦除闪存单元(重置为 1)是通过在源极和控制栅极(字线)上施加电压来实现的。电压可以在 -9V 到 -12V 的范围内。并且还向源施加大约 6V 的电压。浮栅中的电子被拉出并通过量子隧穿转移到源极。换句话说,电子从浮栅隧穿到源极和衬底。
因为擦除使用高电压,所以块擦除需要更少的裸片面积。因此,电压一次只能施加到整行晶体管。
对于写入,可以对 NOR 闪存单元进行编程,或通过以下过程将其设置为 0。写入时,将 12V 左右的高压施加到控制栅极(字线)。如果将 7V 左右的高电压施加到位线(漏极端子),则单元中存储 0。现在通道已打开,因此电子可以从源极流向漏极。源漏电流足够高,可以通过称为热电子注入的过程使一些高能电子通过绝缘层跳到浮栅上。
读取时,将大约 5V 的电压施加到控制栅极,将大约 1V 的电压施加到漏极。存储单元的状态通过在漏极和源极之间流动的电流来区分。
非易失性存储器的使用寿命是根据擦除周期来衡量的。NOR的缺点是擦除周期数约为NAND存储器的1/10。许多版本的 PIC32 只允许闪存更新 1000 次,远低于 EEPROM 的典型 100,000 次擦除周期。
因此,设计者将默认状态设置为 1 还是 0 并不那么重要(他们选择了允许最简单实现的值);重要的是必须先擦除一块闪存(这需要时间),然后重新编程整个块(即使正在更改单个字(这需要大量 RAM)。
设备的这种块擦除可以追溯到第一个 EPROM(可擦除可编程 ROM),然后是 EEPROM 代码被编程到芯片中(如 16KB 27128)并放置在插槽中。这些芯片顶部有一个小窗口,可以让光线照射在芯片上。当必须更改程序时,将芯片放入UV擦除器中20分钟左右,这将擦除整个芯片。然后将使用新程序对芯片进行编程。
一些 EEPROM 需要在编程前擦除内存块;其他允许一次写入一个字节(EEPROM控制器实际上首先擦除字节并对其进行编程)。
在现代闪存中,我不知道有什么理由选择零而不是默认值。读取是通过差分电流检测放大器完成的,因此原则上您可以从任一侧获取输出。(第一个 EEPROM 可能有更简单的读取电路——我不确定。)
有一个很好的理由不添加额外的反相器——它会增加从内存到 CPU 的传播延迟。在微控制器中,闪存到 CPU 的数据路径对整体系统性能有巨大的影响,因为它决定了获取新指令需要多长时间。
数字电路设计人员通常期望零表示清除/重置/擦除。但是闪存晶体管和读取电路是模拟的。从这个角度来看,将闪存晶体管的导通状态描述为合乎逻辑的状态更有意义。碰巧从 1 到 0 比从 0 到 1 快得多,所以 1 变为“已擦除”状态,而 0 变为“已编程”状态。
简短版:半导体物理学家和模拟电路设计师根本不在乎您的数字直觉。:-)
我不确定你引用的是什么,但是离开维基百科的闪存页面,这似乎是闪存背后硬件的结果:
默认状态下的单级 NOR 闪存单元在逻辑上相当于二进制“1”值,因为在向控制栅极施加适当电压的情况下,电流将流过通道,从而拉低位线电压。”
如果您要使用另一种类型的闪存,例如 NAND,则默认状态将为 1,因为当任何晶体管的输出低于其高/低阈值电压时,NAND 的输出为 1。
抱歉,如果我完全错过了您所要求的内容,我对这一切也很陌生。
过去的 ROM 和 PROM 在制造过程中必须通过在掩模层中添加金属或在编程中将其烧掉来进行操作,并且这两个过程在制造时都具有默认的高状态。让它们默认为 LOW 会花费更多晶体管,以某种方式降低编程便利性或操作速度。
这已成为惯例,因为如今在数据路径中的某个点添加反相器是可能的。
该约定可能始于二极管逻辑存储器阵列的时代,当它们被寻址时,二极管逻辑存储器阵列具有用于下拉数据线的二极管,并且未使用的存储器字将没有二极管而不是所有二极管。大多数早期的数字逻辑标准都被主动拉低,如果不是,则浮高。