Nand Flash

Nand Flash

1. 什么是 Nand Flash?

Nand Flash 是一种非易失性随机访问存储介质,基于浮栅(Floating Gate)晶体管设计,通过浮栅来锁存电荷,电荷被存储在浮栅中,他们在无电源供应的情况下仍然可以保持。数据在 Flash 内存单元中是以电荷的形式存储的,存储电荷的多少取决于浮栅的外部门所被施加的电压,其控制了是向存储单元中充入电荷还是释放电荷。而数据的表示,以所存储的电荷的电压是否超过一个特定的阈值 Vth 来表示。

image

  • 对于 Nand Flash 的读取,就是通过测量浮动栅上的电荷量来确定存储单元的状态
  • 对于 NAND Flash 的写入,就是控制 Control Gate 去充电(对CG加压),使得悬浮门存储的电荷够多,超过阈值 Vth,就表示0。
  • 对于 NAND Flash 的擦除,就是对悬浮门放电,低于阈值 Vth,就表示1。

2. Nand Flash 生产过程

Nand Flash 是从原始的硅材料加工出来的,硅材料被加工成晶圆(Wafer),一片晶圆可以做出几百颗 Nand Flash 芯片。芯片未封装前的晶粒称为 Die,它是从 Wafer 上用激光切割而成的小片,每个 Die 就是一个独立的功能芯片,它由无数个晶体管电路组成,但最终可被作为一个单元封装起来成为闪存颗粒芯片,下面是 Nand Flash 芯片的详细加工过程。
image

3. Nand Flash 的物理结构

NAND 闪存的读/写单元是一个页。

NAND 闪存的擦除单元是块。

禁止就地覆写 : 覆写涉及一个页面读取 + 一个页面写入。

频繁的覆盖会容易导致大量的无效页(坏页)

Nand Flash 的容量结构从大到小可以分为 Device、Target、LUN、Plane、Block、Page、Cell。一个 Device 有若干个 Die(或者 LUN),每个 Die 有若干个 Plane,每个 Plane有若干个 Block,每个 Block 有若干个 Page,每个 Page 对应着一个 WordLine。

  1. 存储单元(Cell):NAND Flash 中的最小存储单元是存储单元,通常是一个晶体管和一个浮动栅(Floating Gate)组成,可以存储 1bit 或多 bit 数据,主要为颗粒类型。存储单元根据不同的技术可以分为单层单元(SLC)、多层单元(MLC)、三层单元(TLC)等。不同类型的存储单元根据其结构和容量的不同,存储位数也不同。

  2. 页(Page):Page 是 Flash 存储器的最小编程单元,也是最小的读取单元。每个 Page 包含的数据通常为 512 字节到 16 KB 不等,此外还有少量的 OOB(Out-Of-Band)空间,用于存储错误校正码(ECC)或其他元数据。在 NAND Flash 中,数据写入是按页进行的,而读写操作通常基于页级别。

  3. 块(Block):Block 是 Flash 存储器中的最小擦除单元。每个 Block 包含多个 Page,可以通过编程来写入,但擦除时必须一次性擦除整个 Block。常见的 NAND Flash Block 大小在 64 KB 到几 MB 之间。写入数据时只能在空的 Page 上进行,而擦除操作则针对整个 Block。

  4. 平面(Plane):Plane 是 Die 内部的一个区域,拥有独立的 Page 寄存器,包含多个 Block,通常 Flash 每个 Die 有两个或更多 Plane。Plane 允许在内部并行进行操作,比如在一个 Plane 进行读操作的同时,另一个 Plane 进行写操作,以提高性能。

  5. Die(晶粒): Die 是构成 Flash 存储芯片的基本物理单元,每个 Die 都可以单独操作。通常,多个 Die 集成在一个封装中。一个 Die 由多个 Plane 组成,可以看作 Flash 存储的主要工作单元。

  6. LUN(逻辑单元,Logical Unit Number): LUN 是 Flash 存储器中逻辑单元的表示,它可以包含一个或多个 Die。每个 LUN 可以独立地进行操作,如读取、写入和擦除。多个 LUN 可以并行操作,以提高吞吐量。

  7. Target:在一块 NAND Flash 芯片中,可以有多个 Target,每个 Target 通常由一个控制器(Controller)管理。

  8. 晶片(Chip/Device):多个 NAND Flash 芯片可以集成在同一个封装中,形成一个 NAND Flash 晶片。这些芯片可以通过一些额外的控制电路以及存储控制器来组织和管理,形成一个完整的存储设备,如固态硬盘(SSD)。

