返回列表 发帖

深入了解内存

深入了解内存

深入了解内存

清水反应 Ars technicaAceshardwaresimpletech 独家编译



原文链接:Ace's Guide to Memory Technology
原文作者:Johan De Gelas(johan@aceshardware.com)

collected by stonefeng


DRAMSRAM基础知识
RAM模块基础
DRAM读取过程
快页模式内存
SDRAM读取过程分析
SDRAM写入过程
Aceshardware所写的关于SDRAM基本工作原理的文章



































DRAMSRAM基础知识


RAMRandom Access Memory)随机存取存储器对于系统性能的影响是每个PC用户都非常清楚的,所以很多朋友趁着现在的内存价格很低纷纷扩容了内存,希望借此来得到更高的性能。不过现在市场是多种内存类型并存的,SDRAMDDR SDRAMRDRAM等等,如果你使用的还是非常古老的系统,可能还需要EDO DRAMFP DRAM(块页)等现在不是很常见的内存。
对于很多用户或者有一定经验的高级用户来说,他可能能说出Athlon XPPentium 4的主要不同点,能知道GeForce3Radeon之间的区别,但是如果真的让他说出各种内存之间的实现机理的主要差别或者解释CAS 2CAS 3之间的主要差别的话,就可能不是非常的清楚了。毕竟CPU和显卡之类的东西更容易引起我们的兴趣。我个人在这方面的知识也是比较片面甚至是一知半解的,所以一直在收集这个方面的资料。在网上有很多很好的资源,其中Ars technicaAceshardwaresimpletech等网站的资料对于我系统的了解这个方面的知识有很大的帮助。本文主要以Ars technica的文章为基础编写而成,为大家比较详细的介绍RAM方面的知识。
虽然RAM的类型非常的多,但是这些内存在实现的机理方面还是具有很多相同的地方,所以本文的将会分为几个部分进行介绍,第一部分主要介绍SRAM和异步DRAMasynchronous DRAM),在以后的章节中会对于实现机理更加复杂的FPEDOSDRAM进行介绍,当然还会包括RDRAMSGRAM等等。对于其中同你的观点相悖的地方,欢迎大家一起进行技术方面的探讨。

存储原理
为了便于不同层次的读者都能基本的理解本文,所以我先来介绍一下很多用户都知道的东西。RAM主要的作用就是存储代码和数据供CPU在需要的时候调用。但是这些数据并不是像用袋子盛米那么简单,更像是图书馆中用有格子的书架存放书籍一样,不但要放进去还要能够在需要的时候准确的调用出来,虽然都是书但是每本书是不同的。对于RAM等存储器来说也是一样的,虽然存储的都是代表01的代码,但是不同的组合就是不同的数据。
让我们重新回到书和书架上来,如果有一个书架上有10行和10列格子(每行和每列都有0-9的编号),有100本书要存放在里面,那么我们使用一个行的编号+一个列的编号就能确定某一本书的位置。如果已知这本书的编号87,那么我们首先锁定第8行,然后找到第7列就能准确的找到这本书了。在RAM存储器中也是利用了相似的原理。
现在让我们回到RAM存储器上,对于RAM存储器而言数据总线是用来传入数据或者传出数据的。因为存储器中的存储空间是如果前面提到的存放图书的书架一样通过一定的规则定义的,所以我们可以通过这个规则来把数据存放到存储器上相应的位置,而进行这种定位的工作就要依靠地址总线来实现了。对于CPU来说,RAM就象是一条长长的有很多空格的细线,每个空格都有一个唯一的地址与之相对应。如果CPU想要从RAM中调用数据,它首先需要给地址总线发送地址数据定位要存取的数据,然后等待若干个时钟周期之后,数据总线就会把数据传输给CPU。下面的示意图可以帮助你很好的理解这个过程。 上图中的小园点代表RAM中的存储空间,每一个都有一个唯一的地址线同它相连。当地址解码器接收到地址总线送来的地址数据之后,它会根据这个数据定位CPU想要调用的数据所在的位置,然后数据总线就会把其中的数据传送到CPU
上面所列举的例子中CPU在一行数据中每次知识存取一个字节的数据,但是在现实世界中是不同的,通常CPU每次需要调用32bit或者是64bit的数据(这是根据不同计算机系统的数据总线的位宽所决定的)。如果数据总线是64bit的话,CPU就会在一个时间中存取8个字节的数据,因为每次还是存取1个字节的数据,64bit总线将不会显示出来任何的优势,women工作的效率将会降低很多。

从“线”到“矩阵”
如果RAM对于CPU来说仅仅是一条“线”的话,还不能体现实际的运行情况。因为如果实际情况真的是这样的话,在实际制造芯片的时候,会有很多实际的困难,特别是在需要设计大容量的RAM的时候。所以,一种更好的能够降低成本的方法是让存储信息的“空格”排列为很多行--每个“空格”对应一个bit存储的位置。这样,如果要存储1024bits的数据,那么你只要使用32x32的矩阵就能够达到这个目的了。很明显,一个32x32的矩阵比一个1024bit的行设备更紧凑,实现起来也更加容易。请看下图1
  
1

2
知道了RAM的基本结构是什么样子的,我们就下面谈谈当存储字节的过程是怎样的:
上面的示意图1显示的也仅仅是最简单状态下的情况,也就是当内存条上仅仅只有一个RAM芯片的情况。对于X86处理器,它通过地址总线发出一个具有22位二进制数字的地址编码--其中11位是行地址,另外11位是列地址,这是通过RAM地址接口进行分离的。行地址解码器(row decoder)将会首先确定行地址,然后列地址解码器(column decoder)将会确定列地址,这样就能确定唯一的存储数据的位置,然后该数据就会通过RAM数据接口将数据传到数据总线。另外,需要注意的是,RAM内部存储信息的矩阵并不是一个正方形的,也就是行和列的数目不是相同的--行的数目比列的数目少(后面我们在讨论DRAM的过程中会讲到为什么会这样)
上面的示意图2粗略的概括了一个基本的SRAM芯片是如何工作的。SRAM是“static RAM(静态随机存储器)”的简称,之所以这样命名是因为当数据被存入其中后不会消失(同DRAM动态随机存储器是不同,DRAM必须在一定的时间内不停的刷新才能保持其中存储的数据)。一个SRAM单元通常由4-6只晶体管组成,当这个SRAM单元被赋予0或者1的状态之后,它会保持这个状态直到下次被赋予新的状态或者断电之后才会更改或者消失。SRAM的速度相对比较快,而且比较省电,但是存储1bit的信息需要4-6只晶体管制造成本太高了(DRAM只要1只晶体管就可以实现)。

RAM芯片
前面的介绍都相对比较简单、抽象。下面我们会结合实际的RAM芯片进行介绍。在谈到这个问题的时候,我们会涉及到一个比较重要的技术:封装。你应该听说过诸如30线SIMMS72线SIMMS168线DIMMS或者RIMMs其中的一个或者几个术语吧。如果要解释这些术语之间的不同,就应该了解RAM的封装技术。

SRAM芯片
早期的SRAM芯片采用了20线双列直插(DIPDual Inline Package)封装技术,它们之所以具有这么多的针脚,是因为它们必须:
  • 每个地址信号都需要一根信号线
  • 一根数据输入线和一根数据输出线
  • 部分控制线(Write Enable, Chip Select)
  • 地线和电源线

上图显示的是SRAM芯片,但是并不是下面示意图中的SRAM芯片


下面的是一个16K x 1-bit SRAM芯片的针脚功能示意图: .


  • A0-A13是地址输入信号引脚
  • CS是芯片选择引脚
    在一个实际的系统中,一定具有很多片SRAM芯片,所以需要选择究竟从那一片SRAM芯片中写入或者读取数据
  • WE是写入启用引脚(如上表,在CSWE上面的线我没有写入,表示低电平有效或者是逻辑0时有效):当SRAM得到一个地址之后,它需要知道进行什么操作,究竟是写入还是读取,WE就是告诉SRAM要写入数据
  • Vcc是供电引脚
  • Din是数据输入引脚
  • Dout是数据输出引脚
  • GND是接地引脚
  • Output EnableOE):有的SRAM芯片中也有这个引脚,但是上面的图中并没有。这个引脚同WE引脚的功能是相对的,它是让SRAM知道要进行读取操作而不是写入操作。



Dout引脚读取1bit数据需要以下的步骤:

SRAM读取操作1)通过地址总线把要读取的bit的地址传送到相应的读取地址引脚(这个时候/WE引脚应该没有激活,所以SRAM知道它不应该执行写入操作)
2)激活/CS选择该SRAM芯片
3)激活/OE引脚让SRAM知道是读取操作
第三步之后,要读取的数据就会从DOut引脚传输到数据总线。怎么过程非常的简单吧?同样,写入1bit数据的过程也是非常的简单的。
SRAM写入操作1)通过地址总线确定要写入信息的位置(确定/OE引脚没有被激活)
2)通过数据总线将要写入的数据传输到Dout引脚
3)激活/CS引脚选择SRAM芯片
4)激活/WE引脚通知SRAM知道要尽心写入操作
经过上面的四个步骤之后,需要写入的数据就已经放在了需要写入的地方。




