赞
踩
在读写DDR3之前,需要了解DDR3的相关知识,而如果一开始就直接看DDR3的话,我们极有可能会感觉到一头雾水,不知道从哪下手,接下来,我们便从SDRAM一步步到DDR3,分步去学习相关的知识。
从某种意义上来讲,SDRAM是现在内存的最初代产品,现在的DDR4包括DDR5都起源于它。SDRAM(Synchronous Dynamic Access Memory),是同步动态随机存储器。同步是指其时钟频率与CPU前端总线的系统时钟频率相同,并且内部的命令的发送与数据的传输都是以它为基准;动态是指存储阵列需要不断地刷新来保证数据不丢失:随机是指数据不是线性依次存储,而是自由地指定地址进行数据的读写。
传统内存系统为了保证CPU的正常工作,必须一次传输完CPU在一个传输周期内所需要的数据。而CPU在一个传输周期能接收的数据容量就是CPU数据总线的位宽。单位是bit。当时控制内存与CPU之间数据交换的北桥芯片也因此将内存总线的数据位宽等同于CPU数据总线的位宽,而这个位宽就称之为物理Bank(Physical Bank)的位宽。简单理解就是物理Bank与CPU位宽一致。
芯片位宽是指每一片SDRAM缓存芯片本身的位宽。
这里举一个例子来进行理解:假设CPU的位宽为64bits,那么SDRAM的物理Bank位宽就为64bits,假设现在芯片位宽为16bits,那么SDRAM与CPU之间该如何交互呢?我们需要4片SDRAM连接起来与CPU交互。
逻辑Bank(Logic Bank,简称L-Bank)是SDRAM内存存储空间划分的片区。
列 | 地 | 址 | |||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
2 | |||||||||
行 | 3 | ||||||||
地 | 4 | ||||||||
址 | 5 | ||||||||
6 | |||||||||
7 |
我们可以把L-Bank理解成一个方格矩阵,每一个小格都是一个存储单元。假设芯片位宽为16bits,那么每一个小的单元都可以存储16bits的数据。在对SDRAM进行读写时,我们通过RAS(行选中信号)和CAS(列选中信号)来选择不同的ROW(行)和Column(列)地址。
这个图是一个简单的示意图,并不能当做是内部实际电路。我们在对内存单元进行读写时,要先将对应的Bank和行选中并激活,然后在给出读写命令的同时给出列地址,激活列地址,然后对存储单元进行访问。我们知道,内存单元的数据是通过电容的的充放电来存储的,写数据给电容充电,读数据使电容放电。刷新放大器的作用十分关键,在我们写数据时,刷新放大器起到了对内存单元预充电的作用,这样我们就可以得到较为标准的高低电平,而在数据存储的时间内,因为电容会有漏电流,所以时间长了它可能会处于亚稳态,那么刷新放大器就可以对单元进行刷新,当存储数据为1时,给电容充电,使它维持标准的1;当存储数据为0时,它使内存单元的电荷放的更干净,维持稳定的0。另外,在从I/O口读取数据时,因为存储电容存储的电荷量十分有限,所以我们需要通过刷新放大器,将这个电容放大到足够我们观察的数值再读取出来。
如图所示,CLK和CKE是一对差分时钟,CS#,WE#,CAS#,RAS#是控制信号,用来配置模式寄存器,左下角的地址线用来传输相应的地址,分别有Bank地址,行地址和列地址,中间的那一大块的作用就是选中对应的行和列,Bank存储阵列的规格是32M*4bit,代表了四片芯片位宽为4bit的Bank,所以它的物理Bank位宽就是4*4=16bits。右边的数据输入/输出寄存器与I/O连接,进行数据传输。DQM为掩码信号,他与频闪信号类似,就是选择将某些数据位屏蔽。需要注意的是,在写数据时,利用DQM信号将对应数据屏蔽后,数据就不会写进内存里;但是在读数据阶段,使用DQM将数据屏蔽,数据依然会从内存中读出来,不过在数据输出寄存器处理阶段,不会将被屏蔽的数据输送到I/O口。
A0~A11是12位地址总线,行、列地址共用;BA0,BA1为BANK地址;DQ0~31是32位数据引脚;DQ0~3为数据屏蔽线;clk是时钟信号,cke是是使能信号;NC代表不连接。WE#,CAS#,RAS#,CS#是命令总线,WE#是读写控制位,0代表写,1代表读;RAS#为行选中信号,CAS#为列选中信号,CS#为片选信号。
NOP代表不操作,第一种在初始化时会用到,第二种是在空闲时用的。ACTIVE表示选中某一个BANK的某以行,将它激活。READ是给出对应BANK的列地址,并且开始突发读传输。WRITE命令给出对应的BANK的列地址,并开始突发写传输。BURST TERMINATE是指令禁止命令,比如在一次突发传输没有结束的时候,我们想进行其他操作,可以通过此命令。让它强制停止。PRECHARGE是预充电的意思,在进行数据读写操作前,必须给BANK中的行进行预充电。AUTO REFRESH和 SELF REFRESH分别是自动刷新和手动刷新的意思,自动刷新是指刷新放大器会按照一个周期刷新内存单元,而手动刷新则不同,如果没有设置为自动刷新,那么我们在每次读写内存单元前,都必须给对应的BANK中的对应ROW(行)先进行一次手动刷新,然后才能执行读写命令。
激活命令,激活某一BANK的某一行。
写命令,在对此内存单元进行刷新之后,给出BANK地址和列地址,便可以根据命令进行读写操作。读操作时许与之相似,要注意的是,行和列地址公用一组信号线。写命令在执行时没有延时,而读命令因为需要刷新放大处理的原因,数据可能会延迟一段时间才能读出。
预充电时序,可以根据A10来选择是否自动预充电。BA0,1用来选择对哪一个BANK进行预充电。
SDRAM初始化时序,在图中对应时刻给相应的命令,就可以完成初始化操作,主要是进行预充电和模式寄存器的配置,图中的时间都是一些延时,具体数值可以在内存手册上查看。
具体的读写时序图逻辑都差不多,有突发读和写,还有随机读和写模式这里以突发读传输为例,在对相应的行进行预充电之后,同时给出读命令和相应的列地址,在经过CL的延时之后,便可以在DQ信号上得到数据,图中分别展示了CL=2和CL=3的情形。
DDR SDRAM全称为Double Data Rate SDRAM,也就是双倍速率SDRAM实在SDRAM的基础上改进得到的。
我们不难看出,图中的左半部分和SDRAM的结构是一样的,不同的地方在右半部分,也就是将DQ0~3的四位数据与i/o的8位数据交互,逻辑主要是通过MUX复用器和输入寄存器来实现将8位数据变为2个4位数据和将2个4位数据合并为8位数据,那么关键问题就是怎样在DDR进行一次8位数据操作的同时,用户接口操作两次4位数据?我们之前都是在时钟的上升沿进行操作,在DDR中,我们同时在时钟的上升沿和下降沿采样,这样就达到了双倍速率,而一般都是通过一对差分时钟来实现的。
从图中可以看到,DDR SDRAM的操作时序和SDRAM的操作时序没有太大变化,只不过时钟变成了一对差分时钟,在CK的时钟沿和CK#的时钟沿的交叉处进行时序操作,这样就可以达到双倍的工作速率,DQS信号可以理解为一个数据选通信号,它的一次变化的同时会发生一次数据的更新。因为差分时钟速率加倍的缘故,这里的CL也可以不为整数只要四0.5的倍速就可以。
与DDR的双倍传输不同的是,DDR2实现了4倍传输,它的实现逻辑和DDR差不多,也是利用复用器和输入寄存器,将数据进行合并、拆分,但是DDR2的位宽变成了DQ0~DQ15的四倍,这里DDR2可以说是属于偷换概念,和DDR一样,它也是双沿传输,但是剩下的2倍它是通过时钟频率加倍来实现的,也就是说,端口的时钟是DDR2内部时钟的2倍。
DDR2内存在开机时也会有初始化过程,同时在EMRS中加入了新的设置选项,没有太大变化。在EMRS阶段,DDR2加入了可选的OCD功能OCD的主要作用就是调整I/O接口端的电压,来补偿上拉与下拉电阻值,目的是让DQS与DQ数据信号之间的偏差降低到最小。调校期间,分别测试DQS高电平/DQ高电平,与DQS低电平/DQ低电平时的同步情况,如果不满足要求,则通过设定突发长度的地址线来传送上拉/下拉电阻等级(加一档或减一档),直到测试合格才退出OCD操作。
下图是别人画的一个OCD示意图,可以对照理解。OCD的作用在于调整DS与DQ之间的同步,以确保信号的完整与可靠性。
所谓的终结,就是让信号被电路的终端吸收掉,而不会在电路上形成反射,造成对后边信号的影响。在DDR时代,控制与数据信号的终结在主板上完成,每块DDR主板在DIMM槽的旁边都会有一个终结电压岛的设计,它主要由一排终结电阻构成。长期以来,这个电压岛一直是DDR主板设计上的一个难点。而ODT的出现,则将这个难点给消灭了。也就是说,ODT就是将终结电阻移植到了芯片内部,而不在主板上单独设计单独电路了。
前置CAS(Posted CAS)是为解决DDR中指令冲突而设计的功能。它允许CAS信号紧随RAS信号发送,相对于以往的DDR等于将CAS前置了。这样,地址线可以立刻空出来,便于后边的行有效命令发出,避免造成命令冲突而被迫延后的情况发生,但读/写操作并没有因此而提前,仍要保证有足够的延时/潜伏期,为此,DDR2引入了附加潜伏期的概念(AL,Additive Latency),与CL一样,单位为时钟周期数AL+CL被定义为读取潜伏期(RL,Read Latency),相应的,DDR2还对写入潜伏期(WL,Write Latency)制定了标准,WL是指聪写入命令发出到第一笔数据输入的潜伏期。按照规定,WL=RL-1,即AL+CL-1。
注意,WL是指写入潜伏期,是指从写入命令发出到第一笔数据输入的潜伏期,不要将它与tDQSS混淆。
由于DDR3的预取为8bit,所以突发传输周期BL也固定为8,而对于DDR2和早期的DDR架构系统,BL=4也是常用的,DDR3为此增加了一个4bitBurst Chop(突发突变)模式,即由一个BL=4的读取操作加上一个BL=4的写入操作合成一个BL=8的数据突发传输,届时可通过地址线来控制这一突发模式。(也就是说,DDR3不支持单独BL=4的突发传输,突发长度BL只能等于8)。而且需要需要指出的是,任何突发中断操作都将在DDR3中予以禁止。且不予支持,取而代之的是更灵活的突发传输控制(如4bit顺序突发)。
就像DDR2从DDR转变而来后延迟周期数增加一样,DDR3的CL周期也将比DDR2有所提高。DDR2的CL范围一般在2~5之间,而DDR3则在5~11之间,且附加延时AL的设计也有所变化。DDR2的AL范围是0~4,而DDR3的AL有三种选项,分别是0、CL-1和CL-2。另外,DDR3还新增加了一个时序参数——写入延时(CWD),这一参数将根据具体的工作频率而定。
重置是DDR3新增的一项重要功能,并为此专门准备了一个引脚。DRAM业界很早就要求增加这一功能,如今终于在DDR3上实现了。这一引脚将使DDR3的初始化处理变得简单。当Reset命令有效时,DDR3内存将停止所有操作,并切换至最少量活动状态,以节约电力。
在Reset期间,DDR3内存将关闭内在的大部分功能,所有数据接收与发送器都将关闭,所有内部的装置将复位,DLL(延迟锁相环路)与时钟电路将停止工作,而且不理睬数据总线上的任何动静。这样一来,将使DDR3到达最节省电力的目地。
ZQ也是一个新增的引脚,在这个引脚上接有一个240欧姆的低公差参考电阻。这个引脚通过一个命令集,通过片上校准引擎(On-Die Calibration Engine,ODCE)来自动校验数据输出驱动器导通电阻与ODT的终结电阻值。当系统发出这一指令后,将用相应的时钟周期(在加电与初始化之后用512个时钟周期,在退出自动刷新操作后用256个时钟周期、在其他情况下用64个时钟周期)对导通电阻和ODT电阻进行重新校准。
在DDR3系统中,对于内存系统工作非常重要的参考电压信号VREF将分为两个信号,即为命令与地址信号服务的VREFCA和为数据总线服务的VREFDQ,这将有效的提高系统数据总线的信噪等级。
这是为了提高系统性能而进行的重要改动,也是DDR3与DDR2的一个关键区别。在DDR3系统中,一个内存控制器只与一个内存通道打交道,而且这个内存通道只能有一个插槽,因此,内存控制器与DDR3内存模组之间是点对点(P2P)的关系(单物理Bank的模组),或者是点对双点(P22P)的关系(双物理Bank的模组),从而大大地减轻了地址/命令/控制与数据总线的负载。而在内存模组方面,与DDR2的类别相类似,也有表准DIMM(台式PC)、SO-DIMM/Micro-DIMM(笔记本电脑)、FB-DIMM2(服务器)之分,其中第二代FB-DIMM将采用规格更高的AMB2(高级内存缓冲器)。
面向64位架构的DDR3显然在频率和速度上拥有更多的优势,此外,由于DDR3所采用的根据温度自动自刷新、局部自刷新等其他一些功能,在功耗方面DDR3也要出色许多,因此,他可能首先受到移动设备的欢迎,就像最新迎接DDR2内存的不是台式机而是服务器一样。在CPU外频提升最迅速的PC台式机领域,DDR3未来也是一片光明。Intel所推出的新芯片-熊湖(Bear Lake),其将支持DDR3规格,而AMD也将预计同时在K9平台上支持DDR2及DDR3两种规格。
MIG是Xilinx平台给出的一款内存控制器IP核。虽然DDR3的时序关系非常复杂,但是我们可以通过MIG IP核来控制DDR3,而我们只需要完成MIG的时序控制就行,这样就极大的简化了设计的复杂度,缩小了开发周期。
图中所示为MIG的基本结构,它分为三个部分,分别是用户接口、内存控制器和物理接口。其中内存控制器和物理接口用来控制DDR3的时序,而我们只需要控制用户接口就可以了。
图中的MIG IP核的用户接口是Native接口,时序关系也比较简单。就是说,当app_en和app_rdy信号同时为高电平时,app_cmd(命令)和app_addr(地址)才有效,所以当需要app_cmd和app_addr有效时,app_en必须保持到app_rdy为高电平才有效。
关于Native接口的MIG IP核将讲解与使用方法很多,但我们这次试验主要用AXI接口的MIG IP 核。AXI接口的用户接口的时序其实就是AXI总线协议的时序,前边我们讲过,后边我们就直接来将怎样配置它已经利用它对DDR3进行读写测试。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。