image

Die/LUN 是接收和执行 FLASH 命令的基本单元。不同的 LUN 可以同时接收和执行不同的命令。但在一个 LUN 当中,一次只能执行一个命令,不能对其中的某个 Page 写的同时又对其他 Page 进行读访问。

NAND Flash 的物理结构决定了它的特性和工作原理。不同的结构可以影响到存储密度、读写性能、耐久性以及成本等方面。

image


image

Bit-Line(BL)、Source-Line(SL)、Word-Line(WL)是三种重要的信号线,用于实现存储单元的读取和写入操作。

  • Bit-Line(BL):Bit-Line 是连接存储单元的位线,负责传输数据信号。当进行读取操作时,通过 Bit-Line 接收存储单元中存储的数据值。在进行写入操作时,也通过 Bit-Line 向存储单元传输写入的数据。
  • Source-Line(SL):Source-Line 是连接晶体管的源端的线路,用于传输控制信号。在进行读取操作时,Source-Line 会被激活以打开晶体管,使得 Bit-Line 上的数据能够流入至读取电路。在进行写入操作时,Source-Line 会被激活以控制晶体管的通断,从而控制写入操作的进行。
  • Word-Line(WL):Word-Line 是连接存储单元的字线,用于选择要进行操作的存储单元。在进行读取操作时,Word-Line 会被激活以打开特定的存储单元,使其能够与 Bit-Line 进行连接。在进行写入操作时,Word-Line 会被激活以选择需要写入数据的存储单元。

4. Flash 的基本特性

4.1 Flash 影响因素及 SSD 使用寿命计算

Nand Flash 的寿命不等于 SSD 的寿命;SSD 盘可以通过多种技术手段从整体上提升 SSD 的寿命,通过不同的技术手段,SSD 盘的寿命可以比 NAND Flash 寿命提高 20%~2000% 不等。

Nand Flash 的寿命主要通过 P/E cycle 来表征。SSD 由多个 Flash 颗粒组成,通过盘片算法,可以发挥有效颗粒寿命。影响 SSD 盘使用寿命关键因素主要包括下面因素:

  • 每年写入数据量,和客户的业务场景有关;
  • 单个 Flash 颗粒寿命,不同颗粒的 P/E cycle 不同
  • 数据纠错算法,更强纠错能力延长颗粒使用寿命
  • 磨损均衡算法,避免擦写不均衡导致擦写次数超过颗粒寿命
  • Over Provisioning 占比,随着 OP(预留空间)的增加 SSD 磁盘的寿命会得到提高

image

4.2 Data Retention 数据保存力

Data Retention(数据保存力):是用于衡量写入 NAND Flash 的数据能够不失真保存时间的可靠性指标

一般定义为在一定的温度条件下,数据在使用 ECC 纠错之后不失真保存在 NAND Flash 中的时间;影响 Data Retention 最大的两个因素是擦写次数和存储温度,通常情况下企业级 SSD 盘的 Data Retention 都是遵循 JEDEC 的 JESD218 标准,即 40°C 室温下,100% 的 PE Cycle 之后,在下电的情况下 Data Retention 时间要求达到3个月。

4.3 Endurance 耐用性

Endurance(耐用性):用于衡量 NAND Flash 的擦写寿命的可靠性指标

Nand Flash 写入前必须擦除,Block 擦除1次之后再写入1次称为1次 PE Cycle;Endurance 指的是在一定的测试条件下 NAND Flash 能够反复擦写数据的能力,即对应 NAND Flash 的 PE(Program/Erase)Cycle。

4.4 Bit Error Rate(BER)

Bit Error Rate(BER)指由于 NAND Flash 颗粒概率发生 Bit 位翻转导致的错误,其中,RBER(Raw Bit Error Rate) 指没有经过 ECC 纠错时出现一个 Bit 位发生错误的几率,RBER 也是衡量 NAND 品质的一项指标。RBER 是 NAND 自身品质的一个特性,随着PE次数的增加会变差,出现趋势呈指数分布,其主要原因是擦写造成了浮栅氧化层的磨损。

