DDR SDRAM 全称为 Double Data Rate SDRAM,中文名为“双倍数据流 SDRAM”。DDR SDRAM 在原有的 SDRAM的基础上改进而来。下图是DDR和SDRAM的数据传输对比图
图上可以清楚的看到,DDR SDRAM可在一个时钟周期内传送两次数据,上升沿传一次,下降沿传一次。
1.DDR的基本原理
先来看一张DDR读操作时序图
从中可以发现它多了两个信号:CLK#与DQS,CLK#与正常 CLK 时钟相位相反,形成差分时钟信号。而数据的传输在 CLK 与 CLK#的交叉点进行,可见在 CLK 的上升与下降沿(此时正好是 CLK#的上升沿)都有数据被触发,从而实现双倍数据传输,也就是DDR。下面来看DDR的内部结构图的SDRAM有什么不同。
这也是一颗 128Mbit 的内存芯片,标称规格为 32×4bit,右边红框区域就是DDR不同的地方:首先就是内部的L-Bank 规格。SDRAM 中L-Bank 存储单元的容量与芯片位宽相同,但在DDR SDRAM 中并不是这样,存储单元的容量是芯片位宽的一倍,所以在此不能再套用讲解 SDRAM时“芯片位宽=存储单元容量”的公式了。也因此,真正的行、列地址数量也与同规格 SDRAM 不一样了。
以本芯片为例,在读取时,L-Bank 在内部时钟信号的触发下一次传送 8bit 的数据给读取锁存器,再分成两路 4bit 数据传给复用器,由后者将它们合并为一路 4bit 数据流,然后由发送器在 DQS 的控制下在外部时钟上升与下降沿分两次传输 4bit 的数据给北桥的内存控制器(在ARM和现在的CPU中,内存控制器是集成在CPU中的,现在的PC机中北桥已无内存控制器)。这样,如果时钟频率为 100MHz,那么在 I/O 端口处,由于是上下沿触发,那么就是传输频率就是 200MHz。
现在大家基本明白 DDR SDRAM 的工作原理了吧,这种内部存储单元容量(也可以称为芯片内部总线位宽)=2×芯片位宽(也可称为芯片 I/O 总线位宽)的设计,就是所谓的两位预取(2-bit Prefetch)。
2.DDR与SDRAM的异同
DDR SDRAM 与 SDRAM 一样,在开机时也要进行 MRS(ModeRegister Set,模式寄存器的设置),不过由于操作功能的增多,DDR SDRAM 在 MRS 之前还多了一 EMRS 阶段(Extended Mode Register Set,扩展模式寄存器设置),这个扩展模式寄存器控制着 DLL 的有效/禁止、输出驱动强度、QFC 有效/无效等。
3.差分时钟
CK#的作用,并不能理解为第二个触发时钟,而是起到触发时钟校准的作用。
由于数据是在 CK 的上下沿触发,造成传输周期缩短了一半,因此必须要保证传输周期的稳定以确保数据的正确传输,这就要求 CK 的上下沿间距要有精确的控制。但因为温度、电阻性能的改变等原因,CK 上下沿间距可能发生变化,此时与其反相的 CK#就起到纠正的作用(CK 上升快下降慢,CK#则是上升慢下降快)。而由于上下沿触发的原因,也使 CL=1.5 和 2.5 成为可能,并容易实现。
4.数据选取脉冲(DQS)
DQS 是 DDR SDRAM 中的重要功能,它的功能主要用来在一个时钟周期内准确的区分出每个传输周期,并便于接收方准确接收数据。每一颗芯片都有一个 DQS 信号线,它是双向的,在写入时它用来传送由内存控制器发来的 DQS 信号,读取时,则由DDR芯片生成 DQS 向内存控制器发送。完全可以说,它就是数据的同步信号。
在读取时,DQS 与数据信号同时生成(也是在 CK 与 CK#的交叉点)。而 DDR 内存中的 CL 也就是从 CAS 发出到 DQS 生成的间隔,数据真正出现在数据 I/O 总线上相对于 DQS 触发的时间间隔被称为tAC。实际上,DQS 生成时,芯片内部的预取已经完毕了,tAC 是指上文结构图中灰色部分的数据输出时间,由于预取的原因,实际的数据传出可能会提前于 DQS 发生(数据提前于 DQS 传出)。
DQS 在读取时与数据同步传输,那么接收时也是以 DQS 的上下沿为准吗?不,如果以 DQS 的上下沿区分数据周期的危险很大。由于芯片有预取的操作,所以输出时的同步很难控制,只能限制在一定的时间范围内,数据在各 I/O 端口的出现时间可能有快有慢,会与 DQS 有一定的间隔,这也就是为什么要有一个 tAC 规定的原因(DDR中的tAC是在DQS触发和数据真正出现在I/O总线上的间隔时间)。而在接收方,一切必须保证同步接收,不能有 tAC 之类的偏差。这样在写入时,芯片不再自己生成 DQS,而以发送方传来的 DQS 为基准,并相应延后一定的时间,在 DQS 的中部为数据周期的选取分割点(在读取时分割点就是上下沿),从这里分隔开两个传输周期。这样做的好处是,由于各数据信号都会有一个逻辑电平保持周期,即使发送时不同步,在 DQS 上下沿时都处于保持周期中,此时数据接收触发的准确性无疑是最高的。
在写入时,以 DQS 的高/低电平期中部为数据周期分割点,而不是上/下沿,但数据的接收触发仍为 DQS 的上/下沿。
5.写入延迟
在上面的 DQS 写入时序图中,可以发现写入延迟已经不是0了,在发出写入命令后,DQS与写入数据要等一段时间才会送达。这个周期被称为 DQS 相对于写入命令的延迟时间(tDQSS, WRITE Command to the first corresponding rising edge of DQS)。
为什么要有这样的延迟设计呢?原因也在于同步,毕竟一个时钟周期两次传送,需要很高的控制精度,它必须要等接收方做好充分的准备才行。tDQSS 是 DDR 内存写入操作的一个重要参数,太短的话恐怕接受有误,太长则会造成总线空闲。tDQSS 最短不能小于 0.75 个时钟周期,最长不能超过 1.25 个时钟周期。
正常情况下,tDQSS 是一个时钟周期,但写入时接受方的时钟只用来控制命令信号的同步,而数据的接受则完全依靠 DQS 进行同步,所以 DQS 与时钟不同步也无所谓。不过,tDQSS产生了一个不利影响— — 读后写操作延迟的增加,如果 CL=2.5,还要在 tDQSS 基础上加入半个时钟周期,因为命令都要在 CK 的上升沿发出。下图中,当 CL=2.5 时,读后写的延迟将为 tDQSS+0.5 个时钟周期(图中 BL=2)。
另外,DDR 内存的数据真正写入由于要经过更多步骤的处理,所以写回时间(tWR)也明显延长,一般在3个时钟周期左右,而在 DDR-Ⅱ规范中更是将 tWR 列为模式寄存器的一项,可见它的重要性。
6.突发长度
在 DDR SDRAM 中,突发长度只有 2、4、8 三种选择,没有了随机存取的操作(突发长度为 1)和全页式突发。这是为什么呢?因为 L-Bank一次就存取两倍于芯片位宽的数据,所以芯片至少也要进行两次传输才可以,否则内部多出来的数据怎么处理?但是,突发长度的定义也与 SDRAM 的不一样了,它不再指所连续寻址的存储单元数量,而是指连续的传输周期数,每次是一个芯片位宽的数据。
7.延迟锁定回路(DLL)
DDR SDRAM 对时钟的精确性有着很高的要求,而 DDR SDRAM 有两个时钟,一个是外部的总线时钟,一个是内部的工作时钟,在理论上 DDR SDRAM 这两个时钟应该是同步的,但由于种种原因,如温度、电压波动而产生延迟使两者很难同步,更何况时钟频率本身也有不稳定的情况(SDRAM 也有内部时钟,不过因为它的工作/传输频率较低,所以内外同步问题并不突出)。
DDR SDRAM 的 tAC 就是因为内部时钟与外部时钟有偏差而引起的,它很可能造成因数据不同步而产生错误的恶果。实际上,不同步就是一种正/负延迟,如果延迟不可避免,那么若是设定一个延迟值,如一个时钟周期,那么内外时钟的上升与下降沿还是同步的。鉴于外部时钟周期也不会绝对统一,所以需要根据外部时钟动态修正内部时钟的延迟来实现与外部时钟的同步,这就是 DLL 的任务。
DLL 不同于主板上的 PLL,它不涉及频率与电压转换,而是生成一个延迟量给内部时钟。目前 DLL 有两种实现方法,一个是时钟频率测量法(CFM,Clock Frequency Measurement),一个是时钟比较法(CC,Clock Comparator)。
CFM 是测量外部时钟的频率周期,然后以此周期为延迟值控制内部时钟,这样内外时钟正好就相差了一个时钟周期,从而实现同步。DLL 就这样反复测量反复控制延迟值,使内部时钟与外部时钟保持同步。
CC的方法则是比较内外部时钟的长短,如果内部时钟周期短了,就将所少的延迟加到下一个内部时钟周期里,然后再与外部时钟做比较,若是内部时钟周期长了,就将多出的延迟从下一个内部时钟中刨除,如此往复,最终使内外时钟同步。
CFM 式 DLL 工作示意图
CC 式 DLL 工作示意图
CFM 与 CC 各有优缺点,CFM 的校正速度快,仅用两个时钟周期,但容易受到噪音干扰,并且如果测量失误,则内部的延迟就永远错下去了。CC 的优点则是更稳定可靠,如果比较失败,延迟受影响的只是一个数据(而且不会太严重),不会涉及到后面的延迟修正,但它的修正时间要比 CFM 长。DLL 功能在 DDR SDRAM 中可以被禁止,但仅限于除错与评估操作,正常工作状态是自动有效的。
DDR的发展沿着更高数据传输频率,更大内存容量的方向发展,DDR2中做到更高数据传输频率,由DDR的2-bit pretetch向4-bit pretetch发展,而扩展容量,除了增加每个L-Bank的容量以外,另外就是增加L-Bank数,也就是说在内存中,原来DDR中Bank线只有2根,一块内存芯片最多2^2=4片L-Bank,而在DDR2中变成了2^3=8片L-Bank。(下面的一些图和文档出自尔必达的芯片手册)
1.4-bit Prefetch
直接上一个表,看看DDR2的三个频率的关系,下图是内部时钟均为133MHz的DDR2/DDR/SDRAM的比较,由图可以看到,相比于DDR,DDR2由于是4-bit Prefetch,外部时钟是内部总线时钟的2倍,而DDR和SDRAM中,这两个时钟频率相等
上一个对比图,看的会更清楚一点儿:
在 SDRAM 与 DDR 时代,这两个时钟频率是相同的,但在 DDR-Ⅱ内存中,内部时钟变成了外部时钟的一半。以 DDR-Ⅱ 533 为例,数据传输频率为 533MHz( 对于每个数据引脚,则是 533Mbps/pin),外部时钟频率为 266MHz,内部时钟频率为 133MHz。因为内部一次传输的数据就可供外部接口传输 4 次,虽然以 DDR 方式传输,但数据传输频率的基准— — 外部时钟频率仍要是内部时钟的两倍才行。
2. DDR-Ⅱ的新操作与新时序设计
2.1片外驱动调校(OCD,Off-Chip Driver)
DDR-Ⅱ内存在开机时也会有初始化过程,同时在 EMRS 中加入了新设置选项,由于大同小异,在此就不多说了。在 EMRS 阶段,DDR-Ⅱ加入了可选的 OCD 功能。
OCD 的主要用意在于调整 I/O 接口端的电压,来补偿上拉与下拉电阻值。目的是让 DQS 与 DQ 数据信号之间的偏差降低到最小。调校期间,分别测试 DQS 高电平/DQ 高电平,与 DQS 低电平/DQ 高电平时的同步情况,如果不满足要求,则通过设定突发长度的地址线来传送上拉/下拉电阻等级(加一档或减一档),直到测试合格才退出 OCD 操作。
2.2 片内终结(ODT,On-Die Termination)
所谓的终结,就是让信号被电路的终端吸收掉,而不会在电路上形成反射,造成对后面信号的影响。
在 DDR 时代,控制与数据信号的终结在主板上完成,每块 DDR 主板在 DIMM 槽的旁边都会有一个终结电压岛的设计,它主要由一排终结电阻构成。长期以来,这个电压岛一直是 DDR 主板设计上的一个难点。而 ODT 的出现,则将这个难点消灭了。ODT 将终结电阻从主板上移植到了内存芯片内部,主板上不在有终结电路。ODT 的功能与禁止由内存控制器控制,ODT 所终结的信号包括 DQS、RDQS(为 8bit 位宽芯片增设的专用 DQS 读取信号,主要用来简化一个模组中同时使用 4 与 8bit 位宽芯片时的控制设计)、DQ、DM 等。
上图中,左边就是DDR时代,在主板上完成信号终结,右边就是从DDR2开始,在内存芯片内部终结信号。在内存芯片工作时系统会把终结电阻器屏蔽,而对于暂时不工作的内存芯片则打开终结电阻器以减少信号的反射。由此DDR2内存控制器可以通过ODT同时管理所有内存引脚的信号终结。并且阻抗值也可以有多种选择。如0Ω、50Ω、75Ω、150Ω等等。并且内存控制器可以根据系统内干扰信号的强度自动调整阻值的大小。
2.3前置 CAS、附加潜伏期与写入潜伏期
前置 CAS(Posted CAS)是为了解决 DDR 内存中指令冲突而设计的功能。它允许 CAS 信号紧随 RAS 发送,相对于以往的 DDR 等于将 CAS 前置了。
这样,地址线可以立刻空出来,便于后面的行有效命令发出,避免造成命令冲突而被迫延后的情况发生,但读/写操作并没有因此而提前,仍有要保证有足够的延迟/潜伏期,为此,DDR-Ⅱ引入了附加潜伏期的概念(AL,Additive Latency),与 CL 一样,单位为时钟周期数。AL+CL 被定义为读取潜伏期(RL,Read Latency),相应的,DDR-Ⅱ还对写入潜伏期(WL,Write Latency)制定了标准,WL是指从写入命令发出到第一笔数据输入的潜伏期,不要将它和 tDQSS 弄混了,后者是指 DQS 而不是数据。按规定,WL=RL-1,即 AL+CL-1。
上图中,ACT表示的是激活信号,在没有前置 CAS 功能时,对其他 L-Bank 的寻址操作可能会因当前行的 CAS 命令占用地址线而延后,并使数据 I/O 总线出现空闲(上图中的BUBBLE处),当使用前置 CAS 后,消除了命令冲突并使数据 I/O 总线的利率提高。
设置 Posted-CAS 后,必须附加潜伏期以保证应有延迟,此时读取潜伏期(RL)就等于 AL+CL,从中可以看出 AL 的值为 CL+tRCD-1。
至此,DDR2的来龙去脉全部分析完毕,现在可以开始打开芯片手册,开始分析源码了。