一、引子
在上一个小节,我们了解了存储芯片的基本原理,学习了如何存储二进制的0和1,如何根据一个地址来访问存储字。
这一小节,会介绍两种特定的存储芯片SRAM
和DRAM
。
之前,我们知道了RAM
--随机访问存储器:当我们指定某个存储单元的地址,这个存储单元的读取速度并不会因为存储单元的物理位置而改变。
接下来,将逐步介绍下面的内容:
二、存储元件
1.DRAM芯片
上一小节介绍的芯片,其实就是DRAM芯片。见下图:
(详情请戳:3.2主存储器的基本组成)
DRAM芯片可以用于制作主存,上图右侧的内存条上就是DRAM芯片。
==DRAM芯片和SRAM芯片的核心区别就是:存储元件不一样。==
<1> DRAM芯片是用栅极电容(电容的充放电)来存储和读取信息。
<2> SRAM芯片是用双稳态触发器来存储信息的。
:point_right: 接下来,看一下这两种存储元件的区别。
(1)栅极电容
看一下下面这个存储元:
上一节说过,如果给这个字选择线(存储元件的左侧)加一个5V的电压(假设5V为阈值),就会使MOS管接通。如下图:
如果此时数据线上也加了一个5V的高电平(也就是给了一个二进制的1),那么这个5V的高电平电压会加到电容上方的金属板上,而下方的金属板由于接地,所以下方金属板电压为0。如下图:
1)存储
当电容的两块金属板产生压差的时候,就会导致正电荷在上面的金属板聚集,负电荷在下面的金属板聚集。如下图:
这样就完成了二进制1的存储。
如果从数据线输入了一个低电平信号(0),由于电容的两块金属板之间没有电压差,此时电容不会存储电荷。
这样就完成了二进制0的存储。
如下:
2)读出
接下来看一下读出1和读出0如何实现。
<1> 如果此时电容里面存的是1,就是此时电容里面存储了电荷。
当字选择线接了高电平(比如5V)后,MOS管接通,这些电荷就会顺着图中蓝线从绿线(数据线)输出。
如果是二进制的1,那么数据线一端可以检测到电流信号。如下:
<2> 如果此时电容里面存储的是0,就是此时电容里面没有存储电荷。
当字选择线接了高电平(比如5V)后,MOS管接通,数据线一端也不会检测到电流的流出。如下:
所以,用上述的方式就可以检测读出的是1还是0。
DRAM存储元用栅极电容来存储二进制0和1。
(2)物理特性
<1> 栅极电容里面,如果存储的是二进制的1,那么电容上面会存储一些电荷,接通MOS管读出数据的时候,电容里面存储的电荷就会被释放了(电容放电)。
那么电容放电之后,没有电荷了,数据就会由1变为了0。
所以,读出栅极电容里面存储的信息之后,栅极电容里面存储的信息就会被改动,被破坏。就是所谓的破坏性读出。里面的信息会被损坏(1->0)。
为了解决这个问题,需要进行重写
操作,又叫再生
,就是给电容重新进行一次充电。
<2> 接下来解释一下刷新的概念。
对于栅极电容。虽然电容里面会存放电荷,但是电荷会慢慢流失,那么同样也会使电容里面的数据出现误差(1->0)。通常电容里的电荷只能维持2ms的时间,即使不断电,2ms后信息也会消失。
由于电容里面的电荷只能存在2ms,那么在2ms之内必须刷新一次(给电容充电)。
(3)DRAM刷新
那么DRAM如何进行刷新操作呢?
先来看一下几个问题。
<1> 多久需要刷新一次?
刷新周期:一般为2ms。
由于电容只能保持2ms的电荷,所以必须在2ms之内刷新一次电荷。
<2> 每次刷新多少存储单元?
以行为单位,每次刷新一行存储单元。
每个存储单元会由多个存储元构成,所以每次刷新存储单元的次数应该以行
为单位,每次刷新一行。
<3> 什么叫一行存储单元?
上一小节,我们给出的存储器模型中,给出n位地址后,译码器会将n位地址转换成其中某一条选通线的高电平信号。
如果总共有n
位地址,那么译码器的输出端会有2^n
根选通线。
所以,按照之前的方案,如果有20位地址,那么选通线的数量就是2^20=1M
。
也就是说,译码器的输出端需要接1M根选通线,大概有一百万。在译码器端接一百万根线,显然工程量很大。
为了解决这个问题,可以把存储单元从一维排列转换为二维排列,也就是将它们变为由存储单元构成的矩阵。如下图:
==n位地址会被拆成行地址和列地址,分别送给行地址译码器和列地址译码器。==
这样的话,每个译码器只需要处理n/2
位地址信息。
原本译码器需要处理20位地址信息,对应2^20=1M
根选通线。那么现在将20位地址信息分别拆分,一半行地址,一半列地址,那么每个译码器的选通线就是2^10=1K
根选通线,1024根选通线在工程上很容易实现。
随着存储容量的增大,现在的存储器甚至还会有三维排列,原理类似。
所以用行列地址的目的就是减少选通线的数量,使电路变得更简单和清晰。
:question: 如何根据地址来选中某一个存储单元?
将上面的二维图示进行简单连线之后,得到下图:
如果此时要访问的地址是0000 0000。
①左边的译码器
译码器的输入端输入00000000,那么它的第0根选通线会被选通(选中0号存储单元)。
②右边的译码器
地址会被分为前半部分(0000)和后半部分(0000),前半部分作为行地址,送给行地址译码器;后半部分作为列地址,送给列地址译码器。
那么,行地址译码器的第0根选通线会被选通(右图蓝线),列地址译码器的第0根选通线也会被选通(右图红线)。
一个存储单元,只有行和列都被选通才能进行读和写。
<4>如何刷新
上面我们已经知道了什么叫一行存储单元。
只要我们给出一个行地址,那么行地址译码器就会选中一整行存储单元。
每一次刷新操作就会刷新一整行!
会有一个专门的刷新电路支持,刷新电路会直接读出一整行存储单元的信息,然后重新写入(重新给电容充电)。
由于刷新一整行本质上就是做了一次读操作,所以它的耗时与我们读写周期的耗时差不多。
所以,==进行一次刷新操作需要占用1个读/写周期,每次可以刷新一整行的存储单元。==
<5> 什么时候刷新
假设DRAM内部结构排列成128*128(128行、128列)的形式,读/写周期(存取周期)0.5us。
电容可以支持的最长时间是2ms,2ms对应4000个读写周期。
1ms=1000us
2ms=2000us
2000/0.5=4000
有128行需要刷新,每次刷新需要0.5us时间。可以有如下几种策略。
①第一种
这种方式,2ms时间内,会有2000次刷新操作。(2ms/1us=2000)
这两千次刷新操作,足够在2ms内给128行的存储单元每一行都刷新很多次。
②第二种
2ms可以分为4000个读写周期(2ms/0.5us=4000),前面3872个周期读写,后面128个周期分别刷新128行。
③第三种
将每一行的刷新分散到不同的时间段。
在实际应用中,可以利用CPU不需要访问存储器的这段时间进行刷新。比如CPU取得指令,并对它译码的阶段。
DRAM刷新是由存储器独立完成的,不需要CPU控制。
(4)DRAM地址线复用
上面我们已经知道了什么叫行地址,什么叫列地址。
行地址和列地址的信息会同时丢给行列译码器,即同时送出行列地址。
地址有多少位,就需要涉及多少根的地址线。
DRAM的存储容量会比较大,有可能需要32维地址,也就是需要32根地址线。
为了让地址线对应的电路变得更加简单,DRAM一般会采用地址线复用技术。
本来需要有n位地址线来传送行和列地址,但是采用地址线复用技术之后,可以把行地址和列地址通过前后两次分别进行传输。
也就是说,只需要2/n
条地址线就可以。第一次将行地址送入行地址缓冲器,第二次将列地址送入列地址缓冲器里面。
然后在控制器的控制下,行地址和列地址再送给译码器进行译码处理。
原本需要n位引脚来接收n位地址,现在只需要n/2个引脚就可以,先接收行地址,再接收列地址。也就是分两次送行列地址。
如果要考察DRAM芯片引脚个数的话,那么就要考虑DRAM芯片的地址线采用了复用技术,也就是和地址对应的引脚数目应该 减半。
2.SRAM芯片
(1)双稳态触发器
SRAM芯片的存储元就是如下的双稳态触发器:
触发器相关的知识在数字电路那门课学习的,这里只做简单的了解。
这个双稳态触发器总共有6个MOS管,图中用M1、M2、M3、M4、M5、M6表示。
这个触发器的存储元可以呈现出两种稳定的状态:
<1> A点高电平,B点低电平--->对应二进制的1
<2> A点低电平,B点高电平--->对应二进制的0
1)存储
写入数据很简单,比如现在想要写入0。
那么只需要给左边的绿线(BL)加上一个低电平信号,右边的绿线(BLX)加上一个高电平信号,这样就可以使得触发器A是低电平,B是高电平。
这个状态对应的就是二进制的0。如下:
写入二进制的1也是类似。
2)读出
双稳态触发器需要有两根数据线来读出0和1。
如果此时双稳态触发器里面存的是二进制的1,当我们给自选择线接通之后(给了一个高电平电压)。右边的绿线(BLX)就会输出一个低电平信号。
如果存储的是二进制的0,会由左边的线(BL)输出低电平信号,而右边的线不会输出任何电信号。
那么,可以根据左右两条数据线哪一条输出了低电平信号,来判断触发器里面原本存的是二进制的0还是1。
(2)物理特性
<1> 双稳定触发器有两种稳定的状态,当我们读出数据之后,触发器的状态还是非常稳定的。
所以它的读操作是非破坏性读出,不需要进行重写操作。
<2> 对于双稳态触发器,只要给触发器(VDD)不断供电,只要不断电,触发器的状态就不会被改变。保存的0或1是不会消失的。所以双稳态触发器不需要刷新操作。
3.对比
将栅极电容和双稳态触发器对比一下,会有不同的地方。
<1> 栅极电容的数据线(绿色线)只有一根;双稳态触发器的数据线有两根。
<2> 栅极电容放电信息会被破坏,就是破坏性读出,读出后应有重写(再生)操作;双稳态触发器读出数据,触发器状态保持稳定,是非破坏性读出,无需重写。
<3> 栅极电容读写速度更慢;双稳态触发器读写速度更快。
<4> 栅极电容只需要一个电容和一个MOS管即可,所以它的每个存储元 制造成本更低,集成度更高,功耗低(电路简单);双稳态触发器需要六个MOS管,所以它的每个存储元制造成本更高,集成度更低,功耗大(电路复杂)。
如果一块芯片面积固定不变,栅极电容的数量会比双稳态触发器分布更多更密集,就是集成度更高。
两者都是易失性存储器(断电后消失),不要和破坏性读出弄混淆!
SRAM集成度低,存储容量更小,对应的行列地址位数也会更小。所以对于SRAM这种容量小的芯片,通常会把行列地址同时送过去。
DRAM芯片其实已经过时了,目前主存储器主要使用SDRAM芯片。(比如DDR3、DDR4)