4.5 Uncorrectable Bit Error Rate(UBER)

UBER(Uncorrectable Bit Error Rate)指发生不可纠正 ECC 错误的几率,即一个纠错单元 Codeword 内发生 bit 位翻转的位数超出 ECC 算法可纠能力范围的几率。

4.6 Diskful Write Per Day(DWPD)

DWPD(Diskful Write Per Day)指每日写入量。SSD 的成本随着 DWPD 增加而变高,未来 SSD 的趋势预测密集型当前已占50%,未来的占比会逐渐变大。

5. Flash 的种类

Flash 存储器通常分为两种类型:Raw NAND 和 SPI NAND。它们有不同的工作原理和应用场景。

  1. Raw NAND:

    • Raw NAND 是一种基本的 NAND 存储器,通常用于大容量数据存储,比如固态硬盘(SSD)或闪存卡。
    • 它们通常具有较高的存储密度和较低的成本,但需要额外的控制器来管理块擦除和写入操作。
    • 在应用中,Raw NAND 通常与专用的存储控制器一起使用,以提供数据的可靠性和持久性。
  2. SPI NAND:

    • SPI NAND 是一种通过 SPI(串行外设接口)进行通信的 NAND 存储器。
    • 它们通常用于嵌入式系统和小型设备,如路由器、智能家居设备等,因为它们提供了简单的接口和更小的封装尺寸。
    • 与 Raw NAND 不同,SPI NAND 不需要额外的控制器,因为它们可以直接通过 SPI 接口与微控制器通信。

5…1 常见 Nand Flash 拥有的引脚

  • I/O 0~I/O 7: 用于输入地址/数据/命令,输出数据
  • CLE: Command Latch Enable,命令锁存使能,在输入命令之前,要先在模式寄存器中,设置 CLE 使能。
  • ALE: Address Latch Enable,地址锁存使能,在输入地址之前,要先在模式寄存器中,设置 ALE 使能。(地址锁存是由于数据和地址是复用同一些信号线或引脚的,一般来讲是由于工艺的要求,尽量节省成本和开支,那么在同一个引脚上就会出现两种信息:地址和数据,可处理器读的时候并不知道什么时候是地址,什么时候是数据,因此,需要一些专用的芯片把它们分开,用一些专用的信号联络线来区分这些信号,这就叫地址锁存)
  • CE#:Chip Enable,芯片使能,在操作 Nand Flash 之前,要先选中此芯片,才能操作。
  • RE#:Read Enable,读使能,在读取数据之前,要先使 CE# 有效。
  • WE#:Write Enable,写使能,在写取数据之前,要先使 WE# 有效。
  • WP#:Write Protect,写保护。
  • R/B#:Ready/Busy/Output,就绪/忙,主要用于在发送编程/擦除命令后,检测这些操作是否完成,忙,表示编程/擦除操作仍在进行中,就绪表示操作完成。
  • Vcc: Power 电源
  • Vss: Ground 接地
  • N.C: Non-Connection,未定义,未连接。