DRAM芯片
现在我们知道了在一个简单的SRAM芯片中进行读写操作的步骤了了,然后我们来了解一下普通的DRAM芯片的工作情况。DRAM相对于SRAM来说更加复杂,因为在DRAM存储数据的过程中需要对于存储的信息不停的刷新,这也是它们之间最大的不同。下面让我们看看DRAM芯片的针脚的作用。
最早、最简单也是最重要的一款DRAM芯片是Intel1979年发布的2188,这款芯片是16Kx1 DRAM 18线DIP封装。“16K x 1”的部分意思告诉我们这款芯片可以存储16384bit数据,在同一个时期可以同时进行1bit的读取或者写入操作。(很抱歉找不到这款芯片的实物图片,只好自己简单的画了一个示意图)


上面的示意图可以看出,DRAMSRAM之间有着明显的不同。首先你会看到地址引脚从14根变为7根,那么这颗16K DRAM是如何完成同16K SRAM一样的工作的呢?答案很简单,DRAM通过DRAM接口把地址一分为二,然后利用两个连续的时钟周期传输地址数据。这样就达到了使用一半的针脚实现同SGRAM同样的功能的目的,这种技术被称为多路技术(multiplexing)。
那么为什么好减少地址引脚呢?这样做有什么好处呢?前面我们曾经介绍过,存储1bit的数据SRAM需要4-6个晶体管但是DRAM仅仅需要1个晶体管,那么这样同样容量的SRAM的体积比DRAM大至少4倍。这样就意味着你没有足够空间安放同样数量的引脚(因为针脚并没有因此减少4倍)。当然为了安装同样数量的针脚,也可以把芯片的体积加大,但是这样就提高芯片的生产成本和功耗,所以减少针脚数目也是必要的,对于现在的大容量DRAM芯片,多路寻址技术已经是必不可少的了。
当然多路寻址技术也使得读写的过程更加复杂了,这样在设计的时候不仅仅DRAM芯片更加复杂了,DRAM接口也要更加复杂,在我们介绍DRAM读写过程之前,请大家看一张DRAM芯片内部结构示意图:


在上面的示意图中,你可以看到在DRAM结构中相对于SRAM多了两个部分:由/RAS (Row Address Strobe:行地址脉冲选通器)引脚控制的行地址门闩线路(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刷新我们已经提到过,DRAMSRAM最大的不同就是不能比较长久的保持数据,这项特性使得这种存储介质对于我们几乎没有任何的作用。但是DRAM设计师利用刷新的技术使得DRAM称为了现在对于我们最有用处的存储介质。这里我仅仅简要的提及一下DRAM的刷新技术,因为在后面介绍FPEDO等类型的内存的时候,你会发现它们具体的实现过程都是不同的。
DRAM内仅仅能保持其内存储的电荷非常短暂的时间,所以它需要在其内的电荷消失之前就进行刷新直到下次写入数据或者计算机断电才停止。每次读写操作都能刷新DRAM内的电荷,所以DRAM就被设计为有规律的读取DRAM内的内容。这样做有下面几个好处。第一,仅仅使用/RAS激活每一行就可以达到全部刷新的目的;第二,DRAM控制器来控制刷新,这样可以防止刷新操作干扰有规律的读写操作。在文章的开始,我曾经说过一般行的数目比列的数据少。现在我可以告诉为什么会这样了,因为行越少用户刷新的时间就会越少。






































RAM模块基础

在前面的一节文章中我们对于DRAMSRAM的基本工作原理做了一些简单的介绍,在我们所列举的例子中都是介绍了最基本的存储单元的工作模式,所以应该不难理解,看到很多朋友对于这个方面的东西很感兴趣,今天我就继续介绍关于RAMRandom Access Memory)的部分知识。理解这个部分知识,是更好的了解以后我们介绍各种RAM的实际工作情况的基础。
SRAM或者DRAM的每一个基本存储单位(也就是上一节中介绍用来存储1bit信息的存储单位)都只能存储0或者1这样的数据,而且在上一节中IDT6167Intel 2188芯片都仅仅只有Din(数据输入)和Dout(数据输出接口),而CPU存取数据的时候是按照字节(也就是8bit)来存储的,那么RAM究竟如何满足CPU的这样的要求呢?
首先为了能存储1字节(8 bit)的信息,就需要81bit RAM基本存储单元堆叠在一起,这也意味着这8颗芯片被赋予了同样的地址。下面的示意图可以帮助你比较形象的了解这一点(下图所示的图例中仅仅画了4个存储单元,大家当成8个来看就可以了)。

通常这81bit芯片是通过地址总线和数据总线在PCB(印刷电路板)上连接而成的,对于CPU来说它就是一颗8bitRAM芯片,而不再是独立的81 bit芯片。在上图所示的地址总线位宽是22bit,这样这个地址总线所能控制的存储模块的容量应该是222=4194304bit,也就是4MB的容量;数据总线的位宽是8bit,就是通过刚才提到的81bit的基本存储单元的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线SIMMSingle In-Line Memory ModuleSIMM
  • 采用84Mbit DRAM内存颗粒,塑料SOJs封装
  • 长刷新期16 ms(1024周期)

  • 在上面的示意图中,A0A10是地址输入引脚
  • /CAS:行地址脉冲选通器引脚
  • DQ1DQ8:数据输入/数据输出引脚
  • NC:空信号引脚
  • /RAS:列地址脉冲选通器引脚
  • VSS:接地引脚
  • /W:写入启用引脚
  • VCC 5V供电引脚














上面的电路示意图应该能够让我们更加清楚的理解这个问题,TM4100GAD884096x1bit芯片组成,VCCVSS为所有的芯片提供5v的电压。每个芯片都具有/RAS/CAS/W引脚同内存相应的引脚连通。每个芯片都具有不同的数据输出/输出接口。这样我们应该就能够知道RAM是如何满足CPU存取数据的需要的了。













关于Bank的问题
前面我们讲述的都是8bit的内存,现在这种东西我们基本上都接触不到了,更常用的是32bit64bit或者128bit。由于前面我们已经讲到了4Mx1bit模块实现bit输入输出的方法,所以我们很容易想到我们把足够多的芯片放在一个模块中就可以了。不过在实际应用中,仅仅这样做还是不行的,这里就需要引入bank的概念,bank是由多个模块组成的。请看下面的示意图:

上面的示意图显示的是由48bit模块组成的一个bank,如果构成模块的是4194304 x 1芯片,那么每个模块的架构应该是4194304x8(4MB),这样4个模块就能组成一个位宽为32bitbank,容量为16MB。当存储数据的时候,第一模块存储字节1,第二个模块存储字节2,第三个模块存储字节3,第四个模块存储字节4,第五个模块存储字节5……如此循环知道达到内存所能达到的最高容量。
文章读到这里,我们应该能知道,当我们的系统使用这种类型的内存时,可以通过两种方式来增加这种类型内存的容量。第一种就是通过增加每一个独立模块的容量来增加bank的容量,另外一个方法就是增加bank的数目。这样如果让这种类型的内存的容量提升到32MB,可以把每个模块的容量从4MB提升到8MB或者增加bank的数目。
前面我们用来举例的这种30线的SIMM一般是用在486级别的电脑上的,而现在的Pentium级别的电脑所使用的内存同这个是不同的。而截止到现在,我的这篇文章还没有涉及到我们目前所使用的内存,不过不要着急,相信充分的理解我现在所谈论的东西将有助于你理解以后的内容。不过这里可以先告诉大家的是Pentium级别的内存和486系统的内存之间的主要差异在于它们的RAM芯片。

SIMMDIMM
前面我们既然提到了30线的DIMM,那么我们就来介绍一下SIMM以及与之相对应的DIMM。其实SIMMDIMM都是内存条的封装形式的一种(这里说的不是芯片的封装形式),因为每片内存颗粒无法直接同计算机进行连接并且通讯的,并且它们单颗颗粒的容量有限而且涉及到前面提及的数据传输位宽等方面的原因,所以内存厂商需要通过一定的形式把它们组织到一起,这样就产生了不同的内存封装形式。
首先我们来介绍一下SIMM,如下图(上面一条是30线DIMM内存,下面一条是72线DIMM内存):

DIMM内存中的颗粒采用了DIPDual Inline Package:双列直插封装)封装,如上图中黑色的芯片。早期的内存颗粒是直接焊接在主板上面的,这样如果一片内存出现故障,那么整个主板都要报废了。后来在主板上出现了内存颗粒插槽,这样就可以更换内存颗粒了,但是热膨胀的缘故,每使用一段时间你就需要打开机箱把内存颗粒按回插槽。
除了这些原因,更重要的是我们前面提到的数据总线位宽等方面的原因使得工程师着手设计了SIMMSingle Inline Memory Module)封装和DIMMDouble Inline Memory Module)的内存,它们通过主板上的内存插槽同主板进行通讯。这样的设计解决了原来所有的问题。SIMM内存根据引脚分为30线和72线,目前我们都很少用到了。


