SDRAM 控制(比较乱,挑着看)

收集了一些SDRAM控制器设计的资料,有点乱,懒得整理。
/************************************************************************/
SDRAM的原理和时序.pdf 下载到下面链接。
http://www.eetop.cn/bbs/thread-57279-1-1.html
/*********************************************************************************************/  
 今天我们就详细探讨一下,其中的很多内容同样适用于DDR与RDRAM。这里需要强调一点,对于内存系统整体而言,一次内存访问就是对一个页的访问,这个页的定义已经在解释Full Page含义时讲明了。由于在P-Bank中,每个芯片的寻址都是一样的,所以可以将页访问“浓缩”等效为对每芯片中指定行的访问,这样可能比较好理解。但为了与官方标准统一,在下文中会经常用页来描述相关的内容,请读者注意理解。

一、影响性能的主要时序参数

所谓的影响性能是并不是指SDRAM的带宽,频率与位宽固定后,带宽也就不可更改了。但这是理想的情况,在内存的工作周期内,不可能总处于数据传输的状态,因为要有命令、寻址等必要的过程。但这些操作占用的时间越短,内存工作的效率越高,性能也就越好。
非数据传输时间的主要组成部分就是各种延迟与潜伏期。通过上文的讲述,大家应该很明显看出有三个参数对内存的性能影响至关重要,它们是tRCD、CL和tRP。每条正规的内存模组都会在标识上注明这三个参数值,可见它们对性能的敏感性。
以内存最主要的操作——读取为例。tRCD决定了行寻址(有效)至列寻址(读/写命令)之间的间隔,CL决定了列寻址到数据进行真正被读取所花费的时间,tRP则决定了相同L-Bank中不同工作行转换的速度。现在可以想象一下读取时可能遇到的几种情况(分析写入操作时不用考虑CL即可):
1、要寻址的行与L-Bank是空闲的。也就是说该L-Bank的所有行是关闭的,此时可直接发送行有效命令,数据读取前的总耗时为tRCD+CL,这种情况我们称之为页命中(PH,Page Hit)。
2、要寻址的行正好是前一个操作的工作行,也就是说要寻址的行已经处于选通有效状态,此时可直接发送列寻址命令,数据读取前的总耗时仅为CL,这就是所谓的背靠背(Back to Back)寻址,我们称之为页快速命中(PFH,Page Fast Hit)或页直接命中(PDH,Page Direct Hit)。
3、要寻址的行所在的L-Bank中已经有一个行处于活动状态(未关闭),这种现象就被称作寻址冲突,此时就必须要进行预充电来关闭工作行,再对新行发送行有效命令。结果,总耗时就是tRP+tRCD+CL,这种情况我们称之为页错失(PM,Page Miss)。
显然,PFH是最理想的寻址情况,PM则是最糟糕的寻址情况。上述三种情况发生的机率各自简称为PHR——PH Rate、PFDR——PFH Rate、PMR——PM Rate。因此,系统设计人员(包括内存与北桥芯片)都尽量想提高PHR与PFHR,同时减少PMR,以达到提高内存工作效率的目的。

二、增加PHR的方法
显然,这与预充电管理策略有着直接的关系,目前有两种方法来尽量提高PHR。自动预充电技术就是其中之一,它自动的在每次行操作之后进行预充电,从而减少了日后对同一L-Bank不同行寻址时发生冲突的可能性。但是,如果要在当前行工作完成后马上打开同一L-Bank的另一行工作时,仍然存在tRP的延迟。怎么办? 此时就需要L-Bank交错预充电了。
VIA的4路交错式内存控制就是在一个L-Bank工作时,对下一个要工作的L-Bank进行预充电。这样,预充电与数据的传输交错执行,当访问下一个L-Bank时,tRP已过,就可以直接进入行有效状态了。目前VIA声称可以跨P-Bank进行16路内存交错,并以LRU算法进行预充电管理。
有关L-Bank交错预充电(存取)的具体执行在本刊2001年第2期已有详细介绍,这里就不再重复了。

L-Bank交错自动预充电/读取时序图:L-Bank 0与L-Bank 3实现了无间隔交错读取,避免了tRP对性能的影响

