NVMe开发——NAND Flash的基本原理

news2024/9/21 22:57:03

1. 存储单元

1.1. 半导体

半导体(semiconductor)指常温下导电性能介于导体与绝缘体之间的材料。纯净半导体一般是四价原子(如硅或锗)。

1.1.1. P型半导体

P型半导体是通过将一个纯净的半导体材料(如硅或锗)中掺杂少量的三价杂质原子(如铝或硼)而形成的。这些杂质原子具有比半导体材料中的四价原子(如硅或锗)少一个电子。由于这个缺失的电子,形成了称为“空穴”的正电荷载流子。

在P型半导体中,空穴是主要的载流子,它们可以在材料中移动,并参与导电。当提供一定的外部电场激励时,空穴会在P型半导体中向负电极移动,形成正电流。

1.1.2. N型半导体

N型半导体是通过将一个纯净的半导体材料中掺杂少量的五价杂质原子(如磷或砷)而形成的。这些杂质原子具有额外的电子,这些额外的电子可以自由地在材料中移动。

在N型半导体中,自由电子是主要的载流子,它们可以在材料中移动,并参与导电。当提供一定的外部电场激励时,自由电子会在N型半导体中向正电极移动,形成负电流。

1.1.3. 二级管

二极管是一种最简单的半导体器件,由P型半导体和N型半导体组成。它具有两个电极,分别称为阳极(A)和阴极(K),其中阳极连接到P型半导体,阴极连接到N型半导体。

当二极管处于正向偏置时,即阳极连于正电压源,阴极连于地或负电压源,P端与正极相连,而N端与负极相连。在这种情况下,电流可以自由地通过二极管,形成正向电流。当二极管处于反向偏置时,即阳极连于负电压源,阴极连于正电压源。在这种情况下,PN结会形成一个电位垒,阻碍电流通过。这就是二级管的特性,单向导流。

1.1. MOS管

金属氧化物半导体型场效应管(Metal Oxide Semiconductor Field Effect Transistor,MOS-FET)是一种MOS管。

1.1.1 截止

下图中的红色方块为金属极,蓝色为氧化物,一般为二氧化硅(绝缘层)。当源极(Source)和漏极(Drain)接通电源时,由于两个N型半导体之间隔着P型半导体,因为P型半导体未加电场,P型半导体中的电子随机分布,无法为两个N型导通提供足够的电子通道。

1.1.2. 导通

当栅极(Gate)和P型衬底接通电源时,因为电场的缘故,P型半导体中的电子都往氧化绝缘层靠近,当绝缘层附近的电子足够多时,两个N型半导体之间的电子通道(N沟道)就形成了,两个N型半导体和中间的电子通道相当于一整个N型半导体。此时,在源极和漏极接上电源,就能够导通。

1.2. 浮栅MOS管

1.2.1. 概念

浮栅MOS管就是在MOS管栅极绝缘层中添加了一层浮栅层,浮栅层一般是金属或半导体。在控制栅和P型衬底接通足够大的电压,P型半导体中的电子会穿过SiO_{2}隧道氧化物绝缘层(这是因为隧穿效应)达到浮栅层。当断开控制栅的电源时,浮栅层的电子因为两边的绝缘层的阻隔,继续留在浮栅中,这样就达到存储的效果。

浮栅MOS管(Floating Gate MOSFET)符号:

1.2.2. 写

写可以理解为充电,如下图,在控制栅加20V电压,在电场的作用下(因为电场足够,且隧道氧化层很薄,就会发生隧穿效应)P型半导体中的电子就穿过隧道氧化绝缘层进入浮栅层。在写操作完成之后,控制栅断开电源,浮栅层继续保存电子,达到存储信息的结果。写操作一般被理解为写0。

注意,在写的时候,如果给源极和漏极添加电压,那么就会在N型之间形成电子通道,源极和漏极直接导通了,电子将从源极向漏极流动,而不会穿透隧道氧化层进入浮栅层。

1.2.3. 读0

因为大部分电子已经被吸到浮栅导以,当控制栅加10V电压时,只有部分电子聚集到两个N型半导体之间,这些电子不够形成一个电子通道,导致源极和漏极之间无法导通,此时表示读到0。

1.2.4. 擦除