SIMM Diagram
SIMM根据内存颗粒分布可以分为单面内存和双面内存,一般的容量为1416MBSIMM内存都是单面的,更大的容量的SIMM内存是双面的。在我们本文中所列举的TM4100GAD8就是一款30线的内存,它每次仅能传输8bit的数据--从前面的示意图中我们也知道这30线引脚中有11线是地址引线,8线是数据引线,还有其它的控制引线,对于当时的封装工艺这已经是比较不错了。比较细心的读者会问为什么还有三条空信号引脚?因为这种内存的数据输出总线位宽只有8bit,所以即使将空信号引脚转换为地址总线提高寻址范围,但是并没有足够多的引脚用于数据的输出。72线的SIMM内存的容量不但可以更大,而且数据总线的位宽也得到了极大的提高。一条72线SIMM内存的数据总线位宽是32bit,它的数据输出能力大大提高了。

DIMM是目前我们使用的内存的主要封装形式,比如SDRAMDDR SDRAMRDRAM,其中SDRAM具有168线引脚并且提供了64bit数据寻址能力。DIMM的工作电压一般是3.3v或者5v,并且分为unbufferedbuffered两种。上图上面的内存就是168线的SDRAM,而下面的内存是72线的SIMM。需要指出的是在SIMMDIMM内存之间不仅仅是引脚数目的不同,另外在电气特性、封装特点上都有明显的差别,特别是它们的芯片之间的差别相当的大。因为按照原来内存制造方法,制造这种内存的时候是不需要把64个芯片组装在一起构成一个64bit的模块的,得益于今年来生产工艺的提高和改进,现在的高密度DRAM芯片可以具有不止一个DinDout信号引脚,并且可以根据不同的需要在DRAM芯片上制造481632或者64条数据引脚。
如果一个DRAM芯片具有8个数据引脚,那么这个基本储存单元一次就可以输出8bit的数据,而不像是在原来的TM4100GAD8 SIMM芯片中每次仅仅能输出1bit数据了。这样的话,如果我们需要制造一个同TM4100GAD8一样容量的内存,那么我们可以不使用前面所使用的4M x 1bit芯片,而是采用1M x 8bit芯片,这样仅仅需要4片芯片就可以得到一个容量为4MB,位宽为32bit的模组。芯片数目减少最直接的好处当然是可以减少功耗了,当然也简化了生产过程。
下面的图只是为了说明这个问题而制作的,它展示的是一种72线的4MB SIMM内存,采用了41Mx8bit DRAM芯片。但是至于是不是真的有这样的一款产品我也不能确定,因为目前为之我找不到实际的产品相关资料,所以这个只是为了帮助大家理解这个问题,不要对于是否有这样的产品而斤斤计较。

这样一来,只要4片采用具有8bit位宽的内存颗粒就可以达到同样的容量,当然这样的内存条工作原理在理解的过程中比原来略微复杂一点。我们看到在上面的4Mbit×8bit芯片中,依然还是有10条地址总线引脚,但是/CAS/RAS引脚却从原来的1条增加到4条。当然数据输入输出引脚线数目是32条。其实TI公司的TM124BBJ32FTM248CBJ32F前面的我所列举的例子是比较相似的:

这两款内存的容量均为4MB,位宽为32bit,当然也属于DRAM了。TM124BBJ32F内存为单面而TM248CBJ32F双面的两种模式,不过其中单面TM124BBJ32F有些奇怪,在它的内存条上只有两颗内存芯片,这样每颗内存芯片应该是2MBx16bit。另外,双面的TM248CBJ32F41Mx8bit DRAM芯片组成。

上面的示意图和表格是TM124BBJ32FTM248CBJ32F的示意图和表格,我们可以很容易的理解它们的工作模式。
对于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控制电路配合的。
今天我们对于32bit的内存做了进一步的了解。这些东西虽然对于现在的用户似乎有些不太实际,但是对于进一步了解现在的内存还是有相当的帮助的。(未完待续……)












































DRAM读取过程


这个系列的文章已经写了两篇了,但是我们几乎还没有谈到我们都关心的一些问题,比如 CAS-2CAS-3之间的区别什么的。现在我们对于DRAM的基础知识已经有了一个基本的了解,下面的文章就是给大家介绍一些现代的内存技术。

DRAM读取过程
其实我们在以前的文章中已经讨论过DRAM的读写过程了,不过对于内存比较了解的朋友都会发现在前面的介绍中仅仅是对于内存的大致读取过程进行了简述,很多重要的细节都没有详细的讨论。所以我们在文章的这一节的内容中对于这个过程进行详细的讨论。下面就是异步内存的读取过程的步骤,因为异步DRAM的运行并不需要同处理器同频,它的时序信号控制、寻址等操作基本上说是独立控制的,也就是由内存芯片本身所控制,所以在讨论起来比较简单,我们仅仅需要考虑DRAM本身的情况就可以了(这个系列的文章也是本着循序渐进的原则让大家更好的理解内存的工作原理的):[BLOCKQUOTE]

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引脚停止激活,等待下一个读取命令[/BLOCKQUOTE]
在内存的读取过程中,需要我们考虑的有两个主要类型的延迟。第一类的是连续的DRAM读操作之间的延迟。内存不可能在进行完一个读取操作之后就立刻进行第两个读取操作,因为DRAM的读取操作包括电容器的充电和放电另外还包括把信号传送出去的时间,所以在两个读取操作中间至少留出足够的时间让让内存进行这些方面的操作。
在连续的两次读取操作之间,第一种类型的延迟包括 /RAS /CAS预充电延迟时间。在 /RAS被激活并且失活之后,你必须给它足够的时间为下次激活做好准备。下图可以帮助你更好了解这个过程。

CAS预充电的过程是一样的,你只要把上图种的“RAS”换成“CAS”就可以了。
从前面我们介绍的DRAM读取过程的8个步骤中,我们可以了解到 /RAS /CAS预充电过程是依次进行的,所以我们在一定的时间里只能进行有限次数的读取操作。特别是在第8个步骤中,当一次读取操作周期结束之后,我们必须让 /RAS/CAS引脚都失活。实际上,在你让它们失活之后,必须等待预充电过程结束之后才能开始下一个操作(或者还是读取操作、或者是写入操作、或者是刷新操作)。
当然在两次读取操作之间的预充电时间不是限制DRAM速度的唯一因素。第二种延迟类型是叫做内部读取延迟( inside-the-read)。这种延迟同同两次读取操作之间的延迟非常的相似,但是不是由停止 /RAS/CAS激活而产生的,而是由于要激活 /RAS/CAS而产生的。比如,行存取时间(tRAC)--它就是在你激活RAS和数据最终出现在数据总线之间的时间。同样的列存取时间 (tCAC)就是激活 /CAS引脚和数据最终出现在数据总线上之间的时间。下面的示意图可以帮助你更好的理解这两种类型的延迟:

上面的图仅仅是一个示意图,下面的时序图可以帮助你了解不同的延迟时间发生的顺序:

现在让我们花一点时间结合前面介绍的读取过程来研究一下上面的这张示意图:
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,在数据总线进行数据传输的过程中,地址总线是处于空闲状态的,它并不接受新的数据--在数据开始创送的同时tRACtCAC都结束了。
8)就在数据在数据总线上传输期间,/CAS引脚也被停止激活--就是得到一个高电平,从而开始进入到预充电期。RASCAS会同时处于预充电期,直到下次/RAS被激活进入到下一个读取操作的周期。
相信经过这样的说明大家应该了解DRAM的读取过程了。 在这个基础上我们就可以开始认识SIMM或者DIMM的潜伏期( latency)问题了。首先我们来继续澄清一下几个概念。
DRAM潜伏期类型分为两种:访问时间( access time)和周期时间(cycle time)。其中访问时间(access time)同前面我们谈论的第二种类型的延迟有关,也就是同读取周期中的延迟时间;而周期时间(cycle time)同我们前面谈论的第一种类型的延迟有关,也就是受到两个读取周期之间的延迟时间影响。当然潜伏期的时间很短,都是用纳秒来衡量的。
对于异步 DRAM芯片,访问时间就是从行地址到达行地址引脚的时间起截至到数据被传输到数据引脚的时间段。这样,访问时间为60纳秒的 DIMM意味着当我们下达读取数据的命令后,地址数据被送到地址引脚之后要等待60纳秒才能达到数据输出引脚。周期时间,从字面上理解就是从两个连续读取操作之间的时间间隔。如何尽可能的减小DRAM的周期时间和访问时间是我们这篇文章后半部分将要详细的讨论的问题。
我们平时说到DRAM内存是多少多少纳秒,这里指的一般是访问时间(我们也会对于为什么采取这样的标称方法进行解释)。我们都知道访问时间越短,意味着内存工作频率会越高。当然内存工作频率越高,意味着可以适应外频更高的处理器。如果处理器的时钟周期较短,而DRAM的潜伏期较长,处理器在很多时间里都是等到DRAM传送数据。因此当DRAM一定时,比如时潜伏期为70纳秒,那么一颗 1GHz PIII等待数据的时间将会比一颗 400MHz PII处理器长。当然出现这样的现象是每个用户都不愿意看到的,当的使用的内存速度越慢或者说你的处理器相对越快,你的处理器就会由更多的性能都被这样的等待浪费了。(未完待续……)










































