利用局部性原理:
在最便宜的存储技术条件下,尽可能为用户提供更大的存储容量。
同时提供以最快存储技术所能提供的速度进行访问。
random access memory 按地址存取数据
serial access memory 按顺序存取数据
content addressable memory 按关键词匹配数据
一维存储器结构(沿纵向把连续的存储字堆叠起来)
左图:通过选择位
右图:通过插入一个译码器来减少选择信号的数目。
一般将译码器的尺寸设计成与存储单元的尺寸以及这二者之间的连线相匹配,具体来说即右图中的 S 信号不需要占用任何额外的面积。这一方法的价值可以通过把右图看成一个存储器模块的实际平面布置来体会。通过使译码器和存储器核之间的节距相匹配,S 线可以非常短,并且不需要任何大的布线通道。
问题:1. 尺寸不合理(高宽比特别大) 2. 运行速度慢(最上方的存储单元连接到输入/输出的垂直线过长)
为了解决上述问题,诞生了二维存储器结构
基本思想:存储器的面积主要是由存储单元的尺寸决定,为了使得存储单元的的尺寸尽可能小(一个单元/每位所包含的晶体管数量少),存储单元必须牺牲数字电路所希望的某些特性,如噪声容限、逻辑摆幅、输入/输出隔离、扇出或速度来减少单元面积。
与外围电路进行交互时,必须恢复所希望具有的数字信号特性。
例如,常常把位线上的电压摆幅降低至明显低于电源电压。这可以同时降低传播延迟和功耗。因为在存储器阵列内部可以仔细地控制串扰和其他干扰,这就保证了即使对于这些小的信号摆幅也能得到足够的噪声容限。
反之,与外部接口时则要求把内部摆幅放大到电源至地的全摆幅。这是由图 12.4 所示的灵敏放大器(sense amplifier)来完成的。这些外围电路的设计将在 12.3 节中讨论。
放宽对许多数字电路特性的要求使得设计者有可能把单个存储单元的晶体管数目减少到在 1 至 6 个晶体管之间!
层次化存储结构:增加Block address ,块选择器使得每次只有一个块工作
优点:
使本地字线和位线的长度(即各块内部的线长)保持在一定的界限内,这使存取速度较快。
块地址只激活被寻址的块。未被寻址的块置于省电模式,它们的灵敏放大器和行与列译码器都不工作。从而降低功耗。
对于一个存储器,如果它有
优点:规则性好,容易设计。如果使用优秀的存储单元,可以实现非常高的密度。
智能手机中常见的存储器结构:
应用处理器,Application Processor
基带处理器,Baseband Processor
S/DRAM
NOR Flash,用于代码存储,Code Storage
NAND Flash,用于用户数据存储,User Data
SRAM
只要电源持续供电,数据就能保持。
存储单元较大,通常每个单元需要 6 个晶体管,因此单芯片能存储的 bit 数较少。
速度快,因此用于对速度要求高的场景,例如 Cache。
差分输出,输出 BL 和 !BL。
为了提升性能,使用灵敏放大器。
与 CMOS 工艺兼容。
DRAM
需要周期性刷新。
存储单元较小,通常每个单元需要 1 到 3 个晶体管,因此单芯片能存储更多 bit。
速度较慢,因此常用于主存。
单端输出,只输出 BL。
为了正确工作,需要灵敏放大器。
通常不与标准 CMOS 工艺兼容。
存储器的时序特征
读出时间(read-access time):从存储器中取(读)出数据所需要的时间,它等于从提出读请求到数据在输出端上有效之间的延时。
写入时间(write-access time):写入时间是指从提出写请求到最终把输入数据写入存储器之间所经过的时间。
读周期(Read Cycle)、写周期(Write Cycle):前后两次读或写操作之间所要求的最小时间间隔。通常大于读出/写入时间。
读周期和写周期并不一定要一样长,但为了简化系统设计可以认为它们的长度相等。
DRAM 时序 地址复用(多路分时寻址):地址总线先传输 Row Address,再传输 Column Address。
升高RAS(行读取选通脉冲)信号表示地址的最高有效位(msb)部分已出现在地址总线上,因此可以开始字(地址)译码过程。
随后放上地址的最低有效位(lsb)部分,并使CAS(列读取选通脉冲)信号有效。
为了保证存储器正确工作,应当仔细安排RAS-CAS期间的时序。事实上,RAS和CAS信号的作用相当于存储器模块的时钟输入,它们用来同步存储器的工作,如译码、存储器核存取和灵敏放大等。
SRAM 时序 自定时:地址变化会启动存储器操作。
整个地址字一次出现,并提供电路自动检测该地址总线上的任何变化。不需要任何外部的时序信号,所有内部的时序操作(如启动译码器和灵敏放大器等)都来自内部产生的翻转信号。
优点:SRAM的周期时间接近或等于它的存取时间,这一点与DRAM的情形完全不同。
SRAM 单元:保存 1 bit 信息,类似锁存器。必须支持读操作和写操作。
12T SRAM 单元:使用一个简单锁存器连接到位线;单元尺寸为 46 × 75 λ。
存储单元尺寸占据整个阵列面积的大部分。因此,可以通过减小单元尺寸来提高密度,但代价是电路复杂度增加。
6T SRAM 单元:大多数商业芯片中使用这种结构。数据存储在一对交叉耦合反相器中。
核心:用一对交叉耦合的弱反相器用来保持状态和一对存取管用来读出或写入状态。
交叉耦合反相器的正反馈可以克服由泄漏电流或噪声引起的扰动,从而使得保持状态稳定。
单元写入时,先将所希望写入的值及其补值驱动到一对位线 bit 和 bit_b 上,然后升高字线 word 的电压。这一新数据将克服交叉耦合反相器的作用。
读出时,先将这两条位线预充电至高电平,然后使它们浮空。当字线 word 上升时,位线 bit 或 bit_b 被下拉,这代表了要读出的数据。
SRAM 设计的一个主要挑战是减小它的尺寸并保证保持状态的电路足够弱因而能在写期间被克服,但又足够强因而不会在读期间被干扰。
图 12.4 显示了一个正在读出的 SRAM 单元。
两条位线最初都被预充电浮空在高电平上。不失一般性,可以假设 Q 最初为 0 因而 Q_b 最初为 1。Q_b 和 bit_b 都应当保持为 1(起到钳位作用,使交叉耦合反相器不易发生误翻转)
当字线电压上升时,bit 应当通过驱动(driver)管
图 12.4(b) 显示了当 0 被读至位线 bit 上时读操作的波形。注意,虽然 Q 会短暂上升,但这一毛刺不足以使单元状态发生翻转。
将一条位线驱动为高电平,另一条位线驱动为低电平。然后打开字线。位线通过访问管强行改变存储单元中的值。
图 12.6 显示了一个正在写入的 SRAM 单元。同样,假设 Q 最初为 0 并且我们希望写 1 到这个单元中。首先将 bit 被预充至高电平并保持浮空, bit_b 被写驱动器下拉。
我们知道由于读稳定性约束的限制,bit 将不能通过 A1 强制使 Q 的电平升高。因此该单元必须通过 A2 强制使 Q_b 的电平降低才能写入 1。但 P2 阻止这一操作,因此 P2 必须比 A2 弱才能使 Q_b 下拉至足够低的电平。这一约束称为可写性(writability)。
一旦 Q_b 下降至低电平,D1 变为截止而 P1 变为导通,于是就将 Q 上拉至所希望的高电平。
在读操作中,高电平位线不能压倒单元内部反相器,否则会破坏原数据。
在写操作中,低电平位线又必须能够把新值写入单元。
左图 SRAM 列读出 :在相位 2 时,两条位线被预充电至高电平。但字线只在相位 1 期间上升,因此它可以看成是一个合格时钟 _q1 (见 10.4.6 节)。许多 SRAM 单元共享同一对位线,它们的作用就像是分布的双轨无足动态多路开关。整条位线的电容必须通过存取管放电。该单元的输出可以由一对高偏斜反相器检测。提高检测反相器的翻转阈值可以减少延时但代价是降低了噪声容限。输出为双轨单调上升信号,这和多米诺门中的情形恰好一样。
右图 SRAM 列写入 :在相位 2 时,两条位线被预充至高电平。在相位 1 期间写驱动器将位线或反相位线下拉至低电平,以对该单元进行写操作。写驱动器可以由每条位线上的一对晶体管构成,它们分别用于数据和写使能控制,也可以由合适的信号组合驱动单个晶体管构成(见图 12.7(b))。但无论哪一种情形,写驱动器、位线和存取管的串联电阻必须足够低才能克服 SRAM 单元中 pMOS 管的影响。某些阵列采用三态写驱动器快速地将一条位线驱动至高电平而将另一条位线下拉至低电平,从而提高了可写性。
4x4 SRAM 存储器阵列:位线4条 + 反相位线4条,不能错认为是 4x8
电阻负载SRAM单元(4T SRAM):使用两个高阻值的
问题是无论何时都存在从
但是,另一个问题是,当
SRAM 存储器在历史上就一直是从全局静态的角度来设计的。存储器的操作由地址总线上的事件或 R/W 信号来启动,如 PPT 13所示,无须额外的时序信号或控制信号。看来这样一种方法意味着所有的电路(如译码器和灵敏放大器)都是完全静态实现的,因此其中一个输入信号上的变化(数据或地址总线,R/W)都会逐次通过后续的电路层次。无论从面积还是功耗的角度考虑,对于较大容量的存储器,这种全静态方法都是不可行的。因此 SRAM 存储器采用了一种更聪明的办法,称为地址变化探测法(ATD),这一方法在测得外部环境有变化时就自动产生内部信号,如 PC 和 SE。
ATD 电路在 SRAM 和 PROM 模块的结构中起着很重要的作用。它是大多数时序信号的来源并且是整个关键时序路径中的一部分,因此它的速度是最重要的。
上图是 ATD 的一种可能的实现。它由许多信号翻转触发的单脉冲电路构成(每一输入位有一个),连接成一个伪 NMOS NOR 的结构形式。其中任何一个输入信号上的翻转都会引起
在讨论电阻负载 SRAM 单元时,我们注意到负载电阻的唯一功能是补充由于漏电造成的电荷损失。一种办法是完全取消这些负载并经过周期性地重写这个单元的内容来补偿电荷损失。这一刷新操作包括读单元的内容以及随后进行的写操作,它应当经常发生以保证存储单元的内容决不会因漏电而丢失。一般来说,刷新应当每 1 ms 至 4 ms 发生一次。对于容量较大的存储器来说,单元复杂性的降低足以补偿因刷新要求所增加的系统复杂性。这些存储器称为动态存储器,因为这些单元的工作原理是基于在电容上存储电荷。
三管动态存储单元 :通过取消负载电阻得到。这一四管单元可以进一步简化,因为我们注意到该单元同时存放数据信号值和它的反信号值,所以这里有冗余。再取消一个器件可以消除这一冗余,并由此得到了三管 DRAM 单元。
写入:这个单元是通过把要写的数据值放在 BL1 上并使写字线(write-word line, WWL)有效来写入的。一旦 WWL 降低,数据就作为电容上的电荷被保留下来。
读出:在读这一单元时,读字线(read-word line, RWL)被提升。存储管
刷新:刷新单元最常用的方法是先读出所存放的数据,然后把它的反信号值放到 BL1 上,再使 WWL 有效,这样依次进行。
不同于 SRAM 单元,3T DRAM 单元对器件间的尺寸比没有任何约束。这是动态电路的共同性质。器件尺寸的选择只需基于性能和可靠性方面的考虑。注意,当采用静态位线写入方法时这一结论不成立。
不同于其他 DRAM 单元,读 3T DRAM 单元的内容是非破坏性的,即存放在单元中的数据值不会受读操作的影响。
不需要任何特殊的工艺处理步骤。3T 单元的存储电容实际上就是读出器件的栅电容。这一点不同于下面要讨论的其他 DRAM 单元,这使它对嵌入式存储器的应用极具吸引力
当写 1 时,在存储节点 X 上的存放值等于
1T DRAM:在写周期期间,数据值被放在位线 BL 上,而字线 WL 则被提升。根据数据值的不同,单元电容或者充电或者放电。在进行读操作之前,位线被预充电至电压
若想得到正确的功能,需要把
单管 DRAM 单元的读出是破坏性的。这就是说存放在单元中的电荷数量在读操作期间会被修改,因此完成一次读操作之后必须再恢复到它原来的值。于是在单管 DRAM 中读和刷新操作必然相互交织在一起。
DRAM 存储单元是单端结构,这会使灵敏放大器的设计更加复杂。
对于 1T 单元,由于读操作会导致存储的电荷重新分布,因此每条位线都需要一个灵敏放大器。
1T 单元的读操作是破坏性的,因此读出后必须刷新以恢复数据。
1T 单元需要额外的电容,而且该电容必须显式地包含在设计中。
写入 “1” 时会损失一个阈值电压。这个问题可以通过将字线自举到高于 VDD 的电压来避免。
多晶硅-扩散电容 1T-DRAM 扫描电子显微镜 SEM 图像
ROM的基本设计思路:当字线有效时就有 0 或 1 出现在位线上
假设位线 BL 电阻性地接地,即 BL 通过一个接地电阻被下拉,没有任何其他的激励或输入。
二极管 ROM
0 单元:字线 WL 和位线 BL 之间不存在任何实际的连接,所以 BL 的值为低电平而与 WL 的值无关
1 单元:一个高电压
缺点:二极管单元的位线与字线不隔离。所有需要用来充电位线电容的电流必须通过字线和它的驱动器来提供,这些电流在大容量存储器中可能会很高,因此这一方法只适用于小存储器。
MOS ROM 1
一个主要差别:它的所有输出驱动电流都是由单元中的 MOS 管提供的。字线驱动器只负责充电和放电字线电容。
代价:单元比较复杂和面积较大(额外的电源接触孔)
MOS ROM 2的位线通过电阻接到电源电压上,或者说输出的默认值必须等于 1。因此,在 WL 和 BL 之间没有晶体管意味着存放 1。0 单元通过在位线和地之间连接一个 MOS 器件来实现。在字线上加一个高电压使该器件导通,从而把位线下拉至 GND。
之所以称为 OR ROM:每一条位线 BL 的输出逻辑等价于多个字线信号的“或”运算。虽然实际使用时通常一次只选中一条WL[i]。
可以观察到,为了在存储单元之间共用电源线,奇数单元相对电源线水平轴成镜像排布
这个例子中,在上面的例子中,每一列位线、PMOS 上拉管和 NMOS 下拉管的组合其实就是一个用字线作为输入的伪 NMOS NOR 门。
注意,下拉器件必须强于上拉器件才能保证有合适的低电平。
预充电逻辑消除了对静态功耗以及有比逻辑的要求,同时保持了单元复杂度不变。
MOS NAND ROM:构成一列的所有晶体管都串联,下拉链中的所有晶体管都必须全部导通才能产生一个低电平值。
重点:字线必须以负逻辑模式工作以实现这一存储功能。除了被选中行的字线置 0 以外,所有的字线在默认时是高电平,因此未被选中行的晶体管都导通。
现在假设在我们感兴趣的行与列之间的交叉处不存在任何晶体管。由于串联链上的所有其他晶体管均被选上,所以输出被下拉,因此该处存储的值等于 0。反之,如果交叉处存在一个晶体管,当相关的字线被置于低电平时这个晶体管不导通,这会导致输出高电平,相当于读取 1。
优点:基本单元不需要连接到电源/地,有利于缩小尺寸
ROM的存储内容可以使用点图形式表示,点表示 1
只需要使用一层掩膜(接触孔掩膜),就可以对存储器阵列进行编程。因此,ROM 的编程可以推迟到工艺流程中较后的步骤完成。
上图中,接触孔存在时就代表一个 0 单元,否则代表一个 1 单元
NOR ROM的等效瞬态模型
字线模拟成分布RC线(采用方块电阻相对较高的多晶硅实现)
位线模拟成集总电容(忽略电阻)
字线寄生参数
每个单元的电阻:35 Ω
每个单元的连线电容:0.65 fF
每个单元的栅电容:5.10 fF
位线寄生参数
每个单元的电阻:0.15 Ω
每个单元的连线电容:0.83 fF
每个单元的漏电容:2.60 fF
NOR ROM 的传输延迟
字线延迟 (Word line delay):包含 M 个单元的分布式 RC 线的延迟
0.38 (35 欧姆 x (0.65 + 5.1) fF) 512*512,当
位线延迟 (Bit line delay):假设采用最小尺寸的下拉器件和 3 倍最小尺寸的上拉器件,且位线摆幅降低 (1.25V)
字线延时起主要作用
如何降低字线的传播延时?
从两端驱动字线。信号最远传播距离变短,延迟下降
使用金属旁路。每隔
使用硅化物
Programmable ROM 可编程ROM
在阵列中的每个位置都放置晶体管。
通过烧断熔丝,使不需要的晶体管失效。
Electrically Programmable ROM 电可编程ROM
使用浮栅来关闭不需要的晶体管。
包括 EPROM、EEPROM 和 Flash。
浮栅晶体管是当前大多数可重新编程存储器的核心器件。
这一结构与通常的 MOS 器件类似,但多了一个额外的多晶硅条插在栅和沟道之间。这一多晶硅条不与任何东西连接,因而称为浮栅。插入这一额外栅最明显的影响是使栅氧层的厚度
但比较重要的是,该器件具有一个有趣的特性,即它的阈值电压是可编程的。
在源和栅、源和漏之间加上一个高电压可以产生一个高电场并引起电子雪崩注入。电子得到足够的能量变“热”并穿过第一层氧化物绝缘体而在浮栅上被捕获。这一现象在栅氧层厚度为 100 nm 时就会发生,所以器件的制造相对比较容易。就编程机制而言,浮栅晶体管又常被称为浮栅雪崩注入 MOS (floating-gate avalanche-injection MOS, FAMOS)
在浮栅上被捕获的电子有效地降低了这个栅上的电压,如图 12.19(a)所示。这个过程是自约束的——浮栅上积累的负电荷降低了在氧化层中的电场,所以最终它变得不再能加速热电子。移去电压后已引起的负电荷仍留在原来的位置上,从而使中间浮栅产生一个负电压,如图 12.19(b)所示。从器件的角度看,这相当于有效地增加了阈值电压。
为使器件导通,必须有一个更高的电压来克服所引起的这一负电荷的影响,如图 12.19(c)所示。一般由此得到的阈值电压在 7 V 左右,因而 5 V 的栅-源电压不足以使晶体管导通,于是该器件等同于无效。
注入浮栅上的电荷有效地平移了晶体管的
由于浮栅为 SiO₂ 所包围,而 SiO₂ 是一个极好的绝缘体,所以被捕获的电荷可以在浮栅上存放许多年,即使在电源电压被移去之后也是如此,这就是非易失性存储的机理。
大多数 Flash EEPROM 器件采用雪崩热电子注入的方法来编程器件。擦除则和 EEPROM 单元一样,采用 Fowler-Nordheim 隧穿来完成。
例如,图 12.23 是 Intel 推出的 ETOX Flash 单元。这只是现有各种 Flash 单元中的一个。它与 FAMOS 门类似,但采用了一个非常薄的隧道栅氧化层(10 nm)。用栅氧的不同区域来进行编程和擦除。在栅和漏端加上高电压(12 V)并使源接地时进行编程,而擦除则发生在栅接地而源处于 12 V 时。
NVM:Nonvolatile Memory 两种非易失性存储单元的剖面图
非易失性存储器的特性对比
Flash 是一种 EEPROM,即电可擦除可编程只读存储器。
它是非易失性存储器,也就是断电后数据不会丢失。
Flash 由东芝的 Fujio Masuoka(舛冈富士雄) 在 20 世纪 80 年代早期发明。
它最早在 1984 年的 国际电子器件会议 IEDM 上被介绍。
PPT 45页的单元如何与NOR ROM 结构合一
编程过程从擦除操作(a)开始:在栅上加上 0 V 电压,源端加上一个高电压(12 V)。浮栅上的电子将通过隧穿注射到源端。于是所有的单元被同时擦除。单元初始阈值电压的不同以及氧化层厚度的不同都会引起擦除操作结束时阈值电压的不同。
这一点可以从两方面来弥补:(1)在应用擦除脉冲之前,将阵列中的所有单元都编程,以使所有的阈值都从大致相同的值开始。(2)在此之后加上一个可控制宽度的擦除脉冲。接着读整个阵列以检查这些单元是否已被擦除。如果尚未全部擦除,则再应用另一个擦除脉冲,接着又是一个读周期。如此进行下去,直至所有单元的阈值电压都低于所要求的电平。一般擦除时间在 100 ms 到 1 s 之间。
对于写(编程)操作(b):把一个高电压脉冲加在所选器件的栅上。如果这时在漏端加上“1”,就会产生热电子并将其注入浮栅上,使阈值电压上升(相当于使其变为一个总是关断的器件)。如果不加“1”,则浮栅仍保持在原来没有电子的状态,即相当于 “0” 状态。为使阈值电压按所需从 3 V 变化至 3.5 V,一般必须加上范围在 1 ~ 10 μs 的脉冲。
读操作(c)过程与所有的 NOR ROM 结构一样。为选择一个单元,将字线上升至 5 V,使位线有条件地放电。
NOR 结构使随机读取时间很快。与此同时,由于需要精确地控制阈值电压,它的擦除和编程时间却很慢。这些特性使这类 Flash 存储器(闪存)比较适合于存放程序代码这类的应用。
其他一些应用如视频或音频类存储器等并不需要快速的随机存取,但却需要有较大的存储密度(降低存储器成本)、快速的擦除、编程以及快速的串行存取。对这些要求采用前面描述的 NAND ROM 结构更为适宜。
NAND Flash
写入和擦除速度更快。
存储密度更高。
每 bit 成本更低。
NOR Flash
随机访问读出时间短。
存储密度较低。
每 bit 成本较高。
NOR Flash
适合替代 程序 ROM。具有完整的地址总线和数据总线。
支持随机访问。
顺序访问较慢。
NAND Flash
适合替代磁盘驱动器。
只允许页访问。
顺序访问速度更快。
存储密度更高,因此每 bit 成本更低。
高密度、低每 bit 成本。
每次编程一页。
每次擦除一个块。
Flash 存储器的问题:Flash 错误
编程扰动,也叫写扰动。
读扰动。
数据保持问题。
耐久性问题。
由于环境因素导致的数据丢失,也就是软错误。
例如宇宙射线、α 粒子。
坏块。
初始坏块:由于生产良率不完美产生。
不需要每片存储器都是完美的。
SLC 最多允许约 2% 坏块。
MLC 最多允许约 5% 坏块。
累积坏块:由多次写入 / 擦除循环导致。因此需要坏块管理:
将坏块映射出来。
避免继续使用坏块。
耐久性
编程 / 擦除循环会导致电荷被困在介质中。
这会引起存储单元特性的永久偏移,无法通过擦除恢复。
因此会限制编程 / 擦除循环次数。
典型寿命:
SLC:最高约 100,000 次循环。
MLC:低于 10,000 次循环,有些 MLC 只有约 1.5K 次循环。
磨损均衡不是反复擦写同一个块,而是把擦写次数分散到多个块上。
由 Flash 控制器完成。
对 SLC 器件来说是一个优点,因为 SLC 块通常最多支持 100,000 次编程/擦除循环。
对 MLC 器件来说则是必须的,因为 MLC 块通常支持的循环次数少于 10,000 次。
如果一个块每分钟被擦除并重新编程一次,那么 10,000 次循环限制只需要 7 天就会被超过。
错误纠正码 Error Correction Code
ECC:给定 k bit 数据,添加 p bit 校验位,形成一个 n bit 的码字。如Hamming码。
错误综合数
MLC 更容易受到扰动影响,因此需要更强、更复杂的 ECC。
ECC 会增加 Flash 控制器的复杂度,因为控制器需要实现 ECC 解码器。
ECC 的一个例子是 Reed-Solomon 码,也称为 BCH 码。
对于超过 4 个电平的 MLC,可能需要使用 LDPC,即低密度奇偶校验码。
当一页数据被写入 Flash 时,数据会经过 Flash 控制器中的 ECC 引擎,从而生成一个唯一的 ECC 签名。
数据和 ECC 签名会一起存储在 Flash 中。
当读取一页数据时,对应存储的 ECC 签名也会一起被读出。控制器还会根据读出的数据重新生成一个新的 ECC 签名。
新生成的 ECC 签名会与原来存储的签名进行比较。
如果二者匹配,说明没有发生错误,数据直接发送给主机。
如果不匹配,则数据和存储的 ECC 签名会被送到控制器的 ECC 引擎中进行错误纠正,纠正后的结果再返回给主机。
使用 ROM 构建逻辑
可以把 ROM 用作包含真值表的查找表
如果有 n 个输入、k 个输出,则需要:
改变逻辑功能很容易,只需要重新编程 ROM
用 ROM 来构成有限状态机
如果有n 个输入,k 个输出,s bit 状态,可以使用:
每个 DRAM 芯片的容量过去每年增长约 60%,每 bit 成本每年下降约 27%。
最近,这一趋势有所放缓,大约变为每三年容量翻一倍。
串行访问存储器不使用地址
移位寄存器
抽头延迟线
串行输入、并行输出,SIPO
并行输入、串行输出,PISO
队列,FIFO、LIFO
移位寄存器用于存储和延迟数据。
简单设计:一个由32个触发器构成的 4 级 8位移位寄存器,由寄存器级联组成。
注意在寄存器之间没有任何逻辑,需要特别关注保持时间约束是否满足!
由于触发器的面积相当大,所以大容量、高密度的移位寄存器都采用双口 RAM 来代替。此时 RAM 被配置成一个循环缓冲器,并用一对计数器说明读出和写入数据的位置。
复位时,读计数器初始化指向第一项,而写计数器指向最后一项,每个周期地址递增。
此外,
抽头延时线是移位寄存器的一种改型,它能提供不同级数(可编程级数)的延时。图 12.64 显示了一个能用于视频处理系统的 64 级抽头延时线。各个延时模块分别由 32 级、16 级、8 级、4 级、2 级和 1 级的移位寄存器构成。多路开关通过Delay信号控制来决定是否绕过一些延时模块以提供合适的总延时。
如:可以实现 0 到 63 级延迟。
串行输入、并行输出,SIPO
1 bit 移位寄存器逐位读入串行数据。
经过 N 步之后,输出 N bit 并行数据。
并行输入、串行输出,PISO
当 shift = 0 时,并行加载所有 N bit 数据。
然后每个周期移出 1 bit。
队列(queue)允许数据以不同的速率读出和写入。图 12.66 显示了一个队列接口。读和写操作都由它们自己的但相互间可能不同步的时钟控制。
当队列中没有剩余位置可以写入数据时,它就使 FULL(满)标志信号有效;而当队列中没有数据可读出时,它就使 EMPTY(空)标志信号有效。由于其他系统存在延时,所以某些队列还提供 ALMOST-FULL(几乎满)和 ALMOST-EMPTY(几乎空)标志信号来通知即将到来的状态并阻止写或读请求。
队列在内部还保存读和写指针以指明下一步应访问哪个数据。和移位寄存器一样,指针可以是计数器或 1-of-
复位时,将读指针和写指针初始化到第一个元素。此时队列为空,EMPTY。
写入时,写指针递增。
如果写指针快要追上读指针,队列为满,FULL。
读取时,读指针递增。
也称为栈,stack。
读和写使用同一个栈指针,stack pointer。
CAM (Content Addressable Memory)是普通存储器的扩展,例如 SRAM 的扩展。
CAM 的行为就像一个普通的 SRAM,它在给定地址(adr)和数据(data)时可以读出或写入,但它同时执行匹配(matching)操作。
对于 CAM 中含有给定关键字(key)的每一个字,匹配操作都将使匹配线(matchline)的输出有效。
右图:CAM 最常用来作为微处理器中支持虚拟存储器的翻译后援缓冲器(Translation Lookaside Buffer, TLB)。虚拟地址作为关键字提供给 TLB CAM。如果这一地址在 CAM 中,那么相应的匹配线就有效。这条匹配线可以作为字线去访问含相关物理地址的 RAM,如图 12.68 所示。一个处理所有匹配线的或非门产生 CAM 的不命中(miss)信号。注意,图中没有画出更新 TLB 的读(read)、写(write)和地址(adr)线。
CAM 的读写操作与普通 SRAM 类似。
匹配操作过程
保持 wordline 为低电平。
预充 matchline,匹配线。
将 key 放到 bitline 上。
matchline 进行求值,判断是否匹配。
Miss line
miss 线由所有 match line 通过伪 nMOS NOR 结构组合得到。
如果没有任何 word 匹配,miss 线变为高电平。