三、增加PFHR的方法

无论是自动预充电还是交错工作的方法都无法消除tRCD所带来的延迟。要解决这个问题,就要尽量让一个工作行在进行预充电前尽可能多的接收多个工作命令,以达到背靠背的效果,此时就只剩下CL所造成的读取延迟了(写入时没有延迟)。
如何做到这一点呢?这就是北桥芯片的责任了。在上文的时序图中有一个参数tRAS(Active to Precharge Command,行有效至预充电命令间隔周期)。它有一个范围,对于PC133标准,一般是预充电命令至少要在行有效命令5个时钟周期之后发出,最长间隔视芯片而异(基本在120000ns左右),否则工作行的数据将有丢失的危险。那么这也就意味着一个工作行从有效(选通)开始,可以有120000ns的持续工作时间而不用进行预充电。显然,只要北桥芯片不发出预充电(包括允许自动预充电)的命令,行打开的状态就会一直保持。在此期间的对该行的任何读写操作也就不会有tRCD的延迟。可见,如果北桥芯片在能同时打开的行(页)越多,那么PFHR也就越大。需要强调的是,这里的同时打开不是指对多行同时寻址(那是不可能的),而是指多行同时处于选通状态。我们可以看到一些SDRAM芯片组的资料中会指出可以同时打开多少个页的指标,这可以说是决定其内存性能的一个重要因素。

Intel 845芯片组MCH的资料:其中表明它可以支持24个页面同时处于打开状态

但是,可同时打开的页数也是有限制的。从SDRAM的寻址原理讲,同一L-Bank中不可能有两个打开的行(S-AMP只能为一行服务),这就限制了可同时打开的页面总数。以SDRAM有4个L-Bank,北桥最多支持8个P-Bank为例,理论上最多只能有32个页面能同时处于打开的状态。而如果只有一个P-Bank,那么就只剩下4个页面,因为有几个L-Bank才能有同时打开几个行而互不干扰。Intel 845的MHC虽然可以支持24个打开的页面,那也是指6个P-Bank的情况下(845MCH只支持6个P-Bank)。可见845已经将同时打开页数发挥到了极致。
不过,同时打开页数多了,也对存取策略提出了一定的要求。理论上,要尽量多地使用已打开的页来保证最短的延迟周期,只有在数据不存在(读取时)或页存满了(写入时)再考虑打开新的指定页,这也就是变向的连续读/写。而打开新页时就必须要关闭一个打开的页,如果此时打开的页面已是北桥所支持的最大值但还不到理论极限的话,就需要一个替换策略,一般都是用LRU算法来进行,这与VIA的交错控制大同小异。

所谓的影响性能是并不是指SDRAM的带宽,频率与位宽固定后,带宽也就不可更改了。但这是理想的情况,在内存的工作周期内,不可能总处于数据传输的状态,因为要有命令、寻址等必要的过程。但这些操作占用的时间越短,内存工作的效率越高,性能也就越好。
非数据传输时间的主要组成部分就是各种延迟与潜伏期。通过上文的讲述,大家应该很明显看出有三个参数对内存的性能影响至关重要,它们是tRCD、CL和tRP。每条正规的内存模组都会在标识上注明这三个参数值,可见它们对性能的敏感性。

以内存最主要的操作——读取为例。tRCD决定了行寻址(有效)至列寻址(读/写命令)之间的间隔,CL决定了列寻址到数据进行真正被读取所花费的时间,tRP则决定了相同L-Bank中不同工作行转换的速度。现在可以想象一下读取时可能遇到的几种情况(分析写入操作时不用考虑CL即可):
1、要寻址的行与L-Bank是空闲的。也就是说该L-Bank的所有行是关闭的,此时可直接发送行有效命令,数据读取前的总耗时为tRCD+CL,这种情况我们称之为页命中(PH,Page Hit)。
2、要寻址的行正好是前一个操作的工作行,也就是说要寻址的行已经处于选通有效状态,此时可直接发送列寻址命令,数据读取前的总耗时仅为CL,这就是所谓的背靠背(Back to Back)寻址,我们称之为页快速命中(PFH,Page Fast Hit)或页直接命中(PDH,Page Direct Hit)。
3、要寻址的行所在的L-Bank中已经有一个行处于活动状态(未关闭),这种现象就被称作寻址冲突,此时就必须要进行预充电来关闭工作行,再对新行发送行有效命令。结果,总耗时就是tRP+tRCD+CL,这种情况我们称之为页错失(PM,Page Miss)。
显然,PFH是最理想的寻址情况,PM则是最糟糕的寻址情况。上述三种情况发生的机率各自简称为PHR——PH Rate、PFDR——PFH Rate、PMR——PM Rate。因此,系统设计人员(包括内存与北桥芯片)都尽量想提高PHR与PFHR,同时减少PMR,以达到提高内存工作效率的目的。