快页模式内存

在《深入了解内存(三)——DRAM读取过程》一文中我们介绍了DRAM的详细的读取过程,在本文的这一节中我们将要开始了解FPM DRAM Fast Page Mode DRAM),也就是我们常说的快页内存。之所以称之为快页内存,因为它以4字节突发模式传送数据,这4个字节来自同一列或者说同一页。
如何理解这种读取方式呢?FPM DRAM如果要突发4个字节的数据,它依然需要依次的读取每一个字节的数据,比如它要读取第一个字节的数据,这个时候的情况同前面介绍的DRAM读取方式是一样的(我们依然通过读取下面的FPM读取时序图来了解它的工作方式):
  • 首先行地址被传送到行地址引脚,在/RAS引脚被激活之前,RAS处于预充电状态,CAS也处于预充电状态,当然/WE此时依然是高电平,FPM至少知道自己不会进行写操作。
  • /RAS引脚被赋予低电平而被激活,行地址被送到行地址选通器,然后选择正确的行送到传感放大器,就在/RAS引脚被激活的同时,tRAC开始计时
  • CAS一直处于预充电状态,直到列地址被传送到列地址引脚并且 /CAS引脚得到一个低电平而被激活(tCRC时间开始计时),然后下面的事情我们也应该很清楚了,列地址被送到列地址选通器,然后需要读取的数据位置被锁定,这个时候Dout引脚被激活,第一组数据就被传送到数据总线上
  • 对于原来介绍的DRAM,这个时候一个读取周期就结束了,不过对于FPM则不同,在传送第一组数据期间,CAS失活(RAS依然保持着激活状态)并且进入预充电状态,等待第二组列地址被传送到列地址引脚,然后进行第二组数据的传输,如此周而复始直至4组数据全部找到并且传输完毕
  • 当第四组数据开始传送的时候,RASCAS相继失活进入到预充电状态,这样FPM的一个完整的读取周期方告结束。FPM之所以能够实现这样的传输模式,就是因为所需要读取的4个字节的行地址是相同的但是列地址不同,所以它们不必为了得到一个相同的列地址而去做重复的工作。
  • 这样的工作模式显然相对于普通的DRAM模式节省了很多的时间,特别是节省了3RAS预充电的时间和3tRAC时间,从而进一步提高的效率。

我想你一定看到过诸如6333这样的内存标注方法,其中的6表示从最初状态读取第一组数据需要6个时钟周期,而读取另外三个数据仅仅需要3个时钟周期就能达到目的了。
需要特别指出的是,在上面的时序图中,我们并没有标注出 FPM DRAM进行第二个、第三个、第四个数据输出的前进行新的列地址选通的时间,但是从上面的示意图中我们可以看到Col.2Data1D2之间都没有重叠,所以这三个数据的输出是进行完毕一个再进行的另一个,因此再上一次数据传输完毕到下一次列地址传输之间还有一点小小的延迟。请看下图:


EDO DRAM Extended Data Out DRAM:扩展数据输出DRAM在介绍FPM的读取过程的最后我着重提到了 FPM DRAM是在上一次的数据读取完毕才会进行下一个数据的读取,但是对于EDO DRAM却是完全不一样的。 EDO DRAM可以在输出数据的同时进行下一个列地址选通,我们依然结合下面的EDO读取时序图来了解EDO DRAM读取数据的过程:


  • RAS在结束上一次的读取操作之后,进入预充电状态,当接到读取数据的请求之后,行地址首先通过地址总线传输到地址引脚,在这个期间CAS依然处于预充电状态
  • /RAS引脚被激活,列地址开始经过行地址选通电路和行地址解码器进行行地址的选择,就在这个同时tRAC周期开始,因为是读取操作/WE引脚一直没有被激活,所以内存知道自己进行的是读取操作而不是写操作
  • CAS依然进行预充电的过程中,列地址被送到列地址选通电路选择出来合适的地址,当/CAS被激活的同时tCAC周期开始,当tCAC结束的时候,需要读取的数据将会通过数据引脚传输到数据总线。
  • 从开始输出第一组数据的时候,我们就可以体会到EDOFPM之间的区别了:在tCAC周期结束之前,CAS失活并且开始了预充电,第二组列地址传输和选通也随即开始,第一数据还没有输出完毕之前,下一组数据的tCAC周期就开始了--显然这样进一步的节省了时间。就在第二组数据输出前,CAS再次失活为第三组数据传输列地址做起了准备……
  • 如此的设计使得EDO内存的性能比起FPM的性能提高了大约20-40%.
  • 正是因为EDO的速度比FPM快,所以它可以运行在更高的总线频率上。所以很多的EDO RAM可以运行在66MHz的频率上,并且一般标注为5222
SDRAM主要谈论我们大家都能接触到的SDRAM内存了,首先得承认SDRAM同我们之前介绍的异步DRAM是差别非常大的。它的基本原理同前面提到的DRAM还是基本一样的(比如基本存储单元都是按照阵列排列,都有RASCAS的概念),不过这些存储单元的组织和控制同DRAM就具有相当大的差别了。在前面我们讨论其它类型的内存都是采用了以具体的产品为例来讲述的,所以这里我们依然采用这种形式,这次我们以 MICRON MT48LC4M4A1 16MB SDRAM为例。(如果你感兴趣可以去www.micronsemi.com网站查找相应的资料)。
如果你还记得我们在前面介绍的DRAM相关内容,那么应该还记得 DRAM是以bank来组织存储单元的。因为每个内存bank的位宽是同数据总线阿位宽一样的。所以对于SIMM,你必须把多个SIMM放在一个bank之中来满足32bit或者64bit数据总线的要求。DIMM具有更多阿引脚,所以单个DIMM可以提供足够的同数据总线相适应的位宽--这样每个bank只要一个DIMM就可以了。而且 SDRAM更进一步的是可以在单个的DIMM中存在多个bank,这样不但能够满足数据总线的需要还能进一步的提高总线的性能。

下面就让我来解释一下:
在我们前面讨论的DRAM读取方式中,当一个读取周期结束后,/RAS/CAS都必须停止激活然后有一个短暂的预充电期才能进入到下一次的读取周期中。但是一个具有两个bankSDRAM的模组中,其中一个bank在进行预充电的期间另一个bank却可以被调用--这样当你需要读取已经预充电的bank的数据时,就无需等待而是可以直接调用了。为了实现这个功能,SDRAM就需要增加对于多个bank的管理,这样就可以实现控制其中的bank进行预充电,并且在需要使用的时候随时调用了。这样一个具有两个bankSDRAM一般会多一根叫做BA0的引脚,实现在两个bank之间的选择--一般的BA0是低电平表示Bank0被选择,而BA0是高电平Bank1就会被选中。
可见,虽然SDRAM在基本的原理上比如基本存储的结构都是基本一样的,但是在整个内存架构的组织上是不同的,而且在存储单元的控制上也是有着相当大的区别的。因为异步DRAM同处理器和芯片的时钟并没有什么关系,所以芯片组只能按照DRAM内存的时序要求“被动”的操作DRAM控制引脚。SDRAM因为要同CPU和芯片组共享时钟,所以芯片组可以主动的在每个时钟的上升沿发给引脚控制命令。

上图显示的就是MT48LC4M4A1 16MB SDRAM内存颗粒的引脚示意图,它采用了50引脚的TSOP封装,符合PC100规范。这种内存颗粒将同系统时钟同步运行。这种内存颗粒的架构1Mx16-512Kx16x2,每bank行地址数目是11,列地址数目是8。我们首先来介绍一下这种内存颗粒的引脚定义:
  • A0A10:地址输入引脚,当ACTIVE命令和READ/WRITE命令时,来决定使用某个bank内的某个基本存储单元。
  • CLK:时钟信号输入引脚
  • CKEClock Enable,高电平时有效。当这个引脚处于低电平期间,提供给所有bank预充电和刷新的操作
  • /CS:芯片选择(Chip Select),SDRAM DIMM一般都是多存储芯片架构,这个引脚就是用于选择进行存取操作的芯片
  • /RAS:行地址选择(Row Address Select)
  • /CAS:列地址选择(Column Address Select)
  • /WE:写入信号(Write Enable)
  • DQ0DQ15:数据输入输出接口
  • BABank地址输入信号引脚,BA信号决定了由激活哪一个bank、进行读写或者预充电操作;BA也用于定义Mode寄存器中的相关数据。
  • NC:空引脚
  • DQM: 这个引脚的主要用于屏蔽输入/输出,功能相当于/OE引脚( Output Enable)。
  • VDDQDQ供电引脚,可以提高抗干扰强度
  • VSSQDQ供电接地引脚
  • 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


