专家详解:内存工作原理及发展历程 http://memory.zol.com.cn/47/474952.html
cpu先要从RAM中获取数据,需要首先给地址总线传递数据的定位地址,在若干个时钟周期之后,数据总线就会把数据传送给CPU.当地址解码器收到地址总线送来的地址数据后,它就会根据这个地址数据找到相对应的存储单元,然后数据总线会将其中的数据传递给CPU.
上图中如果CPU每次调用需要64bits的数据(数据总线为64bits),那么CPU会在一个时间中存取8个字节的数据,但是因为每次还是存取一个1个字节的数据,所以64bits总线在这种使用中将不带来任何优势.
将RAM制作成一条线,或者是当作一个数组,在实际制造芯片的时候,尤其是大容量RAM(目前貌似有64GB的内存)的时候,这是在设计上无法实现的.因此我们可以将其排成阵列.在存储1024bits的时候(寻址单位为字节),那么我们需要32*32的矩阵就可以实现.一个32*32的二维矩阵比1024bits的一维更紧凑.
在二维的数据存储中,对于x86处理器,想要读取的数据地址(一个22位二进制数字的地址编码,11位行地址,11位列地址,寻址范围为4M,2的22次)在传递给地址总线后,通过RAM地址接口进行分离(信号分离器).行地址译码器首先确定行地址,列地址译码器会确认列地址,这样可以确定唯一的数据位置,然后将其通过RAM数据接口传递到数据总线.实际上,RAM的内部存储数据并不是正方形的(行比列少,便于刷新).
SRAM: 4-6晶体管实现,速度快,数据保存稳定,不会存在泄漏,但是成本昂贵,一般使用在CPU二级缓冲中.
DRAM: 1个电容器+一个晶体管,但是因为存在泄漏,因此在64ms的周期内刷新充电,同时读取数据是需要放电的,因此需要在某一刻充电.充放电带来了延迟,同时放电电流太小需要信号放大器处理.
一个16K x 1bit SRAM芯片的针脚功能示意图:
早期SRAM芯片采用了20线双列直插封装技术.拥有这么多的针脚,是因为:每一个地址信号都需要一根信号线,一根数据输入线和一个数据输出线,部分控制线,电源线.
A0-A13是地址输入信号引脚,CS是芯片选择引脚。在一个实际的系统中,一定具有很多片SRAM芯片,所以需要选择究竟从那一片SRAM芯片中写入或者读取数据.WE是写入启用引脚.当SRAM得到一个地址之后,它需要知道进行什么操作,究竟是写入还是读取,WE就是告诉SRAM要写入数据.Vcc是供电引脚.Din是数据输入引脚.Dout是数据输出引脚.GND是接地引脚
Enable(OE):有的SRAM芯片中也有这个引脚,但是上面的图中并没有.这个引脚同WE引脚的功能是相对的,它是让SRAM知道要进行读取操作而不是写入操作.从Dout引脚读取1bit数据需要以下的步骤:
SRAM读取操作:
1)通过地址总线把要读取的bit的地址传送到相应的读取地址引脚(这个时候/WE引脚应该没有激活,所以SRAM知道它不应该执行写入操作).
2)激活/CS选择该SRAM芯片.
3)激活/OE引脚让SRAM知道是读取操作.第三步之后,要读取的数据就会从Dout引脚传输到数据总线.
SRAM写入操作:
1)通过地址总线确定要写入信息的位置(确定/OE引脚没有被激活).
2)通过数据总线将要写入的数据传输到Din引脚.
3)激活/CS引脚选择SRAM芯片.
4)激活/WE引脚通知SRAM知道要尽心写入操作.
经过上面的四个步骤之后,需要写入的数据就已经放在了需要写入的地方.
DRAM因为存在数据刷新的过程,所以设计更加复杂.下面是DRAM芯片针脚的作用.
下图是Intel的2188芯片 采用16K*1 DRAM 16线DIP封装. 16K*1 指的是这款芯片可以存储16*1024的字节数,可同时进行1字节的读取或者写入操作.
虽然该芯片只有7根地址引脚,但是通过采用多路技术,通过DRAM接口把地址一分为二,然后利用两个连续的时钟传输地址数据,利用一半的针脚实现全部地址位的传输.
为什么需要减少地址引脚呢?因为DRAM相比SRAM,因为成本低,体积小,因此使用在内存中,内存容量大,因此需要的地址线也比较多,需要在芯片中增加相对应的针脚数,但是芯片的针脚是十分宝贵的资源,这样做无疑会提高芯片的生产成本,所以需要采用多路复用技术.
采用多路复用技术使得读写过程变得更加复杂.
在上面的示意图中,你可以看到在DRAM结构中相对于SRAM多了两个部分:由/RAS (Row AddressStrobe:行地址脉冲选通器)引脚控制的行地址门闩线路(Row Address Latch)和由/CAS(Column Address Strobe:列地址脉冲选通器)引脚控制的列地址门闩线路(Column Address Latch)。
DRAM读取过程:
1)通过地址总线将行地址传输到地址引脚。
2)/RAS引脚被激活,这样行地址被传送到行地址门闩线路中。
3)行地址解码器根据接收到的数据选择相应的行。
4)/WE引脚被确定不被激活,所以DRAM知道它不会进行写入操作。
5)列地址通过地址总线传输到地址引脚。
6)/CAS引脚被激活,这样列地址被传送到列地址门闩线路中。
7)/CAS引脚同样还具有/OE引脚的功能,所以这个时候Dout引脚知道需要向外输出数据。
8)/RAS和/CAS失活,这样就可以进行下一个周期的数据操作了。其实DRAM的写入的过程和读取过程是基本一样的,所以如果你真的理解了上面的过程就能知道写入过程了,所以这里我就不赘述了。(只要把第4步改为/WE引脚被激活就可以了)。
DRAM被设计为有规律的读取DRAM内的内容.优点如下:
1.仅仅使用/RSA激活每一行就可以达到全部刷新的目的.
2.DRAM控制器来控制刷新,这样可以防止刷新操作干扰有规律的读写操作.因此DRAM芯片的行数量是比列数量多的.
RAM单元只能存储一个bit的数据,但是CPU存取和地址寻址的时候是根据一个寻址单元(8比特)来操作的,RAM如何实现CPU读写和寻址单元的实现呢?
最简单的是我们需要8个1位的RAM基本存储单元的芯片以并列的方式堆叠在一起,这8个芯片采用相同的地址.下图只给出了4个.
通常这8颗1bit芯片是通过地址总线和数据总线在PCB(印刷电路板)上连接而成的,对于CPU来说它就是一颗8bit的RAM芯片,而不再是独立的8个1 bit芯片。在上图所示的地址总线位宽是22bit,这样这个地址总线所能控制的存储模块的容量应该是2的22次=4194304bit,也就是4Mb * 8(4MB)的容量;数据总线的位宽是8bit,就是通过刚才提到的8个1bit的基本存储单元的Dout并联在一起实现的--这样也能够满足CPU的要求了。(对于这种存储颗粒我们称之为4194304 x 8模块或者4Mx8,注意这里的“M”不是“MByte”而是“Mbit”)。为了举例说明,我们用一条TI(德仪公司)出品的TM4100GAD8 SIMM内存为例来说明,因为这种内存的构造相对比较简单,便于大家理解。TM4100GAD8基于4M x 8模块制造,容量4MB,采用30线SIMM封装。如果前面我说的东西你看明白了,就应该知道这条内存采用了4Mx1 DRAM颗粒。下面的数据是我在TI官方网站上找到的(目前很少有公司的网站还提供自己以前产品的数据):构造:4194304 × 8。工作电压:5-V。30线SIMM(Single In-Line Memory Module:SIMM)。采用8片4Mbit DRAM内存颗粒,塑料SOJs封装。长刷新期16 ms(1024周期)。
在上面的示意图中,A0–A10是地址输入引脚。/CAS:行地址脉冲选通器引脚。DQ1–DQ8:数据输入/数据输出引脚。NC:空信号引脚。/RAS:列地址脉冲选通器引脚。VSS:接地引脚。/W:写入启用引脚。VCC 5V供电引脚。
上面的电路示意图应该能够让我们更加清楚的理解这个问题,TM4100GAD8由8片4096x1bit芯片组成,VCC和VSS为所有的芯片提供5v的电压。每个芯片都具有/RAS、/CAS、/W引脚同内存相应的引脚连通。每个芯片都具有不同的数据输出/输出接口。这样我们应该就能够知道RAM是如何满足CPU存取数据的需要的了。
上面实现8bit的读取,但是在32bit和64bit的读取中,这种方法是不够的,我们需要扩展.这里引入bank的概念.
这里将4M*8当作一个bank,4个bank以类似并联的方式相连,组成位宽为32bit的bank,64bit的则需要8个bank,存储数据时候,第一个bank存储第一个字节,第二个bank存储第二个字节,以此类似.每个bank容量为4M字节.
通过两种方式增加这类内存的容量,第一种增加每个bank的容量,第二个是增加bank的数量.
上面的内存用于486级别的电脑,奔腾系列的内存与486不同的.
SIMM(single in-line memory module,单边接触内存模组)
因为内存颗粒无法直接和计算机连接并且通讯的,同时因为数据位传输位宽等方面的原因,所以内存厂商通过封装的方式把他们组织到一起.
下图中是30线DIMM和72线DIMM.
在DIMM内存中的颗粒采用DIP封装(双列直插封装.PCBA的流程中有DIP).SIMM内存根据引脚分为30线和72线.
SIMM中一般容量为1,4,16MB的SIMM内存是单面.当容量的SIMM是双面的.
一条72线SIMM内存的数据总线位宽是32bit,所以它的数据传输能力大大提高了.
DIMM是目前的内存主要封装模式.比如SDRAM,DDR SDRAM, RDRAM,其中SDRAM具有168根引脚并且提供了64bit的数据寻址能力.现在高密度的DRAM可以有不只一个Din和Dout引脚,并且可以根据需有在DRAM芯片上制造4,8,16或64根数据引脚.
上图上面的内存就是168线的SDRAM,而下面的内存是72线的SIMM。
如果一个DRAM芯片具有8个数据引脚,那么当我们想实现一个4MB的内存,我们以前的方法是4M*1的8个芯片并连.但是现在就可以通过1M*8的4个芯片实现.减少了芯片的个数.4M的寻址空间需要11根地址线引脚复用地址数据.
理解FPM DRAM和EDO DRAM对后面的延迟的理解有很好的帮助
FPM DRAM是优先于动态随机存取存储器(DRAM)的新形式,快速页面模式的动态随机存取存储器(Fast Page Mode DRAM,FPM DRAM)是一种动态随机存取存储器。是一种在486时期被普遍应用的内存。有30线和72线、5V电压、带宽32bit、基本速度60ns以上。
页面模式动态随机存取存储器可以直接访问RAM的某一行而不必频繁的重新指定这一行。当列地址控制器(CAS)信号变为要读取一系列邻近的记忆单元时,行地址控制器(RAS)信号仍然保持有效。这样减少了访问时间并且降低了电能需求。FPM DRAM的典型时序是6-3-3-3.
之所以称之为快页内存,因为它以4字节突发模式传送数据,这4个字节来自同一列或者说同一页。如何理解这种读取方式呢?FPM DRAM如果要突发4个字节的数据,它依然需要依次的读取每一个字节的数据,比如它要读取第一个字节的数据,这个时候的情况同前面介绍的DRAM读取方式是一样的(我们依然通过读取下面的FPM读取时序图来了解它的工作方式):
1、首先行地址被传送到行地址引脚,在/RAS引脚被激活之前,RAS处于预充电状态,CAS也处于预充电状态,当然/WE此时依然是高电平,FPM至少知道自己不会进行写操作。
2、/RAS引脚被赋予低电平而被激活,行地址被送到行地址选通器,然后选择正确的行送到传感放大器,就在/RAS引脚被激活的同时,tRAC开始计时。
3、CAS一直处于预充电状态,直到列地址被传送到列地址引脚并且/CAS引脚得到一个低电平而被激活(tCRC时间开始计时),然后下面的事情我们也应该很清楚了,列地址被送到列地址选通器,然后需要读取的数据位置被锁定,这个时候Dout引脚被激活,第一组数据就被传送到数据总线上。
4、对于原来介绍的DRAM,这个时候一个读取周期就结束了,不过对于FPM则不同,在传送第一组数据期间,CAS失活(RAS依然保持着激活状态)并且进入预充电状态,等待第二组列地址被传送到列地址引脚,然后进行第二组数据的传输,如此周而复始直至4组数据全部找到并且传输完毕。
5、当第四组数据开始传送的时候,RAS和CAS相继失活进入到预充电状态,这样FPM的一个完整的读取周期方告结束。FPM之所以能够实现这样的传输模式,就是因为所需要读取的4个字节的行地址是相同的但是列地址不同,所以它们不必为了得到一个相同的列地址而去做重复的工作。
6、这样的工作模式显然相对于普通的DRAM模式节省了很多的时间,特别是节省了3次RAS预充电的时间和3个tRAC时间,从而进一步提高的效率。
从第4步不同,不同在于不用重复的激活RSA,故后面的只需要3个时钟.6-3-3-3其中的6表示从最初状态读取第一组数据需要6个时钟周期,而读取另外三个数据仅仅需要3个时钟周期就能达到目的了。需要特别指出的是,在上面的时序图中,我们并没有标注出 FPM DRAM进行第二个、第三个、第四个数据输出的前进行新的列地址选通的时间,但是从上面的示意图中我们可以看到Col.2同Data1和D2之间都没有重叠,所以这三个数据的输出是进行完毕一个再进行的另一个,因此再上一次数据传输完毕到下一次列地址传输之间还有一点小小的延迟。
1、RAS在结束上一次的读取操作之后,进入预充电状态,当接到读取数据的请求之后,行地址首先通过地址总线传输到地址引脚,在这个期间CAS依然处于预充电状态。
2、/RAS引脚被激活,列地址开始经过行地址选通电路和行地址解码器进行行地址的选择,就在这个同时tRAC周期开始,因为是读取操作/WE引脚一直没有被激活,所以内存知道自己进行的是读取操作而不是写操作。
3、在CAS依然进行预充电的过程中,列地址被送到列地址选通电路选择出来合适的地址,当/CAS被激活的同时tCAC周期开始,当tCAC结束的时候,需要读取的数据将会通过数据引脚传输到数据总线。
4、从开始输出第一组数据的时候,我们就可以体会到EDO同FPM之间的区别了:在tCAC周期结束之前,CAS失活并且开始了预充电,第二组列地址传输和选通也随即开始,第一数据还没有输出完毕之前,下一组数据的tCAC周期就开始了--显然这样进一步的节省了时间。就在第二组数据输出前,CAS再次失活为第三组数据传输列地址做起了准备……
5、如此的设计使得EDO内存的性能比起FPM的性能提高了大约20-40%。
6、正是因为EDO的速度比FPM快,所以它可以运行在更高的总线频率上。所以很多的EDO RAM可以运行在66MHz的频率上,并且一般标注为5-2-2-2。
SDRAM则可以实现在单个的DIMM中存在多个bank,在满足数据总线的前提下进一步的提高数据总线的性能.
前面讨论的DRAM读取方式中,当一个读取周期结束后,/RAS和/CAS都必须停止激活然后有一个短暂的预充电期才能进入到下一次的读取周期中。但是一个具有两个bank的SDRAM的模组中,其中一个bank在进行预充电的期间另一个bank却可以被调用--这样当你需要读取已经预充电的bank的数据时,就无需等待而是可以直接调用了。为了实现这个功能,SDRAM就需要增加对于多个bank的管理,这样就可以实现控制其中的bank进行预充电,并且在需要使用的时候随时调用了。这样一个具有两个bank的SDRAM一般会多一根叫做BA0的引脚,实现在两个bank之间的选择--一般的BA0是低电平表示Bank0被选择,而BA0是高电平Bank1就会被选中。
可见,虽然SDRAM在基本的原理上比如基本存储的结构都是基本一样的,但是在整个内存架构的组织上是不同的,而且在存储单元的控制上也是有着相当大的区别的。因为异步DRAM同处理器和芯片的时钟并没有什么关系,所以芯片组只能按照DRAM内存的时序要求“被动”的操作DRAM控制引脚。SDRAM因为要同CPU和芯片组共享时钟,所以芯片组可以主动的在每个时钟的上升沿发给引脚控制命令。
异步DRAM的读取过程:
异步DRAM的运行并不需要同处理器同频,它的时序信号控制、寻址等操作基本上说是独立控制的,也就是由内存芯片本身所控制.
1) 行地址通过地址总线传输到地址引脚。
2)/RAS引脚被激活,列地址就会被放入行地址选通电路( Row Address Latch:在文章的前面部分我们把它翻译为行地址门闩电路)。
3) 行地址解码器( Row Address Decoder)选择正确的行然后送到传感放大器( sense amps)。4) /WE引脚此时不被激活,所以 DRAM知道它们不是进行写操作。
5) 列地址通过地址总线传输到地址引脚。
6) /CAS引脚被激活,列地址就可以被送到列地址选通器( Column Address Latch)。
7) /CAS引脚也被当作输出启动信号( Output Enable),因为一旦/CAS信号被放到传感放大器,就因为这时需要的数据已经找到,所以Dout针脚开始有效,数据可以从内存中传输到系统了。
8)/RAS和 /CAS引脚停止激活,等待下一个读取命令
内存读取的过程中,我们需要考虑两种类型的延迟.
1.两次读操作之间的延迟.因为DRAM的读取操作包括电容器的充电和放电另外还包括把信号传送出去的时间,所以在两个读取操作中间至少留出足够的时间让让内存进行这些方面的操作。同时两次读之间的延迟包括RAS和 /CAS预充电延迟时间。在/RAS被激活并且失活之后,你必须给它足够的时间为下次激活做好准备.当一次读取操作周期结束之后,我们必须让/RAS和/CAS引脚都失活。实际上,在你让它们失活之后,必须等待预充电过程结束之后才能开始下一个操作(或者还是读取操作、或者是写入操作、或者是刷新操作),如下图.
2.内部的延迟包括从/RAS被激活后到数据总线出现数据,/CAS被激活到数据总线出现数据,即tRAC(行存取时间)和tCAC(列存取时间),如下图(1).
图(1) tRAC与tCAC
图(2) DRAM读写时序图
上面这张图(2)详细的介绍了DRAM读写数据的详细流程.
1) 首先看上图第一行,在预充电期间行地址通过地址总线传输到地址引脚,这个期间RAS未被激活,在第三行Address BUS中我们看到数据在这个期间正在行地址总线上,这个期间CAS也处于预充电状态;
2) 依然看上图第一行, /RAS引脚被激活(RAS Active,灰色的部分),行地址就会被放入行地址选通电路(第三行Address Bus中所示),这个期间CAS依然处于预充电状态;在/RAS被激活的同时,tRAC(行存取时间)开始--如上图最后一行Data Bus所示。
3) 在/RAS被激活以后,行地址解码器( Row Address Decoder)选择正确的行然后送到传感放大器( sense amps)。
4) 在这个期间/WE引脚一直处于不激活的状态,所以 DRAM知道它们不是进行写操作--这个状态将一直持续到开始执行写操作才结束。
5) 列地址通过地址总线传输到地址引脚。
6) /CAS引脚被激活(如上图第三行),列地址就可以被送到列地址选通器( Column Address Latch)。这个时候tCAC(列地址访问时间)开始计时。
7) 在/CAS处于激活状态期间的末尾,/RAS停止激活--也就大约在这个时间附近找到的数据被传送到数据总线进行数据传送(如图data Bus),在数据总线进行数据传输的过程中,地址总线是处于空闲状态的,它并不接受新的数据--在数据开始创送的同时tRAC和tCAC都结束了。
8)就在数据在数据总线上传输期间,/CAS引脚也被停止激活--就是得到一个高电平,从而开始进入到预充电期。RAS和CAS会同时处于预充电期,直到下次/RAS被激活进入到下一个读取操作的周期
SIMM和DIMM中的潜伏期(latency)类型为两种: 访问时间(access time)和周期时间(cycle time).
潜伏期的时间是很短的,只有几纳秒.
访问时间: 即tRAC和tCAC
周期时间: 两次读取周期之间,即/RAS失活到预充电结束,/CAS失活到预充电结束的时间.
对于异步DRAM,访问时间就是从(行地址到达行地址引脚时起)到(数据被传输到数据引脚的时间段).访问时间为60纳秒的DIMM意味着当我们下达读取数据的命令后,地址数据被送到地址引脚之后要等待60纳米才能达到数据输出引脚。
周期时间为:在第一次读完以后,到下一次操作开始之前的这段时间间隔.
我们平时说的DRAM内存多少纳米指的是访问时间.访问时间越短,意味这内存工作频率越高.内存频率越高,意味这可以适应外频更高的处理器.