SDRAM的寻址知识及重要的参数:

在嵌入式行业中,经常会碰到有人问如果将开发板上32M的SDRAM换成64M的SDRAM硬件需不需要改动。答案是:不需什么改动。由于当时刚进入这个行业,对这个答案一直很迷惑,

板上用的是现代的sdram芯片4M×16b×4Bank,即32MB,按理说应该有25根地址线,但芯片上只提供了13根地址线,2根bank选择线(BA0,BA1),两个片选信号,这怎么寻址啊?

今天碰巧又碰到这个问题,俗话说事不过三,心一横,今天非把这个问题搞明白不可。功夫不负有心人,终于参考网上的一些SDRAM的资料把问题砌底搞明白了,现分享如下:

SDRAM的究竟是怎么寻址的?

    SDRAM的内部是一个存储阵列,将数据“填”进去,你可以它想象成一张表格。和表格的检索原理一样,先指定一个行(Row),再指定一个列(Column),我们就可以准确地找到所需要的单元格,这就是内存芯片寻址的基本原理。对于内存,这个单元格可称为存储单元,那么这个表格(存储阵列)叫什么呢?它就是逻辑Bank(Logical Bank,下文简称L-Bank)。

    SDRAM内部L-Bank示意图,这是一个8X8的阵列,B代表L-Bank地址编号,C代表列地址编号,R代表行地址编号。如果寻址命令是B1、R2、C6,就能确定地址是图中红格的位置

    目前的内存芯片基本上都是4个L-Bank设计,也就是说一共有4个这样的“表格”。寻址的流程也就是——先指定L-Bank地址,再指定行地址,然后指列地址最终的确寻址单元。


    在实际工作中,L-Bank地址与相应的行地址是同时发出的,此时这个命令称之为“行有效”或“行激活”(Row Active)。在此之后,将发送列地址寻址命令与具体的操作命令(是读还是写),这两个命令也是同时发出的,所以一般都会以“读/写命令”来表示列寻址。根据相关的标准,从行有效到读/写命令发出之间的间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟,RAS就是行地址选通脉冲,CAS就是列地址选通脉冲),大家也可以理解为行选通周期。tRCD是SDRAM的一个重要时序参数,可以通过主板BIOS经过北桥芯片进行调整。广义的tRCD以时钟周期(tCK,Clock Time)数为单位,比如tRCD=2,就代表延迟周期为两个时钟周期,具体到确切的时间,则要根据时钟频率而定,对于PC100 SDRAM(时钟频率等同于DDR-200),tRCD=2,代表20ns的延迟,对于PC133(时钟频率等于DDR-266)则为15ns。


图中显示的是tRCD=3

    接下来,相关的列地址被选中之后,将会触发数据传输,但从存储单元中输出到真正出现在内存芯片的 I/O 接口之间还需要一定的时间(数据触发本身就有延迟,而且还需要进行信号放大),这段时间就是非常著名的 CL(CAS Latency,列地址脉冲选通潜伏期)。CL 的数值与 tRCD 一样,以时钟周期数表示。如 DDR-400,时钟频率为 200MHz,时钟周期为 5ns,那么 CL=2 就意味着 10ns 的潜伏期。不过 ,CL 只是针对读取操作,对于 SDRAM,写入是没有潜伏期的,对于 DDR SDRAM,写入潜伏期在 0.75 至 1.25 个时针周期之间。