如果你对于我们前面介绍的内容有了真的有所了解了,看到上面的芯片引脚示意图和各个针脚的功能示意图就基本对于SDRAM的工作工程有了一个基本的了解了,在下面的章节里我们就对于这个过程进行详细的介绍,首先我们对于一些基本的概念做一些了解。
这条SDRAM颗粒采用了双bank(每bank 512K x 16 DRAM)的工作电压是3.3V,并且采用同步接口方式(所有的信号都是时钟信号的上升沿触发)。每一个512K x 16-bitbank2,048行乘以256列个基本存储单元构成,输出数据位宽是16 bitReadwrite操作都是通过突发导向模式访问SDRAM的;这种访问模式以访问指定的区域开始的,然后按照预先设定的方式定位其它的数据的所在。每次访问都是以ACTIVE命令启动的,然后仅仅跟着一个READ或者WRITE命令。不过在进行所有这些操作之前,SDRAM必须首先进行初始化。

  • 初始化
SDRAM在上电之后,必须首先按照预定的方式进行初始化才能正常的运行。一旦VDDVDDQ被同时供电并且时钟稳定下来,SDRAM就需要一个100微秒的延迟,在这个时间段中COMMAND INHIBITNOP指令有效,这个过程实际上就是内存的自检过程,一旦这个过程通过之后一个PRECHARGE命令就会紧紧随着最后一个COMMAND INHIBIT或者NOP指令而生效,这个期间所有的内存都处于空闲(idle)状态,随后会执行两个AUTOREFRESH周期、当AUTOREFRESH周期完毕之后,SDRAM为进行Mode Register编程做好了准备。因为Mode Register上电会引起一个为止的状态,它会在进行所有正常指令之前被载入。至此,初始化过程完成。

  • MODE REGISTER

Mode Register一般被用于定义SDRAM运行的模式。其中包括了突发长度(burst length)、突发类型(burst type)、CAS延迟(CAS latency)、运行方式(operating mode)和写入突发模式(如Figure 1所示)。Mode Register通过LOAD MODE REGISTER命令进行编程,这组信息将会一直保存在Mode Register中直到内存掉电之后才会消失。Mode Register中的M0-M2是用来定义突发长度(burst length)的,M3定义突发类型(sequential或者interleaved),M4-M6定义CAS延迟,M7M8定义运行模式,M9定义写入突发模式(write burst mode,M10 M11目前保留。Mode Register必须在所有的bank都处于idle状态下才能被载入,在所有初始化工组都进行完毕之前,控制器必须等待一定的时间。在初始化过程中发生了任何非法的操作都可能导致初始化失败从而导致整个计算机系统不能启动

  • 突发长度(Burst Length
Readwrite操作都是通过突发模式访问SDRAM的,当然突发模式的长度都是在初始化过程中载入Mode Register中载入的参数,这些参数当然是由厂商或者用户定义的。在Figure 1中我们看到突发长度决定了READ或者WRITE命令能够访问的列地址的最大数目。对于sequential interleaved这两种突发模式它们的突发长度是1248,另外全页(fullpage)突发模式仅仅适用于sequential类型。全页突发可以用BURST TERMINATE命令连接来产生任意的突发长度。保留状态(Reserved states)主要用于应付未来的不兼容的情况而准备的。当一个READ或者WRITE命令被发出之后,这个时候突发长度就被选定了。所有的访问操作都会以这个突发长度为限进行读取操作。当突发长度设为2时,A1-A7将会作为数据输入输出的列地址线;当突发长度设定为4时,A2-A7将会作为数据输入输出的列地址线;当突发长度被设定为8时,A3-A7将会作为数据输入输出的列地址线。

  • 突发类型(Burst Type
突发类型主要分为两种:sequentialinterleaved——主要由M3所决定。访问顺序主要由突发长度、突发类型和起始列地址所决定,如下表:

  • 禁止指令(COMMAND INHIBIT)和空指令(NOP
这两条指令是CS信号的两个不同的状态。前面我们提到 /CS信号可以赋予芯片两种状态:参与工作和休息。 /CS处于未激活状态(也就是禁止指令生效的时候), SDRAM此时不对于任何传送到这个引脚上的指令作出反应; /CS引脚处于激活状态的情况下才会对于传送到引脚上的指令作出反应。
空指令(NOP)这个指令将激活 /CS,但是它仅仅告诉芯片什么说不作——但是为什么要有这样的看似多余的指令呢?在后面的CAS延迟时间中我们将会涉及到。



  • ACTIVATEREAD WRITE
如果要了解基本的 READWRITE操作,那么你就应该需要了解这三条指令。 ACTIVATE指令的主要就是选择一个bank并且激活相应的行; READ指令就是读取指定的行的数据; WRITE指令就是在指定的bank和列中写入数据。下面就让我们看看SDRAM读取时序图:

1) 行地址通过地址总线传输到地址引脚(Address Bus行),当在第一个时钟周期的上升沿,通过ACTIVATE指令通过 /CS激活了相应的行地址--当然确定指定的行之前BA0引脚会选择相应的bank
2) /WE引脚在这个过程中一直不会被激活,所以S DRAM知道它们不是进行写操作
3) 第三个时钟周期的开始,ACTVATE指令激活了/CAS并且得到指定的列地址
4) 第五个到第十个时钟周期的上升沿都会有数据输出到数据总线。
我们看到SDRAM基本的读取过程非常的简单。今天就先谈到这里,在以后的文章中我们将会对于SDRAM相关的问题继续进行讨论。(未完待续……)



















SDRAM读取过程分析

在《深入了解内存(四)》一文中,我们对于SDRAM的读取过程中的基本概念做了比较详细的了解。在这个系列的文章中,我们继续对于SDRAM的读取过程进行更加详细的讨论。

BANK/行的激活过程
在进行任何的READ或者WRITE命令的之前,SDRAM首先要选择进行操作的bank,并且还要打开这个bank中的相应的行。完成这个任务要通过ACTIVE命令来实现,(具体的说,ACTIVE命令主要在subsequent访问模式用于打开/激活所选bank中的行。其中BA引脚输入的信号决定bank的选择,而A0A10地址引脚决定行地址。被打开的行保持打开/激活状态直到下一次所在bank执行Precharge命令--一般的一个Precharge命令用于在同一个bank中打开不同的行之前)如下图所示显示的CS(芯片选择)信号是低电平处于有效状态;RAS信号是低电平处于有效状态;CAS信号是高电平,表示还没有进行列选择;WE信号是高电平,表现芯片不会进行写操作:

1

ACTIVE命令执行完毕之后,需要进行操作的bank中的行就会被打开,这个时候就可以进一步执行READ或者WRITE命令,当然进行这个命令要受限于tRCDTimeRAS to CAS Delay)规格。tRCD(MIN)就是从开始执行ACTIVE命令到执行READ或者WRITE命令的时间差。比如说,tRCD如果为20ns,当时钟频率为125MHz(也就是每周期8ns)时,tRCD所占据的时钟周期为2.5-3个时钟周期。请看图2,一般的情况下2 <tRCD (MIN)/tCK 3
SDRAM需要在同一个bank中打开另外一行时,Prechargerd命令会先把已经打开的行关闭,然后由一个ACTIVE来打开新的行。同一个bank中,在两个相邻的ACTIVE命令之间的时间间隔叫做tRC。在不同的bank之间,执行两个ACTIVE命令之间的时间间隔叫做tRRD

2


SDRAM读取状态进阶分析
当行地址选定并且相应的行被打开之后,READ命令将要开始执行,如图3所示。BA引脚依然决定对于哪个bank进行操作,A10引脚的信号决定了是否进行AUTO PRECHAGE--一般的读取操作中AUTO PRECHAGE处于低电平也就是无效状态,如果它处于高电平就说明在读取突发进行完毕之后所读取的行会进入预充电状态,该行也会从打开状态变为关闭状态。A0A7传输列地址数据。CS依然处于低电平状态,保证对于需要操作芯片的选择。RAS此时处于高电平,因为该行已经打开直到执行PRECHAGE命令才会关闭,所以RAS此时处于无效状态。因为这个时候是对于列的选择,所以RAS处于低电平状态,进行列地址的选择。因为是读取操作WE当然是高电平,处于无效的状态。

3

在读取突发过程中,当READ命令开始执行之后经过CAS延迟之后的时间数据就会出现在数据总线上,当然随后相邻的数据都是在紧接着的时钟周期的上升沿依次发出。图4所示的就是在各种CAS延迟设定下的从READ命令到数据输出的情况:

4

当完成了读取突发操作之后,如果这个时候没有其它的命令进行初始化,那么DQs将会进入到HighZ状态。然后内存就会进入全页突发模式,直到被中止--否则的话,即使是读取到了页尾,它会从该行的列0重新开始读取。任何的READ突发能够被持续READ命令所中止,并且具有新的突发长度的READ命令所产生的数据后可以紧紧跟着前面READ突发命令所产生的数据发出。这样就能够保持数据的连贯性。图5可以让你理解这种情况:

5(顺序读取)

从上图可以看到,为了保证数据的连贯性,新的READ突发命令会在上一个READ突发命令所产生的数据之前的x个周期执行。在这里x等于CAS延迟时间减1。图5中可以看到,当CAS延迟等于1时,在Dout n3数据传输的时钟周期的上升沿,新的READ命令就开始执行(110);同样在CAS延迟时间等于3时,新的READ指令在Dout n1数据传输的时钟周期的上升沿开始执行——提前了312个周期。可见一个READ命令可以在前一个READ读取过程中的任何一个时钟周期开始初始化。