擦除可以理解为放电,相当于写1,简单来说就是控制栅接地,衬底接20V,这样浮栅中存储的电子又被电场吸引到P型半导体中,浮栅中就不再存在多作的电子。

1.2.5. 读1

擦除之后读,因为浮栅层的电子全部释放回了P型半导体中,这时在控制栅加10V电压,P型半导体中的电子会聚集到N型半导体之间形成电子通道,源极和漏极之间接上电源,会导通,此时表示读到‘1’。

1.2.6 阈值电压

阈值电压(Threshold Voltage, Vth),就是浮栅MOS管源极漏极导通时栅极需要加的电压。通过控制P型衬底、N型极中的杂质含量,在浮栅中新增电荷为0时,可以让控制栅接0V或负电压时,源极和漏极就能够导通。NAND Flash就是这样的设计。Cell的实际的导通电压可以称为源阈值电压,而校验值的阈值电压可以称为目标阈值电压。

1.3. 多状态

早期浮栅MOS管只能存储1Bit,表示0和1。后来随着技术的发展,浮栅MOS管可以存储2bit、4bit、8bit甚至16bit。

1.3.1. 原理

在控制栅和衬底之间加20V电压,可以触发隧道氧化层发生隧穿效应,P型半导体中的电子会穿越隧道氧化层到达浮栅层。继续加大控制栅的电压,以及持续的时间,可以控制到达浮栅层电子的数量。简单举例:

  1. 控制栅加20V电压,持续100ms,可以让浮栅层存储100个电子。此时要让源极和漏极导通,需要在控制栅加上10V电压,那么Vth=10V。
  2. 控制栅加21V电压,持续200ms,可以让浮栅层存储200个电子。此时要让源极和漏极导通,需要在控制栅加上11V电压,那么Vth=11V。
  3. 控制栅加21V电压,持续300ms,可以让浮栅层存储300个电子。此时要让源极和漏极导通,需要在控制栅加上12V电压,那么Vth=12V。
  4. 控制栅加22V电压,持续400ms,可以让浮栅层存储400个电子。此时要让源极和漏极导通,需要在控制栅加上13V电压,那么Vth=13V。
  5. 控制栅加23V电压,持续500ms,可以让浮栅层存储500个电子。此时要让源极和漏极导通,需要在控制栅加上14V电压,那么Vth=14V。
  6. 控制栅加24V电压,持续500ms,可以让浮栅层存储600个电子。此时要让源极和漏极导通,需要在控制栅加上15V电压,那么Vth=15V。
  7. 控制栅加25V电压,持续600ms,可以让浮栅层存储700个电子。此时要让源极和漏极导通,需要在控制栅加上16V电压,那么Vth=16V。

通过上面的示例可以看出,通过控制栅电压和时间来精确控制浮栅层存储的电子可以达到多bit信息的效果,然后通过不同的导通电压大小来确定具体存储的信息。

1.3.2. 1bit

存储0,让浮栅层存储100个电子;存储1,浮栅层释放所有电子即可。然后控制栅加10V电压,判断导通与截止即可以判断存储的是0还是1。导通电压大于等于10V即为1,不导通即为0。

1.3.3. 2bit

2bit可以表达4种状态,b10、b00、b01和b11。4种状态,需要3个分界线来区分,即3个导能电压Va(10V)、Vb(11V)、Vc(12v),可以称为阈值电压。

读操作,控制栅10V时,浮栅MOS管导通,判别为b11;如果不导通,则继续加大电压读。这种方式,针对b11需要1次读操作,针对b01需要2次读操作,针对b10和b00需要3次读操作。

假如从11V开始读,那么每个状态的判别均为2次操作。这种操作更稳定,实际的判别方式多为这种二分操作方式,更为稳定。

1.3.4. 3Bit

3bit可以表达8种状态b000、b001、b011、b111、b100、b110、b101、b000,需要7个阈值电压V1-V7来判别。读操作,先加上V4,导通为右边状态,不导通为左边状态,再读V3/V5,最后依次读出每一个状态。读出真实的状态,需要3步操作。

1.3.5. 更多Bit

通过更精确的控制浮栅电压和时间,达到更精确的存储电子的数量,再通过更对应的导通电压就可以达到存储更多位状态。如存储4bit的16个状态,存储5bit的32个状态。