图中标准CL=2,tAC是有关内部信号处理的周期,可以不用关心

    目前内存的读写基本都是连续的,因为与CPU交换的数据量以一个Cache Line(即CPU内Cache的存储单位)的容量为准,一般为64字节。而现有的P-Bank位宽为8字节,那么就要一次连续传输8次,这就涉及到我们也经常能遇到的突发传输的概念。突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输的周期数就是突发长度(Burst Lengths,简称BL)。

    在进行突发传输时,只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读/写操作而不再需要控制器连续地提供列地址(SDRAM与DDR SDRAM的突发传输对列寻址的操作数量有所不同,在此不再细说)。这样,除了第一笔数据的传输需要若干个周期(主要是之前的延迟,一般的是tRCD+CL)外,其后每个数据只需一个周期的即可获得。


    突发连续读取模式:只要指定起始列地址与突发长度,后续的寻址与数据的读取自动进行,而只要控制好两段突发读取命令的间隔周期(与BL相同)即可做到连续的突发传输。

    在数据读取完之后,为了腾出读出放大器以供同一L-Bank内其他行的寻址并传输数据,内存芯片将进行预充电的操作来关闭当前工作行。还是以上面那个L-Bank示意图为例。当前寻址的存储单元是B1、R2、C6。如果接下来的寻址命令是B1、R2、C4,则不用预充电,因为读出放大器正在为这一行服务。但如果地址命令是B1、R4、C4,由于是同一L-Bank的不同行,那么就必须要先把R2关闭,才能对R4寻址。从开始关闭现有的工作行,到可以打开新的工作行之间的间隔就是tRP(Row Precharge command Period,行预充电有效周期),单位也是时钟周期数。


    本图为一个完整的从行寻址到行关闭的时序图,图中所表示的tRCD=2、CL=2、tRP=2

实例分析:

有了以上知识后,就很容易理解了,现就以HY57V561620片子说明吧。

从芯片的数据手册中可以得知:4M×16b×4Bank,即共32MB,提供了13根地址线(行地址线RA0-RA12,列地址线CA0-CA8行列地址线共用),2根bank选择线(BA0,BA1)。

2根bank选择线(BA0,BA1)即可以选4个Bank,即我们可以分析其中一个Bank就可。

一个Bank是4Mx16bit,需23根地址线。按照上面寻址方式即:1个Bank的空间=行地址能访问的空间 X列地址能访问的空间。

                     1个Bank的大小=213 x 29= 222。

只有22根,怎么还差一根。J (呵呵)

这是因为芯片是以半字为一个存储单元的。也就是一次两个字,所以222 x 2=223.即可访遍整个Bank.

本文详细出处:http://www.52rd.com/blog/Detail_RD.Blog_hndeng06_11206.html

/***********************************************************************************/

SDRAM的工作原理、控制时序、及相关控制器的配置方法一直是嵌入式系统学习、开发过程中的一个难点。掌握SDRAM的知识对硬件设计、编写系统启动代码、提高系统存取效率、电源管理都有一定的意义。本文想通过:

1.SDRAM的工作原理。
        2.HY57V561620 SDRAM介绍。
        3.S3C2410和HY57V561620的接线方法。
        4.S3C2410 SDRAM控制器的配置方法。
        5.SDRAM控制时序分析

这5个方面来帮助初学者了解SDRAM。文章分为2篇,第1篇讲解前3个知识点,第2篇讲解后2个。

一、SDRAM的工作原理

SDRAM之所以成为DRARM就是因为它要不断进行刷新(Refresh)才能保留住数据,因此它是DRAM最重要的操作。

那么要隔多长时间重复一次刷新呢?目前公认的标准是,存储体中电容的数据有效保存期上限是64ms(毫秒,1/1000秒),也就是说每一行刷新的循环周期是64ms。这样刷新速度就是:行数量/64ms。我们在看内存规格时,经常会看到4096 Refresh Cycles/64ms或8192 Refresh Cycles/64ms的标识,这里的4096与8192就代表这个芯片中每个Bank的行数。刷新命令一次对一行有效,发送间隔也是随总行数而变化,4096行时为15.625μs(微秒,1/1000毫秒),8192行时就为7.8125μs。HY57V561620为8192 refresh cycles / 64ms。