6(随机读取)


6所显示的是在CAS分别设置尾123的状态下,进行随机读取的操作的情况。当CAS1时情况很好理解,新的READ指令总是在前一个READ指令所产生的数据传输的时钟周期的上升沿开始初始化;在CAS3的情况下,为了保证数据输出的连续性,新的READ指令必须提前2个时钟周期初始化,这样我们就看到新的READ指令是紧紧接着上一个READ指令进行初始化的。

7READWRITE

当然任何READ命令所产生的数据将会被持续的WRITE命令所中止,而且在最后的数据之后的可以紧紧跟着一个WRITE命令(因为受到从READWRITE转变的限制,必须等待数据传输完毕才能进行数据写入)。WRITE突发命令是在READ命令数据传输完毕的第一个时钟周期的上升沿开始的。不过,在有的系统中由于SDRAM DQM会经过一个高低电平的转换,所以被设计成为在最后读取数据和WRITE命令之间有一个时钟周期的延迟。

8

这个地方之所以引入DQM信号,主要是为了避免I/O连接如图78所示的情况出现。DQM信号必须维持两个时钟周期的高电平抑制了READ数据的输出才能进行WRITE命令的初始化-- 一旦WRITE命令被触发,DQ将会变为High-Z状态--这个状态同DQM信号的状态并没有关系。只有这样才能进行WRITE操作,但是如果数据输出没有被抑制,那么在第二个WIRTE会发生非法WRITE操作。比如,如果图8中的T4周期DQM是低电平,那么在T5T7周期的WRITE操作将会是有效的,但是在T6周期的写入操作将会是非法的。在执行写入操作的过程中,DQM信号必须成为低电平,这样才能保证写入的数据没有被屏蔽。图7和图8的主要区别就是后者在写入数据和前一次的数据输出之间插入了NOP指令。

9READ-预充电)


前面我们介绍的数据读取都是在打开同一个行的前提下进行的,现在我们讨论的是进行不同行的数据的读取或者是中止数据的读取。PRECHARGE命令一般用于同一个bank间的不同的行之间的数据读取。PRECHARGE会在上一次READ命令输出数据最后一个时钟周期的前(x1)个时钟周期执行,在图9中显示的是当CAS在各种可能状态下的的情况。当CAS等于1的时候,PRECHARGE会提前(11)个时钟周期执行预充电操作,从这个PRECHARGE命令到下一个ACTIVE命令之间的时间价格叫做tRP。需要注意的是部分预充电时间同上一次的数据传输时间是有重叠的。随着CAS延迟时间的延长,预充电时间同上次读取操作数据输出的重叠时间就越多。因为PRECHARGE指令要求命令总线和地址总线都必须在指定的时间段内空闲,这是应该是它的缺点;而PRECHARGE命令的优点就是它可以被用来中止可变长度或者全页突发READ指令。


10READ-状态中止)

全页READ突发和可变长度READ突发都可以用BURST TERMINATE指令来中止。BURST TERMINATE指令一般在最后一个所需要的数据传输前的x时钟周期有效,这里的x依然代表是CAS延迟周期减一。在图10中很清楚的显示出来了BURST TERMINATE的供桌状态,因为前面我已经同大家一起分析了其它情况的工作状态,所以这里我就详细的分析了,留给大家自己思考一下。
今天我们用本章节的篇幅介绍了SDRAM读取数据的各种情况,看上去有些复杂,但是非常的有规律,应该不难理解。在随后的文章的中我们会继续对于SDRAM的其它方面的情况进行介绍,敬请期待……






SDRAM写入过程

在前面部分的文章中我们对于SDRAM的读取过程进行了详细的讨论,不过今天我发现在其中有个比较重要的重要的概念并没有单独的提出来讲解一下,但是前面对于SDRAM读取过程的讲解中如果仔细领会也应该对于CAS的概念比较了解了。在本章节的开始我们还是对于这个问题进行一下专门的讨论吧。

SDRAM CAS延迟
如果你的主板支持对于内存进行比较全面的控制,那么你应该在其中看到有关于CAS的选项,一般的可以选择CAS 1CAS 2或者CAS 3。你选择不同的CAS值取决于你想要内存在什么样子的频率上运行。在本章节中主要就是告诉CAS latency值对于计算机系统究竟意味着什么以及为什么它们同总线速度有关。
CAS延迟(CAS latency)指的就是在READ命令触发到第一次数据输出之间的时间,这个时间的单位是以时钟周期。这个延迟时间可以设定为123个时钟周期。也就是说,如果READ命令在第n个时钟上升沿被触发,延迟时间为m个时钟周期,那么数据将会在第nm个时钟上升沿开始输出。下面的图表(图片都是来自Micron的数据库中关于MT48LC4M4A1的资料)可以帮助你更好的了解这个问题: 

1

另外,DQ会在第(n + m - 1)个时钟周期之后的上升沿开始输出数据,也就是说数据将会在第(nm)个时钟周期有效。比如说,CAS延迟被设定为2,那么如果READ命令在T0触发,DQ将会在在T1开始驱动,而所需要读取的数据在T2有效并且开始输出。上面的示意图显示了CAS延迟分别在123下的情况。
在上面的三个示意图中我们都可以看到NOPNO OPERATION:空指令)。SDRAM插入一个NOP空指令是因为SDRAM所有的操作都要同系统的基频同步,大部分的操作都不是一个时钟周期所能完成的,因此在等待或者空闲状态下为了防止其它的命令被触发,所以需要不停的发送NOP命令来抑制其他的指令,但是并不会干扰当前正在进行的操作。当然需要注意的是NOP指令的发送并不是随机的,而是根据用户的设定已经预设好的。

1

CAS延迟和总线时钟之间的关系可以同下面的CAL LATENCY表格中看出,一般系统总线速度越快,CAS延迟也会越长。这是因为目前的内存基本存储单元架构决定了其所能达到的最高运行频率,为了保证同目前总线时钟的同步,只能采用这样的方法了。

WRITE过程分析

WRITE突发过程是以WRITE指令的初始化开始的,在初始化过程中起始列和bank地址将会被确定。如果AUTO PRECHARGE有效,被访问的行将会在突发结束后进行预充电。而对于如图2一般的WRITE指令来说,AUTO PRECHARGE指令是会被屏蔽的。

2Write Command

如图2所示,这是WRITE命令的写入时的状态,在这个时钟的上升沿,CS#也进行相应的芯片选择,BA已经确定了需要进行操作的Bank,需要操作的行已经打开,直到下次读取操作或者PRECHARGE命令才会关闭该行,所以这个时候RAS#是高电平处于无效状态,因为需要进行列地址的选择,所以CAS#处于低电平,当然因为要进行写入操作WE#也是低电平状态。

3Write Burst

WRITE突发过程中,第一个有效数据在WRITE命令被触发的同时开始写入,如果还有连续的数据,它们会在随后的每个时钟周期的上升时间进行写入操作。在固定长度的突发操作中,假设没有其他的指令被初始化,DQ将会一直保持High-Z状态,这个时候其它的输入数据将不会被执行(图上图3),这个时候当然进入了全页突发的写入模式,在没有中止指令之前这种模式会一直持续而且会循环往复。这个时候如果有新的WIRET指令,那么原来的写入过程将会被中止。同我们前面了解的读取过程一样,在固定长度的WRITE突发模式中可以在任何之前的时钟周期中预先执行持续的WRITE命令。

4WRITE to WRITE

如上图4Data n + 1是上一次写操作的最后一个写入的数据。一个新的WRITE命令可以在以前WRITE命令过程中的任何一个时钟周期进行初始化。

5(随机写入)

在同一页中全速、随机写入的执行情况请参考上面的图5。任何形式的WRITE突发模式都可以被持续的READ命令所中止,而在之前进行的WRITE命令操作所写入最后一个数据之后的时钟周期会马上执行持续的READ操作。

6WRITE to READ

如上图6所示,Data n + 1T0开始的写入操作的最后一个写入数据。在这个数据之后,可以紧紧跟着固定长度的WRITE突发操作或者被PRECHARGE命令中止--当然这样的操作也是在同一个bank之中的。关于PRECHARGE我们会在后面的示意图中讲述。这里我们看到在Data n1后的第一个时钟周期READ命令开始执行,一旦READ命令被触发,数据输入将会被忽略,WRITE命令将不会被执行。因为CAS2,所以在T4时钟周期第一组数据开始输出了。

7WRITE to PRECHARGE