6. Nand Flash 特殊的硬件结构

  1. 需要先擦除才能写入。Nand Flash 可以读写一个Page,但是必须要以 Block 大小进行擦除。擦除操作就是让块中所有的 bit 变成1,从一个干净的“已擦除”状态的 Block 重新开始,当里面的页变成0后,只有擦除整个块才能让这个页变成1.为了尽量减少擦除的次数,成熟的管理技术必不可少。
  2. 读、写干扰。Nand Flash 的电荷非常不稳定,在读/写中很容易对相邻的单元造成干扰,干扰后会让附近单元的电荷脱离实际的逻辑数值,造成 bit 出错,因为阈值接近的关系,MLC 相对 SLC 来说更容易受到干扰。读取干扰指的是在读取某个 page 时,邻近的 bit 会受到升高电压的干扰,造成 bit 出错。写入干扰指的是,某个 page 在写入时,邻近 bit 的电压也被升高了,造成 bit 出错。相对写入干扰来说,读取干扰明显小的多。在读/写干扰中,可能造成某些 bit 被改变,结果造成数据出错。所以需要在返回数据给主机前,用 ECC/EDC 算法来纠正这些 bit 的错误。随着闪存工艺的提升,同样大小的晶片上被封装入更多的单元,造成干扰越来越厉害,所以需要更强大的 ECC/EDC 来纠正 bit。
  3. 数据保存期限。数据保存期指的是当完全断电后,数据能在 NAND Flash 中保存多久。NAND 单元必须保存一个稳定的电压水平,来保证数据是有效的。典型的 SLC 一般为20年。电荷从悬浮门里漏出,这叫做电子迁移,当随着时间的流逝,电核泄漏到一定程度,改变了 NAND 单元里悬浮门的电压对应的逻辑值,这样就造成了 bit 出错。数据保存期会随着擦写次数的增加而明显降低,MLC 的数据保存期明显会比 SLC 少,而且更容易被干扰。
  4. 坏块。Nand Flash 中有两种坏块类型:出厂坏块,由于为了保证量产和控制成本,出厂的 Nand Flash 某些就会有坏块,厂商保证 SLC 出厂坏块低于2%,MLC 出厂坏块低于5%。积累坏块,在多次的写入/擦除循环中,某些 Nand 单元的电荷电压被永久性的改变了,那就意味着包含这个 Nand 单元不再可用。所以固态硬盘需要有坏块管理才能使用,主控制器用坏块表来映射出厂坏块和积累坏块到坏块区内,出厂时,颗粒的第一个块 Block 0 厂商会保证是可用的。(至少 ECC 后可用)
  5. 擦写次数限制。造成 nand flash 有擦写次数限制的主要有2个因素,电荷被困在氧化层,不能进入悬浮门;或是氧化层结构被破坏。

image

如图,一旦氧化层损坏到达一定程度,造成电荷越来越难在 P-substrate 和悬浮门之间交流。电荷被困在氧化层造成悬浮门中的电压到达不了阈值,所以说这个 NAND 单元就要被放入坏块区了。当前主流 SLC 的 P/E 为10万次,50nm MLC 为1万次,3xnm 的 MLC 为5000次。到了这个数值并不意味着不能使用了,这只是代表平均寿命,也就是说到了这个数值后,坏块会开始大量增加。随着工艺的提升,ECC 的要求越来越高,50nm 的 SLC 颗粒,三星对顶 1bit ECC 的就够了,而 50nm MLC 需要 4bit ECC,到了 3xnm 要求达到 24bit ECC。

6.1 ECC

影响 Nand Flash 稳定性和耐久度的一个主要因素就是 ECC 能力,目前最常用的三种算法是:

  • Reed-Solomon
  • Hamming
  • BCH(Bose,Ray-Chauduri,Hocquenhem)
    不管是任何ECC算法,任何主控,检测错误的方式都是相同的:

image

  1. 每当一个 Page 写入 Nand Flash,数据会通过 ECC 引擎,创造独特的 ECC 签名。
  2. 数据和对应的 ECC 签名都存放在 Nand Flash 里,数据存放在数据区,ECC 签名存放在 SA 区。
  3. 当需要读取数据时,数据和 ECC 签名一起被送往主控制器,此时新的 ECC 签名被生成。
  4. 此时主控把2个签名对照,如果签名相同,说明数据没有错误,数据就会被送往主机。如果签名不同,数据就会先放在主控里,而不是直接送往主机。

某些主控会把改正后的数据再次回写闪存,另一些则不会,因为谁也不知道下次读取会不会再出错。ECC 的能力直接关系到 Nand Flash 的耐久度,数据保存期。当 Nand Flash 的 P/E 数到了之后,错误数会越来越多,ECC 弱的直接就报坏块并标记退休,如果 ECC 能力足够强,就能够挖掘出 Flash 的所有潜力。

6.2 闪存内部原理

闪存的内部存储结构是金属-氧化物-半导体-场效应管(MOSFET): 源极、漏极和栅极,其工作原理与场效应管类似,都是电压利用控制源极和漏极之间的通断。闪存是双栅极结构,在栅极和硅衬底之间还有一个浮置栅极,浮置栅极是有氮化物夹在二氧化硅材料之间构成。

image

对闪存单元的编程:控制栅极去充电,对栅极加压,使得浮置栅极存储的电荷越多,超过阈值,就表示0;对闪存单元的擦除,即对浮置栅极进行放电,低于阈值,就表示1。