SDRAM是多Bank结构,例如在一个具有两个Bank的SDRAM的模组中,其中一个Bank在进行预充电期间,另一个Bank却马上可以被读取,这样当进行一次读取后,又马上去读取已经预充电Bank的数据时,就无需等待而是可以直接读取了,这也就大大提高了存储器的访问速度。
为了实现这个功能,SDRAM需要增加对多个Bank的管理,实现控制其中的Bank进行预充电。在一个具有2个以上Bank的SDRAM中,一般会多一根叫做BAn的引脚,用来实现在多个Bank之间的选择。
SDRAM具有多种工作模式,内部操作是一个复杂的状态机。SDRAM器件的引脚分为以下几类。

(1)控制信号:包括片选、时钟、时钟使能、行列地址选择、读写有效及数据有效。
        (2)地址信号:时分复用引脚,根据行列地址选择引脚,控制输入的地址为行地址或列地址。。
        (3)数据信号:双向引脚,受数据有效控制。

SDRAM的所有操作都同步于时钟。根据时钟上升沿控制管脚和地址输入的状态,可以产生多种输入命令。

        模式寄存器设置命令。
                激活命令。
                预充命令。
                读命令。
                写命令。
                带预充的读命令。
                带预充的写命令。
                自动刷新命令。
                自我刷新命令。
                突发停命令。
                空操作命令。

根据输入命令,SDRAM状态在内部状态间转移。内部状态包括模式寄存器设置状态、激活状态、预充状态、写状态、读状态、预充读状态、预充写状态、自动刷新状态及自我刷新状态。
SDRAM支持的操作命令有初始化配置、预充电、行激活、读操作、写操作、自动刷新、自刷新等。所有的操作命令通过控制线CS#、RAS#、CAS#、WE#和地址线、体选地址BA输入。

1、行激活

行激活命令选择处于空闲状态存储体的任意一个行,使之进入准备读/写状态。从体激活到允许输入读/写命令的间隔时钟节拍数取决于内部特征延时和时钟频率。HY57V561620内部有4个体,为了减少器件门数,4个体之间的部分电路是公用的,因此它们不能同时被激活,而且从一个体的激活过渡到另一个体的激活也必须保证有一定的时间间隔。

2、预充电

预充电命令用于对已激活的行进行预充电即结束活动状态。预充电命令可以作用于单个体,也可以同时作用于所有体(通过所有体预充电命令)。对于猝发写操作必须保证在写入预充电命令前写操作已经完成,并使用DQM禁止继续写入数据。预充电结束后回到空闲状态,也可以再次被激活,此时也可以输入进入低功耗、自动刷新、自刷新和模式设置等操作命令。

预充电中重写的操作与刷新操作一样,只不过预充电不是定期的,而只是在读操作以后执行的。因为读取操作会破坏内存中的电荷。因此,内存不但要每64ms刷新一次,而且每次读操作之后还要刷新一次。

3、自动预充电

如果在猝发读或猝发写命令中,A10/AP位置为“1”,在读写操作完成后自动附加一个预充电动作。操作行结束活动状态,但在内部状态机回到空闲态之前不能给器件发送新的操作命令。

4、猝发读

猝发读命令允许某个体中的一行被激活后,连续读出若干个数据。第一个数据在经过指定的CAS延时节拍后呈现在数据线上,以后每个时钟节拍都会读出一个新的数据。猝发读操作可以被同体或不同体的新的猝发读/写命令或同一体的预充电命令及猝发停止命令中止。

5、猝发写

猝发写命令与猝发读命令类似,允许某个体中的一行被激活后,连续写入若干个数据。第一个写数据与猝发写命令同时在数据线上给出,以后每个时钟节拍给出一个新的数据,输入缓冲在猝发数据量满足要求后停止接受数据。猝发写操作可以被猝发读/写命令或DQM数据输入屏蔽命令和预充电命令或猝发停止命令中止。

6、自动刷新