在图7显示的是两种情况,第一是tWR1CLK的情况:在T0时钟WRITE命令执行,ADDRESS所选择的列地址确定了需要写入数据的存储单元,也就在这个时钟周期数据开始写入。然后随后的每一个时钟周期都会进行数据的写入,在Din n1个数据写入之后的时钟周期,PRECHARGE命令执行,这个时候已经打开的列地址被关闭进入预充电状态。在最后一个数据写入的时钟周期的上升沿到PRECHARGE命令开始执行的时钟周期的上升沿之间的时间间隔就是tWR时间。你一定还记得从PRECHARGE命令开始执行的时钟周期的上升沿到下一个ACTIVE命令的执行的时钟周期的上升沿之间的时间间隔是tRP,上图中显示占用了3个时钟周期,期间插入了两个NOP指令。这个时候就可以进行其他的操作了。
第二种情况也就是tWR2CLK的情况下,情况基本是一样的,只是tRW时钟周期不同而已。另外我们看到,在PRECHARGE命令执行期间DQM信号是高电平。PRECHARGE命令的缺点很明显,就是需要同时占用命令总线和地址总线,优点就是可以中止固定长度或者全页突发模式。

8

固定长度或者全页WRITE突发可以被BURST TERMINATE指令中止。当中止了一个WRITE突发操作,以后的输入数据将都会被忽略。如上图8所示,Din n是前一个WRITE命令的最后一个写入的数据,在随后的一个时钟周期的上升沿BURST TERMINATE将会执行,该WRITE操作将会被中止,然后内存就可以接受其它的命令。

小节:
关于SDRAM内存的工作原理到这里我们基本上讨论完毕了。最后再对于SDRAM标识问题进行一下讨论。我们经常看到再很多场合这样的标识SDRAMXYZ
比如说有的SDRAM标识为3-2-2,这个含义同前面的文章介绍的异步DRAMx-y-y-y是完全不同的:这三个数字依次表示为CAS延迟、RAS-to-CAS延迟、RAS预充电时间。这三项指标再加上内存的运行频率就可以比较详细的表明这款内存的各个方面的情况。说到内存运行频率,它是以MHz为衡量单位的--之前的DRAM都是以纳秒为单位的。
SDRAM我们就讨论到这里,以后我们会继续讨论其它的主流RAM,比如DDRRDRAM等等。(未完待续……)





















深入了解内存(七)
Aceshardware所写的关于SDRAM基本工作原理的文章


在本站前一段时间推出了一系列的关于内存技术的文章,其中对于DRAM内存的基本原理都做了介绍,特别详细的介绍了SDRAM的工作情况。相信能够帮助读者们了解内存的基本工作原理。今天介绍给大家的这篇文章是Aceshardware所写的关于SDRAM基本工作原理的文章,这篇文章的同我们前面所写的文章可以说能够相互补充。
它首先介绍了DRAM基本存储单元的结构,然后结合芯片组来介绍了内存工作的时序,相对于原来比较微观的介绍,这篇文章的是从整体的概念上入手的。

DRAM基本存储单元结构
不管你相信不相信,目前主流内存中的RDRAM(Rambus)DDR SDRAMSDRAM甚至是EDO RAM的基本结构都是相同的,它们都是属于DRAMDynamic RAM:动态随机访问存储器)。所有的DRAM基本存储单元都是由一个晶体管和一个电容组成。

这样的基本存储单元的架构是目前最经济的方式,电容的状态决定着内存基本存储单元的逻辑状态是“0”还是“1”--充满电荷的电容器代表逻辑“1”,“空”的电容器代表逻辑“0”,不过正是因为使用了电容器所以产生了一些局限性。电容的内存储的电荷一般是会慢慢泄漏的,这也就是为什么内存需要不时的刷新的缘故。电容需要电流进行充电,而电流充电的过程也是需要一定时间的,一般是0.2-0.18微秒(由于内存工作环境所限制,不可能无限制的提高电流的强度),在这个充电的过程中内存是不能被访问的。
从技术上讲,实现内存的定时刷新并不是什么难事,DRAM厂商指出这种刷新操作必须每64ms进行一次,这也就意味着DRAM基本存储单元大约有1%的时间用在了刷新上。对于DRAM来说最大的问题是,读取内存会造成内存基本存储单元中的电荷丢失,所以每当DRAM被访问之后都要进行刷新,以维持访问之前的状态,否则就会造成数据丢失。当然拿出专门的时间进行刷新,也就增加了访问时间,提高了延迟。
SRAMStatic RAM)则不存在刷新的问题。一个SRAM基本存储单元由4个晶体管和两个电阻器构成,它并不利用电容器来存储数据,而是通过切换晶体管的状态来实现的,如同CPU中的晶体管通过切换不同的状态也能够分别代表01这两个状态。正是因为这种结构,所以SRAM的读取过程并不会造成SRAM内存储的的信息的丢失,当然也就不存在什么刷新的问题了。
SRAM可以比DRAM高的频率来运行,主要是因为获取前8个字节的时间延迟大大缩短了。SRAM需要23个时钟周期来得到想要的数据(这里我们暂时忽略CPU、芯片组和内存DIMM控制电路之间的延迟),不过同样的过程DRAM需要大约39个时钟周期。当然因为构造不同,SRAMDRAM存储1bit数据的成本是不同的,前者大约是后者的4倍--因为它的所需要的晶体管数目是后者的4倍以上。SRAM因为存取延迟时间非常的短,所以它的工作频率能够达到很高,因此可以带来更高的带宽。
前面我们已经提到获取第一个字大约需要39个时钟周期的延迟时间。为什么?在我们讨论不同的DRAM之间的性能差异之前,我们应该首先了解DRAM DIMM的内部架构。

SDRAM基本结构
基本存储单元是内存芯片中储存信息的最小的单位,每个存储单元可以存储1bit的信息,并且有一个由行地址和列地址共同定义的唯一的地址。我们都知道8bit可以在一起组成一个byte(这也就意味着1byte具有28种可能的数值),而byte是内存中最小的可寻址的单元。虽然内存基本存储单元具有唯一的地址,但是并不能进行独立的寻址——这将要求内存芯片有数以百计的引脚同计算机通讯,显然这是不可能的。现在内存架构是处于同一列的基本存储单元共用一条列地址线,而处于同一行的基本存储单元共用一条行地址线,组成一个基本存储单元构成的矩阵架构。而这些矩阵架构构成一个内存bank
大多数的SDRAM芯片具有这样的4bank,一个SDRAM DIMM (Dual Inline Memory Module)可以包括8或者16片芯片。SDRAM DIMM具有14条地址线和64bit数据线。如果一条DIMM使用8bit SDRAM芯片,那么在DIMM上可以发现8片芯片,如果DIMM使用了4bit SDRAM芯片,那么你可以在DIMM上找到16片这样的芯片。

现在就让我们仔细的看看内存bank,上图所示的就是内存bank的示意图,每个bank中包含一个内存阵列、传感放大器、行地址解码器和列地址解码器。为了理解内存bank内部工作情况,让我们当CPU需要的数据没有调入处理器缓存,处理器从内存中调用数据的过程:

  • CPU需要32 byte的数据,然后将这个请求发送给芯片组。这个过程大约需要1个时钟周期。

  • 芯片组首先通过14条地址总线发送行地址。这意味着这个行地址被发送到DIMM中的所有芯片上。所有的使用同一个行地址的存储单元组成了一个“页”,也就是说,当芯片组发送行地址到DIMM之后在DIMM打开了一个页。
  • 每一个内存bank都有一个传感放大器,它用于在读取或者写入过程中改变电荷到适于操作的程度。根据发送过来的行地址,传感放大器可以读取正确的行。这个读取过程是需要花费时间的,这段时间就叫做“RASCAS延迟”(TRCD)SDRAM质量不同,TRCD 的值大约是2或者3个时钟周期。

  • 当进行到这个时候,我们已经找到数据所在的行了,但是我们依然不知道数据存储在哪一个基本存储单元。CAS延迟内存找到正确的列的时间--对于一个矩阵来说,知道了行地址和列地址之后我们就能够确定我们所需要的数据所在的位置。CAS延迟一般是2或者3


  • 被找到的数据被送到DIMM的输出缓存,这个时候芯片组就能读取它们了。

  • 现在我们已经读取了第一个字(8个字节)了,目前因为正确的行地址已经在传感放大器中了,那么得到下24个字节的过程就简单了。一个内部计数器可以直接把下一个相邻列地址所决定的基本存储单元中的数据传送到输出缓存中,每一个时钟都可以传送8个字节,这种传送数据的方式就叫做“突发模式”。


下面列出了整个内存系统(从FSBDRAM)各个阶段的延迟时间:

  • FSB和芯片组之间的延迟时间大约是+/- 1个时钟周期
  • 芯片组和DRAM之间的延迟时间是+/- 1个时钟周期
  • RASCAS延迟时间大约2-3时钟周期,这个期间找到了正确的行
  • CAS延迟时间大约2-3时钟周期,这个期间找到了正确的列
  • 1个时钟周期的时间用于传送数据
  • DRAM输出缓存中的数据通过芯片组传送到处理器大约需要+/- 2个时钟周期

这个过程只是得到了前8个字节的数据,优质的PC100 SDRAM CAS 2这个过程一般需要9个时钟周期,下3个时钟周期可以传送剩下的24个字节。PC100 SDRAM传送这32个数据一共需要大约12个时钟周期。
如果你想要计算CPU所等待的延迟时间,只要用这个内存子系统延迟时间乘以CPU倍频。这样一个500MHz5x100MHz)处理器将要有5x9个时钟周期。也就是说,当CPU不能在二级缓存中找到需要的数据的话,至少要等待45个时钟周期才能调用到正确的数据。
本文到这里可以让你了解基本的DRAM工作情况了,下面让我们看看影响RAM技术速度的主要因素。

