SIMM和DIMM
前面我们既然提到了30线的DIMM,那么我们就来介绍一下SIMM以及与之相对应的DIMM。其实SIMM和DIMM都是内存条的封装形式的一种(这里说的不是芯片的封装形式),因为每片内存颗粒无法直接同计算机进行连接并且通讯的,并且它们单颗颗粒的容量有限而且涉及到前面提及的数据传输位宽等方面的原因,所以内存厂商需要通过一定的形式把它们组织到一起,这样就产生了不同的内存封装形式。
首先我们来介绍一下SIMM,如下图(上面一条是30线DIMM内存,下面一条是72线DIMM内存):
?/P>
在DIMM内存中的颗粒采用了DIP(Dual Inline Package:双列直插封装)封装,如上图中黑色的芯片。早期的内存颗粒是直接焊接在主板上面的,这样如果一片内存出现故障,那么整个主板都要报废了。后来在主板上出现了内存颗粒插槽,这样就可以更换内存颗粒了,但是热膨胀的缘故,每使用一段时间你就需要打开机箱把内存颗粒按回插槽。
除了这些原因,更重要的是我们前面提到的数据总线位宽等方面的原因使得工程师着手设计了SIMM(Single Inline Memory Module)封装和DIMM(Double Inline Memory
Module)的内存,它们通过主板上的内存插槽同主板进行通讯。这样的设计解决了原来所有的问题。SIMM内存根据引脚分为30线和72线,目前我们都很少用到了。
?/P>
SIMM Diagram:
SIMM根据内存颗粒分布可以分为单面内存和双面内存,一般的容量为1、4、16MB的SIMM内存都是单面的,更大的容量的SIMM内存是双面的。在我们本文中所列举的TM4100GAD8就是一款30线的内存,它每次仅能传输8bit的数据--从前面的示意图中我们也知道这30线引脚中有11线是地址引线,8线是数据引线,还有其它的控制引线,对于当时的封装工艺这已经是比较不错了。比较细心的读者会问为什么还有三条空信号引脚?因为这种内存的数据输出总线位宽只有8bit,所以即使将空信号引脚转换为地址总线提高寻址范围,但是并没有足够多的引脚用于数据的输出。72线的SIMM内存的容量不但可以更大,而且数据总线的位宽也得到了极大的提高。一条72线SIMM内存的数据总线位宽是32bit,它的数据输出能力大大提高了。
?/P>
DIMM是目前我们使用的内存的主要封装形式,比如SDRAM、DDR SDRAM、RDRAM,其中SDRAM具有168线引脚并且提供了64bit数据寻址能力。DIMM的工作电压一般是3.3v或者5v,并且分为unbuffered和buffered两种。上图上面的内存就是168线的SDRAM,而下面的内存是72线的SIMM。需要指出的是在SIMM和DIMM内存之间不仅仅是引脚数目的不同,另外在电气特性、封装特点上都有明显的差别,特别是它们的芯片之间的差别相当的大。因为按照原来内存制造方法,制造这种内存的时候是不需要把64个芯片组装在一起构成一个64bit的模块的,得益于今年来生产工艺的提高和改进,现在的高密度DRAM芯片可以具有不止一个Din和Dout信号引脚,并且可以根据不同的需要在DRAM芯片上制造4、8、16、32或者64条数据引脚。
如果一个DRAM芯片具有8个数据引脚,那么这个基本储存单元一次就可以输出8bit的数据,而不像是在原来的TM4100GAD8 SIMM芯片中每次仅仅能输出1bit数据了。这样的话,如果我们需要制造一个同TM4100GAD8一样容量的内存,那么我们可以不使用前面所使用的4M x 1bit芯片,而是采用1M x
8bit芯片,这样仅仅需要4片芯片就可以得到一个容量为4MB,位宽为32bit的模组。芯片数目减少最直接的好处当然是可以减少功耗了,当然也简化了生产过程。
下面的图只是为了说明这个问题而制作的,它展示的是一种72线的4MB SIMM内存,采用了4片1Mx8bit DRAM芯片。但是至于是不是真的有这样的一款产品我也不能确定,因为目前为之我找不到实际的产品相关资料,所以这个只是为了帮助大家理解这个问题,不要对于是否有这样的产品而斤斤计较。
?/P>
这样一来,只要4片采用具有8bit位宽的内存颗粒就可以达到同样的容量,当然这样的内存条工作原理在理解的过程中比原来略微复杂一点。我们看到在上面的4Mbit×8bit芯片中,依然还是有10条地址总线引脚,但是/CAS和/RAS引脚却从原来的1条增加到4条。当然数据输入输出引脚线数目是32条。
其实TI公司的TM124BBJ32F和TM248CBJ32F前面的我所列举的例子是比较相似的:
?/P>
这两款内存的容量均为4MB,位宽为32bit,当然也属于DRAM了。TM124BBJ32F内存为单面而TM248CBJ32F双面的两种模式,不过其中单面TM124BBJ32F有些奇怪,在它的内存条上只有两颗内存芯片,这样每颗内存芯片应该是2MBx16bit。另外,双面的TM248CBJ32F由4片1Mx8bit
DRAM芯片组成。
?/P>
上面的示意图和表格是TM124BBJ32F和TM248CBJ32F的示意图和表格,我们可以很容易的理解它们的工作模式。
对于TM124BBJ32F来说:因为是2MBx16bit的颗粒,所以当RAS0引脚为低电平时,DQ0-DQ15输出/输入引脚有效,所以它可以同时传送一个16bit数据;让RAS1引脚为低电平时,DQ16-DQ31输出/输入引脚有效,也可以一次传送一个16bit数据。
对于TM248CBJ32F来说:因为是1MBx8bit的颗粒,所以情况同前面是不同的,当RAS0引脚为低电平时,DQ0-DQ7输出/输入引脚有效,所以它可以同时传送一个8bit数据;让RAS1引脚为低电平时,DQ6-DQ15输出/输入引脚有效,也可以一次传送一个8bit数据;让RAS2引脚为低电平时,DQ16-DQ23输出/输入引脚有效,也可以一次传送一个8bit数据;让RAS3引脚为低电平时,DQ24-DQ31输出/输入引脚有效,也可以一次传送一个8bit数据(注意这里虽然都是控制输出8bit或者16bit地址,但是它们之间分别代表的含义是不同的)。当然在确定地址的时候,还是需要CAS控制电路配合的。
FPM DRAM介绍
FPM DRAM(Fast Page Mode DRAM):
FPM DRAM也就是我们常说的快页内存。之所以称之为快页内存,因为它以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时间,从而进一步提高的效率。
?/P>
我想你一定看到过诸如6-3-3-3这样的内存标注方法,其中的6表示从最初状态读取第一组数据需要6个时钟周期,而读取另外三个数据仅仅需要3个时钟周期就能达到目的了。需要特别指出的是,在上面的时序图中,我们并没有标注出 FPM DRAM进行第二个、第三个、第四个数据输出的前进行新的列地址选通的时间,但是从上面的示意图中我们可以看到Col.2同Data1和D2之间都没有重叠,所以这三个数据的输出是进行完毕一个再进行的另一个,因此再上一次数据传输完毕到下一次列地址传输之间还有一点小小的延迟。
?/P>
EDO DRAM介绍
EDO DRAM( Extended Data Out DRAM:扩展数据输出DRAM):
在介绍FPM的读取过程的最后我着重提到了 FPM DRAM是在上一次的数据读取完毕才会进行下一个数据的读取,但是对于EDO DRAM却是完全不一样的。EDO DRAM可以在输出数据的同时进行下一个列地址选通,我们依然结合下面的EDO读取时序图来了解EDO DRAM读取数据的过程:
?/P>
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介绍
主要谈论我们大家都能接触到的SDRAM内存了,首先得承认SDRAM同我们之前介绍的异步DRAM是差别非常大的。它的基本原理同前面提到的DRAM还是基本一样的(比如基本存储单元都是按照阵列排列,都有RAS和CAS的概念),不过这些存储单元的组织和控制同DRAM就具有相当大的差别了。在前面我们讨论其它类型的内存都是采用了以具体的产品为例来讲述的,所以这里我们依然采用这种形式,这次我们以
MICRON MT48LC4M4A1 16MB SDRAM为例。
如果你还记得我们在前面介绍的DRAM相关内容,那么应该还记得DRAM是以bank来组织存储单元的。因为每个内存bank的位宽是同数据总线阿位宽一样的。所以对于SIMM,你必须把多个SIMM放在一个bank之中来满足32bit或者64bit数据总线的要求。DIMM具有更多阿引脚,所以单个DIMM可以提供足够的同数据总线相适应的位宽--这样每个bank只要一个DIMM就可以了。而且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和芯片组共享时钟,所以芯片组可以主动的在每个时钟的上升沿发给引脚控制命令。
?/P>
上图显示的就是MT48LC4M4A1 16MB SDRAM内存颗粒的引脚示意图,它采用了50引脚的TSOP封装,符合PC100规范。这种内存颗粒将同系统时钟同步运行。这种内存颗粒的架构1Mx16-512Kx16x2,每bank行地址数目是11,列地址数目是8。我们首先来介绍一下这种内存颗粒的引脚定义:A0-A10:地址输入引脚,当ACTIVE命令和READ/WRITE命令时,来决定使用某个bank内的某个基本存储单元。CLK:时钟信号输入引脚
CKE:Clock Enable,高电平时有效。当这个引脚处于低电平期间,提供给所有bank预充电和刷新的操作
/CS:芯片选择(Chip Select),SDRAM DIMM一般都是多存储芯片架构,这个引脚就是用于选择进行存取操作的芯片。/RAS:行地址选择(Row Address Select)。/CAS:列地址选择(Column Address Select)
/WE:写入信号(Write Enable)。DQ0-DQ15:数据输入输出接口。BA:Bank地址输入信号引脚,BA信号决定了由激活哪一个bank、进行读写或者预充电操作;BA也用于定义Mode寄存器中的相关数据。NC:空引脚。DQM: 这个引脚的主要用于屏蔽输入/输出,功能相当于/OE引脚( Output Enable)。VDDQ:DQ供电引脚,可以提高抗干扰强度。VSSQ:DQ供电接地引脚。VSS:内存芯片供电接地引脚。VDD:内存芯片供电引脚,提供+3.3V ±0.3V(上面的列表项目和示意图中,前面标有“/”或者“#”标记的表示在低电平下有效)。
下面的表格在不同的状态下(或者说不同命令下)的各个引脚的信号。“H”代表高电平,“L”代表低电平,“X”代表可以是任何状态,也就是该引脚同该命令并没有直接的关系。功能/CS /RAS /CAS /WE DQM ADDR。COMMAND INHIBIT (NOP) H X X X X X 。NO OPERATION (NOP) L H H H X X。ACTIVE (选择bank并且激活相应的行) L L H H X Bank/Row 。READ (选择bank和列地址,并且开始突发读取) L H L H X Bank/Col 。WRITE (选择 bank和列地址,并且开始突发写入) L H L L X Bank/Col。BURST TERMINATE(停止当前的突发状态) L H H L X X 。PRECHARGE (让相应的bank中的行失活或者让该bank失活) L L H L X Code 。AUTO REFRESH(进入自动刷新模式) L L L H X X 。LOAD MODE REGISTER L L L L X Op-code。写入启用/输出启用 L。写入禁止/输出禁止 H。
?/P>
如果你对于我们前面介绍的内容有了真的有所了解了,看到上面的芯片引脚示意图和各个针脚的功能示意图就基本对于SDRAM的工作工程有了一个基本的了解了,在下面的章节里我们就对于这个过程进行详细的介绍,首先我们对于一些基本的概念做一些了解。
这条SDRAM颗粒采用了双bank(每bank 512K x 16 DRAM)的工作电压是3.3V,并且采用同步接口方式(所有的信号都是时钟信号的上升沿触发)。每一个512K x 16-bitbank由2,048行乘以256列个基本存储单元构成,输出数据位宽是16 bit。Read和write操作都是通过突发导向模式访问SDRAM的;这种访问模式以访问指定的区域开始的,然后按照预先设定的方式定位其它的数据的所在。每次访问都是以ACTIVE命令启动的,然后仅仅跟着一个READ或者WRITE命令。不过在进行所有这些操作之前,SDRAM必须首先进行初始化。初始化SDRAM在上电之后,必须首先按照预定的方式进行初始化才能正常的运行。一旦VDD和VDDQ被同时供电并且时钟稳定下来,SDRAM就需要一个100微秒的延迟,在这个时间段中COMMAND INHIBIT和NOP指令有效,这个过程实际上就是内存的自检过程,一旦这个过程通过之后一个PRECHARGE命令就会紧紧随着最后一个COMMAND INHIBIT或者NOP指令而生效,这个期间所有的内存都处于空闲(idle)状态,随后会执行两个AUTOREFRESH周期、当AUTOREFRESH周期完毕之后,SDRAM为进行Mode Register编程做好了准备。因为Mode Register上电会引起一个为止的状态,它会在进行所有正常指令之前被载入。至此,初始化过程完成。