7. Nand Flash 与 FEC

7.1 差错控制策略

差错控制策略一般分为两种;

  1. 一种是自动请求重传(Automatic Repeat Request, ARQ),接收端检测到错误时,会向发送端要求重新传输该消息,直到正确接收到为止。这种方法的优点是简单,不需要复杂的纠错译码,缺点是当错误较多时不断地重传会大大降低传输速率;
  2. 一种是前向纠错(Forward Error Correction, FEC),接收端利用纠错码自动地纠正错误。优缺点和 ARQ 相反。

在某些情况下,FEC 和 ARQ 会同时应用。利用FEC来纠正经常出现的少量错误,利用 ARQ 来保证偶尔出现很多错误时系统不至于出错。

Nand Flash 就是 FEC 和 ARQ 两种策略同时应用的典型例子。

  • 当 Nand Flash 错误较少时,FEC 能够自动纠错完成数据的读取。在 NandFlash 中,最常使用的 FEC 编码是分组码。包括 Hamming code,RS code,BCH code,LDPC code等都属于分组码。
  • 当错误数量大于 FEC 的纠错能力时,主控会使用 Read retry 来请求 Nand Flash 重新发送数据,直到 FEC 能够完成纠错。
  • 通常 Read retry 会尝试改变 Vread 的值,使得 NF 能正确区分1和0。假设一个 cell 写入了一个1,但是它的 Vth 分布在下图蓝色线(Vread)的右边,因此它被错误地读取为0,通过把 Vread 移动到 Vth 右边后,就能正确读取这个 cell 的值。

image

7.2 向前纠错编码常见编码方案

当谈论前向纠错编码(FEC)时,Hamming 码、RS 码、BCH 码和 LDPC 码是四种常见的编码方案,它们在数据通信和存储领域中都有广泛的应用。

Hamming 码:
  • Hamming 码是一种简单的奇偶校验码,由 Richard W. Hamming 在1950年代提出。
  • 它的基本思想是在数据中添加冗余位来允许检测和纠正错误。
  • 最常见的是 Hamming (7,4) 码,其中每个数据字节(4位)后添加3位冗余校验位。
  • Hamming 码可以检测并纠正单个位错误,但不能处理多位错误。
RS 码(Reed-Solomon 码):
  • RS 码是一种广泛应用的纠错码,由 Irving S. Reed 和 Gustave Solomon 在1960年代提出。
  • 它是一种多项式编码,适用于纠正差错模式的通信信道。
  • RS 码在数据存储(如光盘、磁盘)和数据传输(如卫星通信)等领域中得到广泛应用。
  • RS 码的一个主要优点是它可以纠正任意数量的错误,前提是错误数量不超过其纠错能力。
BCH 码(Bose-Chaudhuri-Hocquenghem 码):
  • BCH 码是一种广泛应用的线性纠错码,由 Raj Bose、D. K. Ray-Chaudhuri 和 Alexis Hocquenghem 在1960年代提出。
  • 它是一种循环纠错码,常用于数据存储和通信中。
  • BCH 码具有很强的纠错能力,可以纠正多个位的错误,且其纠错能力随着码长的增加而增加。
LDPC 码(Low-Density Parity-Check 码):
  • LDPC 码是一种容量接近香农极限的编码方案,由 Robert G. Gallager 在1960年代提出。
  • 它是一种分布式编码,通过稀疏的校验矩阵实现低密度。
  • LDPC 码在通信系统中具有优异的纠错性能,特别适用于高速数据传输和无线通信领域。
  • LDPC 码的主要特点是它可以接近香农极限,提供接近理论极限的纠错性能。

7.3 分组码原理

下面举例说明分组码的概念:

设有一种由3位二进制数字构成的码组,它共有8种不同的可能组合。若将其全部用来表示天气,则可以表示8种不同天气,

例如:

“000”(晴),“001”(云),

“010”(阴),“011”(雨),

“100”(雪),“101”(霜),

“110”(雾),“111”(雹)。

其中任一码组在传输中若发生一个或多个错码,则将变成另一个信息码组。这时,接收端将无法发现错误。


若在上述8种码组中只准许使用4种来传送天气,例如:

“000”=晴 “011”=云 “101”=阴 “110”=雨