延迟时间
究竟是什么影响了DRAM的速度?因为SDRAM是一个多bank架构,当芯片组访问过某一bank的某一行之后,这一行处于一个“开”的状态。如果下一次访问请求还是同一个行,芯片组不必等待传感放大器充电,这样的情况就叫做页命中。这种情况下RASCAS延迟将成为0个时钟周期,只要经过CAS延迟时间之后数据就可以被送到输出缓存中了。换句话说,在页命中的情况下我们仅仅等待寻找正确的列的时间就可以了。
当然还有其它的可能性,就是所请求的行并不是已经打开的行,这种情况叫做页面失效(page miss)。在这种情况下,RASCAS延迟将是23个时钟周期,这根据SDRAM内存的质量不同而不同。这种情况就是前面我们详细讨论的情况。
如果芯片组已经打开了某个bank中的某一行,而请求的数据在同一bank中的另外的行中,情况就会变得更糟了。这意味着传感放大器必须在选择新的行之前回写已经打开的旧的行。这个过程叫做预充电时间(Precharge time,简称Trp),这是所有情况中最糟糕的情况。



内存实际带宽
为了便于大家理解延迟和带宽之间的关系,我们以一个PC100 SDRAM-222内存为例来论述这个问题,这里的第一个2表示CAS延迟时间等于2,第二个数字表示RASCAS延迟时间,第三个数据表示预充电时间。
请看下表,它所显示的是在各种情况的下的延迟时间的。其中第三列所示的DRAM延迟是得到第一个列地址所需要的时间。比如在页面失效的情况下,我们必须等到2个时钟周期的预充电时间(Row to Cas Delay, RCD),然后继续等待2个时钟周期(也就是CAS延迟时间)这样就是能找到需要找的列地址了。而在表格中把2个时钟周期的预充电时间和CAS延迟时间合称为DRAM延迟时间。
在第四列我们看到时间都比前面的延迟时间多了5个时钟周期,这5个时钟周期中,前2两个时钟周期是地址数据从CPU经过芯片组传输到DIMM模组的时间,中间1个时钟周期是数据传输到输出缓存的时间,另外两个时钟周期是找到的数据经过芯片组传回到CPU的时间。
 
情况
发生几率
DRAM延迟(时钟周期)
得到前8个字节所需要延迟时间(时钟周期)
传输32字节所需延迟时间(时钟周期)
最大带宽
(PC 100)

页面命中
+/- 55%
CL = 2
7
7-1-1-1= 10 cycles
320 MB/s
“正常”页面失效
+/- 40%
RCD+CL = 4
9
9-1-1-1 = 12 cycles
267 MB/s
页面失效,传感放大器但是已经打开的页面尚未关闭
+/- 5%
RP+RCD +CL = 6
11
11-1-1-1= 14 cycles
229 MB/s

倒数第二列显示的就是传送全部的32个字节所需要的时间,最后一列显示的就是在这种情况下内存所能够达到的最大带宽。我们看到即使在最理想的情况下,也就是在页面100%命中的情况下,实际所能达到的带宽也只有320MB/s(对于CAS2PC100 SDRAM来说,可以在10个时钟周期中得到32个字节的数据,也就是说需要100纳秒的时间得到32字节的数据,这样当然就能估算中实际带宽是320MB/s--当然这样也是理想状态,平时我们所需要的数据不可能都是每32个字节连续的)。
从上面计算出来的数据我们可以看出,即使对于最好的PC100 SDRAMs (222)内存,在最理想的状态下(页面命中率100%的情况下),实际所能达到的带宽也不过是理论带宽(800 MB/s)的40%。对于Pentium III缓存所使用的SRAM传送32个字节所需要的时间延迟为3-1-1-1,也就是6个时钟周期(注意它的频率可以达到300MB/s以上),这样它的带宽至少是1600MB/s。那么对于我们现在所普遍使用的PC133的情况是怎么样的呢?请看下表所示的是PC133 CAS2PC133 Cas3PC100 CAS2的情况:

DRAM
总体延迟时间
传输32字节所需延迟
最大带宽
相对于PC 100的性能增张
PC 133-CAS 2
+/- 7 cycles
7-1-1-1= 10 cycles
427 MB/s
33%
PC 133-CAS 3
+/- 8 cycles
8-1-1-1 = 11 cycles
387 MB/s
21%
PC 100-CAS 2
+/- 7 cycles
7-1-1-1= 10 cycles
320 MB/s
N/A
这里我们看到得到前8个字节的数据,PC133 CAS3需要8个时钟周期而PC100 CAS2却仅仅需要7个时钟周期,如果这样就觉得PC100 CAS2的性能就比PC133 CAS3好了,应该说是不全面的。对于系统总线分别为100MHz和133MHz的系统,如果分别使用PC100 CAS2和PC133 CAS3,虽然后者得到前8个字节所需的时间比前者多1个时钟周期,但是考虑到系统总线速度依然比较快,所以计算起来依然是PC133系统快一些,但是对于都是PC100的系统,即使使用PC133 CAS3的内存条,它的性能也不可能超过PC100 CAS2的内存条--不过好在一般的PC133 CAS3内存都能在PC100 CAS2上稳定的运行,所以如果你遇到这个情况应该知道怎么解决了。 异步和同步芯片组的相关问题 对于这些问题有了基本的概念之后,我们一起讨论BX时代的芯片组的相关问题,现在很用用户一定还在使用BX芯片组主板或者VIA Apollo Pro133A、AMD750等芯片组。我们知道VIA Apollo Pro133A可以支持133外频,但是它的内存子系统的性能相对于超频到133MHz是略低的。为什么会这样,这就涉及到一个芯片组采用的异步内存或者同步的内存的问题。BX/AMD750芯片组是同FSB时钟频率一致的,而VIA Apollo Pro133A芯片组的采用的是异步解决方案--因为它的可以支持PC66、PC100和PC133 SDRAM芯片组,所以必须采用这种解决方案。 现在让我们比较以下三种系统的情况:超频到133MHz的BX芯片组、使用异步内存的VIA Apollo
Pro133A芯片组和运行在100MHz额定频率下的芯片组--每种芯片组都采用了相应频率的SDRAM内存。如果内存运行的频率不同于系统的总线频率,那么至少一个时钟周期用于同步。因为133 MHz总线的时钟周期是7.5纳秒,而100 MHz总线的时钟周期是10纳秒,如下图所示,在某一个时间两种频率的波同时达到上升沿,当7.5纳秒的的某个时钟周期结束的时候,10纳秒的时钟周期才进行到某一个地方。如果让这两个不同的频率的波同时达到上升沿至少需要一个时钟周期的延迟。
下面让我们看看各种情况下的延迟情况:
DRAM
芯片组
8字节
延迟时间
得到32字节所需
延迟时间
最大带宽
PC 133 CAS 2
BX Sync同步
+/- 7 cycles
7-1-1-1= 10 cycles
32 byte/(10 cycles of 7.5 ns) =427 MB/s
PC 133-CAS 2
VIA 133 MHz异步
+/- 8 cycles
8-1-1-1= 11 cycles
32 byte/(11 cycles of 7.5 ns) =387 MB/s
PC 133-CAS 3
VIA 133 MHz异步
+/- 9 cycles
9-1-1-1 =12 cycles
32 byte/(12 cycles of 7.5 ns) =355 MB/s
PC 100-CAS 2
BX/VIA同步
+/- 7 cycles
7-1-1-1= 10 cycles
32 byte/(10 cycles of 10 ns) =320 MB/s

一个133 MHz异步内存系统得到前8个字节的延迟时间高于同步内存子系统大约15%,这也就意味着它的带宽比同步内存子系统低大约10%。 上面我们仅仅假设异步内存系统之间需要一个时钟周期来进行同步,如果需要更多的时钟周期来同步,那么异步内存系统的实际带宽将会更低。

结论
从以上的内容我们可以看到,DRAM内存为了保持其内的内容需要经常的刷新,这种特性限制了这种内存不可能达到太高的工作频率,在实际工作中得到需要的数据也是必须经过一定的延迟时间才能够得到的。一般的SDRAM的带宽在8001066 MB/s之间,但是实际的带宽也不过是它的理论带宽的40%左右(这是在100%命中的情况的下的结果)。
在今天文章所介绍的东西涉及到BX这个基本的芯片组,这些产品正在快速的退出市场,让位给我们现在主流使用的东西。但是对于我进一步了解内存的工作原理依然有相当的帮助。不过目前的AthlonAhtlon XP系统配置的都是DDR SDRAM内存,而Pentium 4也从RDRAM逐渐的过渡到了DDR SDRAM,所以下一篇文章我们依然从这样的角度来了解RDRAMDDR SDRAM的工作原理和特点。




collected by stonefeng













分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

返回列表
网页右侧QQ悬浮滚动在线客服
网页右侧QQ悬浮滚动在线客服