2. NAND Flash

NAND Flash由许多存储单元(浮栅MOS管)构成存储阵列(NAND Array),达到可以存储大量的数据。NAND Flash根据存储单元中的状态数量,分为SLC(Single-Level Cell)、MLC(Multi-Level Cell)、TLC(Triple-Level Cell)、QLC(Quad-Level Cell、PLC(Penta-Level Cell)。

2.1. SLC

SLC(Single-Level Cell)因为只存储1bit,所以其存储、读取速度都比较快,并且可靠性也比较高,适用于一些对速度或可靠性有要求的场景。SLC 存储阵列由水平排列的MOSFET构成,其排列如下图:

行由Word Line(WL)连接,列由Bit Line(BL)连接,存储队列两边分别配置了普通MOS管,用来做开关。BLS(Bit Line Selector)用来控制位线的开断,SLS(Source Line Selector)用来控制源线的开断。ONFI (Open NAND Flash Interfact) 国际组织规定了NAND Flash的统一接口操作序列,如擦除、编程(写)、读等。

NAND Flash为了更好的操作,将存储阵列进行了更进一步的拆分管理,分为块(Block),块下面分为页(Page),页由连接在字线上的MOSFET构成。如果一款NAND Flash有2112个块,每个块有128个页,每个页有2112*8bit(MOSFET),总共512MB。

2.1.1. 擦除

一个块上所有的MOSFET的衬底都连接在一起,这样就可以同时擦除一个块上所有MOSFET的数据,所以擦除的速度非常快。

2.1.2. 编程(写)

因为WL上的所有MOSFET的控制栅都连在一起,所以编程最小单位为WL,即一个页。如下图是一个块的存储矩阵,其有m个页,每个页有n个bit。在编程前,确认此块已经擦除,即所有MOSFET的浮栅中均没有存储电荷,即均表示1。要编程Page1,即WL1,对应的数据为b01110111...1,那么只需要 对Bit0、bit4进行编程即可。要给WL1编程,那么就需要在控制栅加上20V电压,然后所有的源极接地,然后所BLS导通,然后通过BL来控制具体的编程。

WL1所有的MOSFET的控制栅都加上了20V电压,但是只有Bit0、Bit4需要进行充电编程,其他bit不用编程。通过前文知道,如果在编程时,如果源极漏极接通电源,会导致N沟通形成,电子会在源极和漏极间传递,而不是进入浮栅层。所以其他不编程的MOSFET需要保持导通。那么其所在的整个位线上的MOSFET都需要导通。所有非编程WL都添加导通电压Vpp=10V,所有不用充电的MOSFET对应的BL都添加检测电压3.3V。

针对需要编程的MOSFET,只需要保证漏极没有接上电源,那么在20V的电压上,字线上没有接通电源的位线对应的MOSFET就会开始进行充电操作。充电是阶梯式往上充电,充一次电,然后在位上接上电源,检测是否导通,若是此位线导通,那么就继续导通,这样就相当于关闭了此位线的充电操作。依次直到所有位线都导通,就完成了整个WL的编程,也即页编程。然后依次可以给整个块完成编程,然后整个NAND Flash。

通过上面的编程步骤可以发现,给NAND Flash上写1会更容易,只需要控制栅加夺,然后并行检测位线是否导通即可。所以给NAND Flash写1会明显给写0快很多。

2.1.2.1. 编程操作
  1. 按需要写入的数据Bit,0对应0V,1对应3.3.V依次将所有位线设置相应的电压。
  2. 将加编程的字线加上20V电压,即完成编程。

2.1.2.2. 编程干扰
  1. 如果位线有Cell坏了或位线设置为0V,导致整个位线不导通,那么整个位线所在的Cell都会加上电压,导致弱编程现象,让电子更多地进入到浮栅中,导致相应Cell的阈值电压增大。
  2. 字线所在的Cell漏极设置为3.3V,源极漏极导通,但是控制栅上的20V电压和漏极3.3V电压的共同影响下,所在Cell的控制栅依然有8V左右的电压,依然会发生弱编程现象,同样会让Cell的阈值电压增大 。

2.1.3. 读

读0和读1会有两个阈值电压,先在栅极施加读0的阈值电压,检测是否导通,如果导通,输出1,结束。如果不导通,则再施加读0的阈值电压。为什么不设计为读1阈值电压不导通,直接认定为0呢?这是因为有可能读0时阈值电压也不导通,这个单元可能存在问题,或是1阈值电压要往下调。

2.1.3.1. 读操作
  1. 所有漏极均接上电源,所有非目标WL均接5V导通电压。
  2. 指定WL的栅极加上读1的Vth=0,如果当前位线导通,则当前位线WL对应的Cell存储的是1,否则为0。

2.1.3.2. 读干扰

当某个位线中有个Cell坏了时,导致整个位线无法导通,那么整个位线上被加5V电压的Cell可能存在一个弱编程的现象,会导致这些Cell的阈值增大。

2.1.4. 阈值与电子分布

下图横坐标为栅极电压,纵坐标为NAND Flash在相应栅极电压下导通的Cell数量(0和1各一半随机分布在Flash上)。

当因为编程和读时产生的弱编程影响,Cell的导通电压会变大。目标阈值电压相对往后移了,此时为了更准确地区分所有的数据,可以将阈值电压增大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1536968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件管理rpm与yum

源代码包下载 Compare, Download & Develop Open Source & Business Software - SourceForgehttps://sourceforge.net/ rpm包下载 Welcome to the RPM repository on fr2.rpmfind.nethttp://rpmfind.net/linux/RPM/ 软件包管理 1.rpm包管理: 1)查询: 安装…

Linux网络协议栈从应用层到内核层②

文章目录 1、bind 源码剖析2、listen 源码剖析3、accept 源码剖析4、connect 源码剖析客户端调用connect成功,但三次握手并未完成,进程是如何阻塞自己客户端在connect时,如何选择源端口客户发送syn封包以及重传服务端收到syn封包,…

python通过tcp协议发送二进制数据

写c程序时经常会有发送私有化协议的过程,比如头结构数据包,数据包往往是一个结构体,有时为了方便调试会用python写一些测试程序。 发送的包的结构图示例如下: 接收包的结构图如下: 当然接收的RespBody会很多&#xf…

【Flask开发实战】防火墙配置文件解析(三)之python加工处理

一、前言 上一篇文章中,介绍了通过shell脚本读取配置文件获取到IP地址组、服务端口组、规则清单这三个模块类别基础数据。基础数据中还需要进一步进行展开处理,生成三类扩展表。如IP地址组中,同一个地址组下存在多个IP地址,每组I…

sy4文件、目录操作命令-补充find

补充下find的命令实例把&#xff0c;我搜了下发现这篇文章的笔记符合课程的实例&#xff1a; 参考< How to Find a File in Linux | Find Command - GeeksforGeeks> 这里做了实验&#xff0c;给大家参考&#xff1a; Linux, renowned for its robust command-line int…

【GIT】最好用的git可视化教程网站推荐

最好用可视化学习git 网站:https://learngitbranching.js.org/?demo&localezh_CN 玩遍所有关卡&#xff0c;花半天时间便能掌握git &#x1f603; 本地仓库 基础命令介绍 git commit 提交 git branch <分支名> 创建分支 git checkout <分支名> 切换分支 git…

定制红酒:品质与口感,双重保障

在葡萄酒的世界里&#xff0c;云仓酒庄的洒派定制红酒以其卓着的品质和迷人的口感&#xff0c;成为了无数品鉴者的心头好。这款红酒&#xff0c;不仅是对品质的追求&#xff0c;更是对生活的热爱和品味的体现。 云仓酒庄深知品质是红酒的灵魂&#xff0c;因此对洒派定制红酒的品…

栈和队列的学习

存储方式分两类&#xff1a;顺序存储和链式存储 栈&#xff1a;只允许从一端进行数据插入和删除的线性表&#xff1a;先进后出 FILO 队列&#xff1a;只允许从一端进行数据插入&#xff0c;另一端进行数据删除的线性表&#xff1a;先进先出 FIFO 栈 创建空栈&#xff0c;创建…

wmv转换成mp4能无损吗?这样设置~

WMV和MP4是两种不同的视频格式&#xff0c;它们使用不同的编解码算法和容器格式。在将WMV转换为MP4时&#xff0c;通常会发生一定程度的重新编码&#xff0c;因此不能完全保证无损转换。无损转换意味着输出的MP4文件与输入的WMV文件在视听上没有任何质量损失&#xff0c;这在实…

基于springboot的反诈宣传平台

技术&#xff1a;springbootmysqlvue 一、系统背景 反欺诈平台可以对公交信息进行集中管理&#xff0c;可以真正避免传统管理的缺陷。反欺诈平台是一款运用软件开发技术设计实现的应用系统&#xff0c;在信息处理上可以达到快速的目的&#xff0c;不管是针对数据添加&#xff…

spring cloud项目微服务间互相调用使用自定义标注进行鉴权方案

来吧&#xff0c;贴代码。 一、背景 我们有一个项目使用了spring cloud&#xff0c;有的微服务需要调用别的微服务&#xff0c;但这些调用没有鉴权&#xff1b;当初项目时间非常紧&#xff0c;同时这部分微服务有的对外也没有鉴权&#xff0c;在代码中设置了无须鉴权&#xf…

真机笔记(2)项目分析

目录 1. 项目&#xff1a; 2. 网络工程师工作流程 3. 实验 设备命名 登录密码 使用SSH协议 1. 项目&#xff1a; 竞标方&#xff1a;集成商、厂商、代理商、服务商、监理检测公司 在一个网络项目中&#xff0c;不同的角色承担着不同的职责和任务。以下是集成商、厂商、代…

程序人生——Java异常使用建议

目录 引出异常建议110&#xff1a;提倡异常封装&#xff1b;建议111&#xff1a;采用异常链传递异常 建议112&#xff1a;受检异常尽可能转化为非受检异常建议113&#xff1a;不要在finally块中处理返回值 建议114&#xff1a;不要在构造函数中抛异常建议115&#xff1a;使用Th…

VMD + CEEMDAN 二次分解,CNN-Transformer预测模型

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

Data.olllo:一键数据“分组统计”!

引言&#xff1a; 数据统计是数据分析中的重要环节&#xff0c;而如何快速、准确地进行数据分组统计是许多数据工作者关注的焦点。现在&#xff0c;借助Data.olllo的神奇功能&#xff0c;您可以轻松进行一键式的数据分组统计&#xff0c;为您的数据分析提供更强大的支持&…

什么是浏览器指纹识别?指纹浏览器有用吗?

浏览器指纹识别是好是坏&#xff1f;这现在确实是一个有争议的话题。83%的消费者经常或偶尔会根据浏览历史记录看到广告。其实这就是利用了浏览器指纹技术。 如果您想了解浏览器指纹识别是什么&#xff0c;那就看下去&#xff01; 一、什么是浏览器指纹识别 浏览器指纹是指无…

Quartz完全开发手册(一篇学会Quartz所有知识点)

目录 一、Quartz概念 1.1、Quartz介绍 1.2、使用场景 1.3、特点 二、Quartz运行环境 三、Quartz设计模式 四、Quartz学习的核心概念 4.1、任务Job 4.2、触发器Trigger 4.3、调度器Scheduler 五、Quartz的体系结构与工作流程 5.1、体系结构 5.2、工作流程 六、Quar…

【Mock|JS】Mock的get传参+获取参数信息

mockjs的get传参 前端请求 const { data } await axios("/video/childcomments", {params: {sort: 1,start: 2,count: 5,childCount: 6,commenIndex: 0,},});后端获取参数 使用正则匹配url /*** # 根据url获取query参数* param {Url} urlStr get请求获取参数 eg:…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(时间滑动选择器弹窗)

以24小时的时间区间创建时间滑动选择器&#xff0c;展示在弹窗上。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文&#xff0c;不可在UI上下文不明确的地方使用&…

vuecli创建vue3项目

第一步&#xff1a; 在文件夹中输入 vue create xxx 第二步&#xff1a; 勾选下面带有*号的&#xff0c;经验最好把Linter/Formatter勾掉&#xff0c;不然会出现eslint报错 第三步&#xff1a; 选择3.x 第四步&#xff1a; 意思为是否用history模式来创建路由&#xff0…