由于动态存储器存储单元存在漏电现象,为了保持每个存储单元数据的正确性,HY57V561620必须保证在64ms内对所有的存储单元刷新一遍。一个自动刷新周期只能刷新存储单元的一个行,每次刷新操作后内部刷新地址计数器自动加“1”。只有在所有体都空闲(因为4个体的对应行同时刷新)并且未处于低功耗模式时才能启动自动刷新操作,刷新操作执行期间只能输入空操作,刷新操作执行完毕后所有体都进入空闲状态。该器件可以每间隔7.8μs执行一次自动刷新命令,也可以在64ms内的某个时间段对所有单元集中刷新一遍。

7、自刷新

自刷新是动态存储器的另一种刷新方式,通常用于在低功耗模式下保持SDRAM的数据。在自刷新方式下,SDRAM禁止所有的内部时钟和输入缓冲(CKE除外)。为了降低功耗,刷新地址和刷新时间全部由器件内部产生。一旦进入自刷新方式只有通过CKE变低才能激活,其他的任何输入都将不起作用。给出退出自刷新方式命令后必须保持一定节拍的空操作输入,以保证器件完成从自刷新方式的退出。如果在正常工作期间采用集中式自动刷新方式,则在退出自刷新模式后必须进行一遍(对于HY57V561620来说,8192个)集中的自动刷新操作。

8、时钟和时钟屏蔽

时钟信号是所有操作的同步信号,上升沿有效。时钟屏蔽信号CKE决定是否把时钟输入施加到内部电路。在读写操作期间,CKE变低后的下一个节拍冻结输出状态和猝发地址,直到CKE变高为止。在所有的体都处于空闲状态时,CKE变低后的下一个节拍SDRAM进入低功耗模式并一直保持到CKE变高为止。

9、DQM操作

DQM用于屏蔽输入输出操作,对于输出相当于开门信号,对于输入禁止把总线上的数据写入存储单元。对读操作DQM延迟2个时钟周期开始起作用,对写操作则是当拍有效。

HY57V561620命令表如下图所示:

二、HY57V561620 SDRAM介绍

1、HY57V561620的结构

HY57V561620存储容量为4M×4bank×16位(32M字节),工作电压为3.3V,常见封装为54脚TSOP,兼容LVTTL接口,支持自动刷新(Auto-Refresh)和自刷新(Self-Refresh),16位数据宽度。

HY57V561620引脚分布如图2-1所示。

HY57V561620引脚信号描述

更具体的内容可参考HY57V561620的用户手册。

三、S3C2410和HY57V561620的接线方法
华清远见教学用的S3C2410开发板上使用的SDRAM的型号是HY57561620。规格是:
4Banks*4M*16Bit。采用两片SDRAM组成32位64M的内存空间。

1、确定BA0、BA1的接线

在S3C2410的Table 5-2. SDRAM Bank Address Configuration给出了SDRAM接线的参考方法。

上表中各段含义及和我们平台的对应:

Bank Size: 每个Bank的大小 (HY57561620是4M*16=64MB)Bus Width: 总线宽度 (两颗HY57561620,32位)
        Base Component:个体容量 (256Mb)
        Memory Configration:内存配置 ((4M*16*4banks)*2ea )

所以Bank Address对应A[25:24],此处确定了HY57561620的BA0和BA1和S3C2410之间的接线。

2、确定其它接线

上图是S3C2410手册中给出的参考接线,通过这个图可以确定HY57561620和S3C2410之间除BA0、BA1的所有其它接线。本例中,详细的接线方法如“接线原理图”小节。

3、接线原理图

引脚描述如下:

nSRAS:SDRAM行地址选通信号
        nSCAS:SDRAM列地址选通信号
        nGCS6:SDRAM芯片选择信号(选用Bank6作为sdram空间,也可以选择Bank7)
        nWBE[3:0]:SDRAM数据屏蔽信号
        SCLK0[1]:SDRAM时钟信号
        SCKE:SDRAM时钟允许信号
        DATA[0:31]:32位数据信号
        ADDR[2:14]:行列地址信号

ADDR[25:24]:bank选择线

 本文出处:http://blog.csdn.net/hongtao_liu/archive/2009/10/29/4741151.aspx

posted @ 2011-04-25 16:29  dangg  阅读(3251)  评论(0编辑  收藏  举报