1.DDR3简介
DDR3 SDRAM,全称第三代双倍速率同步动态随机存取存储器,简称 DDR3,双倍速率(double-data-rate),是指时钟的上升沿和下降沿都发生数据传输;同步,是指DDR3数据的读取写入是按时钟同步的;动态,是指DDR3中的数据掉电无法保存,且需要周期性的刷新,才能保持数据;随机,是指可以随机操作任一地址的数据。DDR3是当今较为常见的一种储存器,在计算机及嵌入式产品中得到广泛应用,特别是应用在涉及到大量数据交互的场合,比如电脑的内存条。其具有以下特点:1.掉电无法保存数据,需要周期性的刷新。2.时钟上升沿和下降沿都会传输数据。3.突发传输,突发长度Burst Length一般为8。当数据存入DDR3时先指定一个bank地址,再指定行地址,最后指定列地址。因此DDR3的存储容量计算公式为bank数×行数×列数×存储单元容量。举个例子,bank address位宽为3,Row address位宽为14,Column address为10,所以它的地址大小等于即 2^3* 2^14* 2^10=2^27=128M,数据位宽为16bit,所以容量大小为 128M*16bit,也就是 256MByte。
-
2.DDR3结构与原理
-
2.1DDR3结构解析
以我板子上的MT41K256M16TW-107 IT为例进行介绍,该芯片容量为512Mb,数据接口是 16bit,内存数据主频高达 1600MHZ,数据带宽可达 1600MHz*64bit。其模块组成如下图所示。
各端口的功能如下:
A[14:13], A12/BC#, A11, A10/AP, A[9:0]:地址输入——为ACTIVATE命令提供行地址,为READ/WRITE命令提供列地址和自动预充电位(A10),以便从某个bank的内存阵列中选择一个位置。在PRECHARGE命令期间采样的A10决定PRECHARGE是否适用于一个bank(A10 LOW,由BA[2:0]选择bank)或所有bank(A10 HIGH)。地址输入还提供LOAD MODE命令期间的操作码。地址输入被引用到VREFCA。A12/ BC#:当在模式寄存器(MR)中启用时,在READ和WRITE命令期间对A12进行采样,以确定是否执行突发切碎(动态)(HIGH = BL8或无突发切碎,LOW = BC4)。
BA[2:0]:bank地址输入——BA[2:0]定义了激活、读、写或预充值命令被应用到的bank。BA[2:0]定义在LOAD mode命令期间加载哪个模式寄存器(MR0, MR1, MR2或MR3)。BA[2:0]的参考是VREFCA。
CK, CK#:时钟——CK和CK#是差分时钟输入。所有的控制和地址输入信号都在CK的正沿和CK#的负沿的交叉处采样。输出数据频闪(DQS, DQS#)参考CK和CK#的交叉点。
CKE:时钟使能——CKE使能(高电平)和禁用(低电平) DRAM内部电路和时钟。启用/禁用的具体电路取决于DDR3 SDRAM配置和工作模式。取CKE LOW提供PRECHARGE下电和SELF REFRESH操作(所有bank空闲),或有效掉电(在任何bank中都是行有效)。CKE对于断电进入和退出以及自刷新进入都是同步的。对于自刷新退出,CKE是异步的。掉电期间,输入缓冲区(不包括CK、CK#、CKE、RESET#和ODT)被禁用。在SELF REFRESH期间禁用输入缓冲区(不包括CKE和RESET#)。CKE的参考是VREFCA。
CS#:片选信号——CS#使能(低)和禁止(高)命令解码器。当CS#为HIGH时,所有命令都被屏蔽。CS#为具有多个等级的系统提供了外部等级选择。CS#被认为是命令代码的一部分。CS#的参考是VREFCA。
LDM:输入数据掩码——LDM是一个低字节,用于写入数据的输入掩码信号。在写数据期间,当LDM与输入数据一起被HIGH采样时,低字节的输入数据被屏蔽。虽然LDM球只有输入,但LDM负载的设计与DQ和DQS球的负载相匹配。LDM的参考是VREFCA。
ODT:片上终止——ODT使能(高)和禁用(低) DDR3 SDRAM内部的终止电阻。当在正常操作中启用时,ODT仅应用于以下模块:DQ[15:0],LDQS, LDQS#,UDQS, UDQS#,LDM和x16的UDM;DQ0[7:0],DQS, DQS#,DM/TDQS, NF/TDQS#(当TDQS开启时);DQ[3:0],DQS, DQS#和DM用于x4。如果通过LOAD MODE命令禁用ODT输入,则忽略该输入。ODT的参考是VREFCA。
RAS#, CAS#, WE#:命令输入——RAS#、CAS#和WE#(以及CS#)定义要输入的命令,并引用到VREFCA。
RESET#:复位信号——Reset #是参考VSS的有源LOW CMOS输入。RESET#输入接收器是一个CMOS输入,定义为直流HIGH 0.8 × VDD和直流LOW 0.2 × VDDQ的轨对轨信号。断言是异步的。
UDM:输入数据掩码——UDM是一个上字节,写数据的输入掩码信号。当UDM与WRITE访问期间的输入数据一起被采样为HIGH时,上字节输入数据被屏蔽。虽然UDM球仅用于输入,但UDM加载的设计与DQ和DQS球的加载相匹配。UDM的参考是VREFCA。
DQ[7:0]:数据输入/输出——用于x16配置的双向数据总线的低字节。DQ[7:0] 的参考是VREFCA。
DQ[15:8]:数据输入/输出——用于x16配置的双向数据总线的上字节。DQ[15:8] 的参考是VREFCA。
LDQS, LDQS#:低字节数据频闪——带读数据的输出。与读数据边对齐。带写数据的输入。居中对齐以写入数据。
UDQS, UDQS#:高字节数据频闪——带读数据的输出。与读数据边对齐。带写数据的输入。DQS在写数据时居中对齐。
ZQ:输出驱动校准的外部参考,应连接240ohm到VSSQ。
2.2存储原理
存储原理示意图:行选与列选信号将使存储电容与外界间的传输电路导通,从而可进行放电(读取)与充电(写入)。另外,图中刷新放大器的设计并不固定,目前这一功能被并入读出放大器(Sense Amplifier ,简称S-AMP);
-
2.3SDRAM初始化
DDR3 SDRAM必须以预定义的方式通电和初始化。64Mb SDRAM在Vdd和Vddq(同时)通电后初始化,并且时钟在DQM高和CKE高时稳定。在发出命令禁止或NOP以外的任何命令之前,需要100µs延迟。禁止或NOP命令可在100µs期间应用,并应至少持续到该期间结束。至少应用了一个命令禁止或NOP命令,一旦满足100µs延迟,应用预充电命令。所有bank都必须预充电。这将使所有bank处于空闲状态,之后必须执行至少两个自动刷新周期。自动刷新周期完成后,SDRAM即可进行模式寄存器编程。模式寄存器应在应用任何操作命令之前加载,因为它将在未知状态下通电。在加载模式寄存器命令之后,必须在任何命令之前至少发送一个NOP命令。下图为初始化时序图:
- Prefetch
所谓prefetch,就是预加载,这是DDR时代提出的技术。在SDR中,并没有这一技术,所以其每一个cell的存储容量等于DQ的宽度(芯片数据IO位宽)。DDR是两位预取(2-bit Prefetch),有的公司则贴切的称之为2-n Prefetch(n代表芯片位宽)。DDR2是四位预取(4-bit Prefetch),DDR3和DDR4都是八位预取(8-bit Prefetch)。而8-bit Prefetch可以使得内核时钟是DDR时钟的四分之一,这也是Prefetch的根本意义所在。预取的本质上是并串转换,通过并行方式提前取得数据再串行输出,这也符合“预取”的字面含义,即“把数据提前取出”。
-
2.4自刷新模式
对于DRAM大家都知道是使用电容存储电荷的,优势是使用的元器件较少,有得必有失,结果就是电容会放电,过一段时间电容存储的电荷会丢失,为了防止电容存储的电荷丢失,就是在电容存储器还没有丢失的时候把他存储的数据读出来,在重新写进去,这样电容存储的电荷又可以保存这样一段时间了,这个操作就被称为自刷新;自刷新操作不需要指定行列地址,芯片内会对地址自动替换,每次刷新一行,目前认为64ms电容的数据就会丢失,所以需要保证在64ms内对bank内所有单元均完成一次自刷新;此SDRAM一个bank有4096行,所以需要64ms/4096发送一个自刷新指令
-
2.5模式寄存器配置
模式寄存器(MR0-MR3)用于定义DDR3 SDRAM的各种可编程操作模式。模式寄存器在初始化过程中通过模式寄存器设置(MRS)命令编程,它保留存储的信息(MR0[8]除外,它是自清除的),直到它被重新编程,RESET#变为LOW,设备断电。模式寄存器的内容可以通过重新执行MRS命令来改变。即使用户只想修改模式寄存器变量的一个子集,在发出MRS命令时也必须对所有变量进行编程。重新编程模式寄存器不会改变内存数组的内容,只要正确执行即可。MRS命令只能在所有银行空闲并处于预充值状态(满足RP且没有正在进行的数据突发)时发出(或重新发出)。MRS命令发出后,必须满足两个参数:t MRD和t MOD。控制器必须等待t MRD后才能发起后续的MRS命令。
突发长度由MR0定义[1:0]。对DDR3 SDRAM的读写访问是面向突发的,突发长度可编程为4(剁)模式,8(固定)模式,或在Read / write命令期间使用A12进行选择(动态)。突发长度决定了对于给定的READ或WRITE命令可以访问的列位置的最大数量。当READ/WRITE命令设置MR0[1:0]为01时,如果A12 = 0,则选择BC4模式。如果A12 = 1,则选择BL8模式。
-
2.6预充电
预充电预充电命令用于停用特定bank中的空行或所有bank中的空行。在发出预充电命令后的某个指定时间(trp),该bank将可用于后续行访问。输入A10确定是否对一个或所有bank进行预充电,如果只对一个bank进行预充电,输入BA0、BA1选择bank。当所有bank都要预充电时,输入BA0、BA1被视为“不在乎”。一旦bank已预充电,它将处于空闲状态,并且必须在向该bank出任何读或写命令之前激活。
2.7自刷新
SELF REFRESH命令用于保留DRAM中的数据,即使系统其余部分断电。当处于自刷新模式时,DRAM保留数据而不需要外部时钟。自刷新模式也是一种方便的方法,用于启用/禁用DLL以及在允许的同步操作范围内更改时钟频率。所有电源输入(包括VREFCA和VREFDQ)必须在进入/退出和自我刷新模式操作期间保持在有效水平。VREFDQ可能浮动或不驱动VDDQ/2,而在自我恢复。
2.8时钟频率与传输速率
关于DDR的时钟频率相关参数主要有如下三种:
- 内部时钟频率: 核心频率,用于DDR内部cell(存储单元)的时钟
- 外部时钟频率:时钟频率,用于DDR的IO buffer的时钟,同时也是IO接口时钟,是通过核心频率倍频4倍得到
- 数据传输率:数据速率,单根数据线的数据传送次数
外部时钟频率=数据传输率/2。因为DDR是利用时钟的上升沿与下降沿均传输数据,所以DDR芯片的工作频率(时钟引脚的频率)为等效频率(传输频率)的一半
内部时钟频率=数据传输率/DDR的数据预取位数。对于DDR来说,预取数为2;对于DDR2来说,预取数为4;对于DDR3来说,预取数为8。
从part number中的speed 选项可知,-125 所支持的最小时钟周期 tCK = 1.25ns,对应芯片支持的最大 IO 时钟频率为 800MHz。
不同速度等级对应的时间参数如下:
表中data rate为单数据线的数据速率,DDR为双边沿传输,因此 -125 对应 1600 MT/s(Mega Transfers/s),有时也对应称此内存为 DDR3-1600
那么这片16位数据线内存的带宽为:1600MT/s∗16bit=25600Mbit/s=3200MB/s
3.DDR3工作时序
在实际工作中,Bank地址与相应的行地址是同时发出的,此时这个命令称之为“行激活”(Row Active)。在此之后,将发送列地址寻址命令与具体的操作命令(是读还是写),这两个命令也是同时发出的,所以一般都会以“读/写命令”来表示列寻址。根据相关的标准,从行有效到读/写命令发出之间的间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟,RAS就是行地址选通脉冲,CAS就是列地址选通脉冲),我们可以理解为行选通周期。tRCD是DDR的一个重要时序参数,广义的tRCD以时钟周期(tCK,Clock Time)数为单位,比如tRCD=3,就代表延迟周期为两个时钟周期,具体到确切的时间,则要根据时钟频率而定,DDR3-800,tRCD=3,代表30ns的延迟。
接下来,相关的列地址被选中之后,将会触发数据传输,但从存储单元中输出到真正出现在内存芯片的 I/O 接口之间还需要一定的时间(数据触发本身就有延迟,而且还需要进行信号放大),这段时间就是非常著名的 CL(CAS Latency,列地址脉冲选通潜伏期)。CL 的数值与 tRCD 一样,以时钟周期数表示。如 DDR3-800,时钟频率为 100MHz,时钟周期为 10ns,如果 CL=2 就意味着 20ns 的潜伏期。不过CL只是针对读取操作。
由于芯片体积的原因,存储单元中的电容容量很小,所以信号要经过放大来保证其有效的识别性,这个放大/驱动工作由S-AMP负责,一个存储体对应一个S- AMP通道。但它要有一个准备时间才能保证信号的发送强度(事前还要进行电压比较以进行逻辑电平的判断),因此从数据I/O总线上有数据输出之前的一个时钟上升沿开始,数据即已传向S-AMP,也就是说此时数据已经被触发,经过一定的驱动时间最终传向数据I/O总线进行输出,这段时间我们称之为 tAC(Access Time from CLK,时钟触发后的访问时间)。
3.1读时序
目前内存的读写基本都是连续的,因为与CPU交换的数据量以一个Cache Line(即CPU内Cache的存储单位)的容量为准,一般为64字节。而现有的Rank位宽为8字节(64bit),那么就要一次连续传输8次,这就涉及到我们也经常能遇到的突发传输的概念。突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输的周期数就是突发长度(Burst Lengths,简称BL)。
在进行突发传输时,只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读/写操作而不再需要控制器连续地提供列地址。这样,除了第一笔数据的传输需要若干个周期(主要是之前的延迟,一般的是tRCD+CL)外,其后每个数据只需一个周期的即可获得。
非突发连续读模式
非突发连续读取模式:不采用突发传输而是依次单独寻址,此时可等效于BL=1,虽然可以让数据是连续的传输,但每次都要发送列地址与命令信息,控制资源占用极大。
突发连续读取模式:只要指定起始列地址与突发长度,后续的寻址与数据的读取自动进行,而只要控制好两段突发读取命令的间隔周期(与BL相同)即可做到连续的突发传输。举个例子,当BL=8时,原本读取8次数据需要发送8次地址,但在突发连续读取模式下只需要发送一次数据地址即可。
突发连续读模式(BL8)
突发连续读模式(BC4)
3.2写时序
WRITE突发由WRITE命令发起。使用WRITE命令提供起始列和银行地址,并为该访问启用或禁用自动预充电。如果选择了自动预充,则在WRITE突发结束时预充正在访问的行。如果未选择自动预充,则该行将保持打开状态以供后续访问。在发出WRITE命令后,WRITE突发可能不会中断。
在WRITE命令中,通过MR0[1:0] = 00或MR0[1:0] = 01和A12 = 1激活BL8设置T0和T4。
突发连续写模式(BL8)
在T0和T4的WRITE命令中,MR0[1:0] = 01和A12 = 0激活BC4设置
突发连续写模式(BC4)
-
3.3数据掩码
谈到了突发长度时。如果BL=4,那么也就是说一次就传送4×64bit的数据。但是,如果其中的第二笔数据是不需要的,怎么办?还都传输吗?为了屏蔽不需要的数据,人们采用了数据掩码(Data I/O Mask,简称DQM)技术。通过DQM,内存可以控制I/O端口取消哪些输出或输入的数据。这里需要强调的是,在读取时,被屏蔽的数据仍然会从存储体传出,只是在“掩码逻辑单元”处被屏蔽。DQM由北桥控制,为了精确屏蔽一个P-Bank位宽中的每个字节,每个DIMM有8个DQM 信号线,每个信号针对一个字节。这样,对于4bit位宽芯片,两个芯片共用一个DQM信号线,对于8bit位宽芯片,一个芯片占用一个DQM信号,而对于 16bit位宽芯片,则需要两个DQM引脚。
读取时数据掩码操作,DQM在两个周期后生效,突发周期的第二笔数据被取消。写入时数据掩码操作,DQM立即生效,突发周期的第二笔数据被取消。
在数据读取完之后,为了腾出读出放大器以供同一Bank内其他行的寻址并传输数据,内存芯片将进行预充电的操作来关闭当前工作行。举个例子,当前寻址的存储单元是B1、R2、C6。如果接下来的寻址命令是B1、R2、C4,则不用预充电,因为读出放大器正在为这一行服务。但如果地址命令是B1、R4、C4,由于是同一Bank的不同行,那么就必须要先把R2关闭,才能对R4寻址。从开始关闭现有的工作行,到可以打开新的工作行之间的间隔就是tRP(Row Precharge command Period,行预充电有效周期),单位也是时钟周期数。
3.4DQS
DQS 是DDR中的重要功能,它的功能主要用来在一个时钟周期内准确的区分出每个传输周期,并便于接收方准确接收数据。每一颗芯片都有一个DQS信号线,它是双向的,在写入时它用来传送由北桥发来的DQS信号,读取时,则由芯片生成DQS向北桥发送。完全可以说,它就是数据的同步信号。
DDR SDRAM芯片增加了DQS选通脉冲信号,该信号在SDRAM中是不存在的。每个字节的数据对应一个DQS信号,对于16位数据线的芯片来说,每次传输两个字节数据,所以就有LDQS和UDQS信号。主要用来在一个时钟周期内准确区分出每个传输周期,并便于接收方准确接收数据。
DQS是双向信号,与DQ数据信号双向同步。在读取DDR数据时,DQS与数据信号同时生成(在CK与CK#的交叉点)。而DDR中的CL指从CAS发出到DQS生成的间隔,如下图所示,数据真正出现在数据I/O总线上相对于DQS触发的时间间隔被称为tAC。注意,DDR的tAC与SDRAM的tAC含义不同。
实际上,DQS生成时,芯片内部的预取已经完毕了,tAC指数据输出时间,由于预取的原因,实际的数据传出可能会提前于DQS产生(数据提前于DQS传出)。
如下图所示,向DDR写入数据时,DQS的边沿与DQ的中部对齐,此时数据线上的数据会比较稳定,DDR可以在DQS的边沿将DQ的数据存储。
-
3.5.ZQ校准与参考电压
ZQ也是一个新增的脚,该引脚需要连接240Ω的低公差参考电阻。这个引脚利用内置的片上校准引擎(On-Die Calibration Engine,ODCE)执行一系列指令,以自动检测并调整数据输出驱动器的导通电阻和ODT(On-Die Termination)的终结电阻值,确保数据传输的准确性。
DDR3定义了ZQCL和ZQCS两个ZQ校准命令,ZQ校准时序如下所示。当系统发出这一指令后,将用相应的时钟周期(在加电与初始化之后用512个时钟周期,在退出自刷新操作后用256个时钟周期、在其他情况下用64个时钟周期)对导通电阻和ODT电阻进行重新校准。
在向DDR3发出ZQCL或ZQCS命令之前,必须对所有存储体进行预充电且必须满足tRP。在tZQinit或tZQoper持续时间内,控制器不能在DDR3通道上执行任何其他活动。
DDR3中参考电压分为命令与地址信号的参考电压(VREFCA)和数据总线参考电压(VREFDQ),有效的提高系统数据总线的信噪等级,抗干扰能力更强。
DDR3的内容还是比较多且复杂的,如有不对的地方还请大家批评指正。
参考资料:
DDR扫盲——DDR的特性分析-Felix-电子技术应用-AET-中国科技核心期刊-最丰富的电子设计资源平台 (chinaaet.com)
DDR扫盲—-关于Prefetch(预取)与Burst(突发)的深入讨论_ddr 预取-CSDN博客