这时,虽然只能传送4种不同的天气,但是接收端却有可能发现码组中的一个错码。

例如,若“000”(晴)中错了一位,则接收码组将变成“100”或“010”或“001”。这3种码组都是不准使用的,称为禁用码组。

接收端在收到禁用码组时,就认为发现了错码。当发生3个错码时,“000”变成了“111”,它也是禁用码组,故这种编码也能检测3个错码。

但是这种码不能发现一个码组中的两个错码,因为发生两个错码后产生的是许用码组。


上面这种编码只能检测错码,不能纠正错码。

例如,当接收码组为禁用码组“100”时,接收端将无法判断是哪一位码发生了错误,因为晴、阴、雨三者错了一位都可以变成“100”。

要能够纠正错误,还要增加多余度。

例如,若规定许用码组只有两个:“000”(晴),“111”(雨),其他都是禁用码组,则能够检测两个以下错码,或能够纠正一个错码。

例如,当收到禁用码组“100”时,若当作仅有一个错码,则可以判断此错码发生在“1”位,从而纠正为“000”(晴)。因为“111”(雨)发生任何一位错码时都不会变成“100”这种形式。

但是,这时若假定错码数不超过两个,则存在两种可能性:“000”错一位和“111”错两位都可能变成“100”,因而只能检测出存在错码而无法纠正错码。


分组码的结构

将信息码分组,为每组信息码附加若干监督码的编码称为分组码 。

在分组码中,监督码元仅监督本码组中的信息码元。

信息位和监督位的关系:举例如下

信息位监督位
000
011
101
110

分组码的符号:(n, k)

N :码组的总位数,又称为码组的长度(码长),

k :码组中信息码元的数目,

n – k = r : 码组中的监督码元数目,或称监督位数目。

image


码重:把码组中“1”的个数目称为码组的重量,简称码重。

码距:把两个码组中对应位上数字不同的位数称为码组的距离,简称码距。码距又称汉明距离。

例如,“000”=晴,“011”=云,“101”=阴,“110”=雨,4个码组之间,任意两个的距离均为2。

最小码距:把某种编码中各个码组之间距离的最小值称为最小码距(d0)。例如,上面的编码的最小码距 d0 = 2。


码距的几何意义

对于3位的编码组,可以在3维空间中说明码距的几何意义。

每个码组的3个码元的值(a0, a1, a2)就是此立方体各顶点的坐标。而上述码距概念在此图中就对应于各顶点之间沿立方体各边行走的几何距离。

由此图可以直观看出,上例中4个准用码组之间的距离均为2

image


码距和检纠错能力的关系

一种编码的最小码距d0的大小直接关系着这种编码的检错和纠错能力

为检测e个错码,要求最小码距 d0 >= e + 1,设一个码组A位于O点。若码组A中发生一个错码,则我们可以认为A的位置将移动至以O点为圆心,以1为半径的圆上某点,但其位置不会超出此圆。 若码组A中发生两位错码,则其位置不会超出以O点为圆心,以2为半径的圆。因此,只要最小码距不小于3,码组A发生两位以下错码时,不可能变成另一个准用码组,因而能检测错码的位数等于2。

image


为了纠正t个错码,要求最小码距d0 >= 2t + 1,图中画出码组A和B的距离为5。码组A或B若发生不多于两位错码,则其位置均不会超出半径为2以原位置为圆心的圆。这两个圆是不重叠的。判决规则为:若接收码组落于以A为圆心的圆上就判决收到的是码组A,若落于以B为圆心的圆上就判决为码组B。这样,就能够纠正两位错码。

image


7.4 BCH码 与 LDPC 码

image

image

买 SSD 如果要上 TLC,就买主控带 LDPC 的。

8. 参考文章

  • Inside Flash Memories; Rino Micheloni等著; Springer出版

  • 差错控制编码; Shu Lin等著,晏坚等译;

  • 《通信原理》_樊昌信_曹丽娜_编著第六版课件_第11章

  • Low-Power High-Throughput BCH Error Correction VLSI Design for Multi-Level Cell NAND Flash Memories. Wei Liu, Junrye Rho, and Wonyong Sung. IEEE

  • http://t.csdnimg.cn/jzZ7l

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霜晨月c

谢谢老板地打赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值