最近公司承接了一个车载视频拼接的项目,该项目使用到了LVDS高速接口和DDR3接口,摄像头采集的视频图像数据需要先存入DDR3中然后与通过LVDS传输的主机视频数据进行拼接输出,最终在屏幕上显示画中画的效果。在调试DDR3的过程中,我有一些高速存储器的使用心得,特分享给大家。首先我先介绍一下SDRAM存储器的读写时序。
SDRAM即同步动态随机存储单元,主要用来存储较大容量的数据。我们都知道,数据在处理的过程中一般都需要进行存储, 开发板上常见的存储方式有 FPGA内部芯片RAM资源、外部Flash存储器和外部SDRAM存储器。除了Flash,其他两种存储器都是掉电即丢失数据,由于Flash掉电能够保持内部数据,因此Flash主要用来固化程序或者固化参数。FPGA片内的RAM资源稀少而且珍贵,在大容量存储场合如图像数据缓存时,只能选择外部存储如SDRAM、DDR3等存储器。在MP801开发板上就含有三块SDRAM芯片,可以满足较大数据的高速读取。这也是新手在进阶过程中所面对的一个较复杂的接口,很多人对SDRAM的工作方式及接口时序不是很清楚。经过查阅数据手册与搜集相关的技术文档,我整理了一篇有关SDRAM接口读写时序的文章,希望能够帮助不了解的同学对SDRAM数据读写有更进一步的认识。
一、SDRAM初始化
在SDRAM内部有一个逻辑控制单元,并且有一个模式寄存器为其提供控制参数。每次开机时SDRAM都要先对这个控制逻辑核心进行初始化,关键阶段就在于模式寄存器(MR, ModeRegister)的设置,简称MRS(MR Set)。
SDRAM必须以预定义的方式启动和初始化。在 电源同时作用于Vdd和Vddq后开始初始化SDRAM,此时的时钟稳定并且将DQM和CKE信号拉高。在向SDRAM发命令之前需要有100us的延时,此时SDRAM不执行任何操作。在100us延时满足后,需要对Bank进行预充电,在此期间所有的Bank处于空闲状态。预充电之后会有至少两个自刷新,完成自刷新便可以对SDRAM进行模式寄存器配置。
图1 SDRAM初始化时序
SDRAM模式寄存器所控制的操作参数:地址线提供不同的0/1信号来获得不同的参数。在设置到MR之后,就开始了进入正常的工作状态。
二、行激活
初始化完成后,在向SDRAM发送读或写命令之前必须打开该Bank中的一行,通过AC tiVE命令来确定要激活的Bank和行。要想对一个L-Bank中的阵列进行寻址,首先要确定行(Row),然后确定列。片选信号与L-Bank选择信号与行有效同时进行。
图2 行有效时序
从上图中可以看出,在片选信号、Bank地址选定的同时,RAS(Row Address Strobe,行地址选通脉冲)也处于有效状态,此时An地址线发送具体的行地址。行地址位宽为12,共可以指示2^12=4096个具体的行地址。当行地址被激活后,相应的Bank也被激活,因此行激活又叫L-Bank激活。
三、列读写
行地址确定以后,就要对列地址进行寻址了。地址线仍使用A0-A11,即行地址与列地址共用地址线。当列地址选通后,就需要对SDRAM进行读写,而给SDRAM读命令还是写这就由WE#信号来决定。当WE#信号拉低时,SDRAM接收到的是写命令;当WE#拉高,SDRAM接收读命令。列寻址信号与读写命令是同时发出的。虽然地址线与行寻址共用,但CAS(Column Address Strobe,列地址选通脉冲)信号则可以区分开行与列寻址的不同,配合A0-A9,A11来确定具体的定址。
在发送列读写命令时必须要与行有效命令有一个时间间隔,这个时间间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟)。比如tRCD=3,就代表延迟周期为3个时钟周期,即在行有效命令发出后,经过3个时钟周期的延时,才能发送列读写命令,SDRAM进入数据读写操作。
图3 tRCD=3的列读写时序图
四、读操作
读命令从输入信号BA0、BA1中选取要进行读数据操作的BANK,并在已激活的行中进行突发读操作。输入的A0-A7用来进行列寻址。在选定列地址后,就已经确定了具体的存储单元,剩下的事情就是数据通过数据I/O通道(DQ)输出到内存总线上了。但是在CAS (列地址选通脉冲)发出之后,仍要经过一定的时间才能有数据输出,从CAS与读取命令发出到第一个数据输出的这段时间,被定义为CL(CAS Latency,CAS潜伏期)。由于CL只在读取时出现,所以CL又被称为读取潜伏期(RL,ReadLatency)。CL的单位与tRCD一样,为时钟周期数,具体耗时由时钟频率决定。CAS并不是在经过CL 周期之后才送达存储单元。实际上CAS与RAS一样是瞬间到达的,但CAS的响应时间要更快一些。下图展示了CAS=3时的读时序:
图4 CAS Latency=3的示意图
由于存储体中晶体管存在反应时间,从而造成数据不可能与CAS在同一上升沿触发,因此要延后至少一个时钟周期。考虑到芯片体积较小的因素,存储单元中的电容容量很小,所以信号要经过放大来保证其有效的识别性,这个放大/驱动工作由S-AMP负责,一个存储体对应一个S-AMP通道。但它要有一个准备时间才能保证信号的发送强度(事前还要进行电压比较以进行逻辑电平的判断),因此从数据I/O总线上有数据输出之前的一个时钟上升沿开始,数据即已传向S-AMP,也就是说此时数据已经被触发,经过一定的驱动时间最终传向数据I/O 总线进行输出,这段时间我们称之为tAC(Access-Time-from-CLK,时钟触发后的访问时间),单位是ns。在突发读操作完成后,如果选择了自动预充电模式,那么该行就会直接进入充电。如果没有选择此模式,那么该行将保持打开状态,供后续访问。自动预充电模式的选择与A10的值有关,A10为高时为自动预充电命令模式。
五、写操作
数据写入的操作也是在tRCD之后进行,但此时没有CL(CL只出现在读取操作中),行寻址与列寻址的时序一样致,只是在列寻址时,WE#为有效状态。由于数据信号由控制端发出,输入时芯片无需做任何调校,只需直接传到数据输入寄存器中,然后再由写入驱动器进行对存储电容的充电操作,因此数据可以与CAS同时发送,也就是说写入延迟为0。不过,数据并不是即时地写入存储电容,因为选通三极管(就如读取时一样)与电容的充电必须要有一段时间,所以数据的真正写入需要一定的周期。
六、突发读写
突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度(Burst Lengths,简称BL)。前文讲到的读/写操作,都是一次对一个存储单元进行寻址,如果想要连续的向SDRAM中读数据或者写数据,就需要对当前存储单元的下一个单元进行寻址,也即是需要不停给SDRAM列激活信号以及读/写命令(行地址不变,所以不用再对行寻址)。虽然由于读/写延迟相同可以让数据的传输在I/O端是连续的,但它占用了大量的内存控制资源,在数据进行连续传输时无法输入新的命令,效率很低。为此,人们开发了突发传输技术,只要指定起始列地址与突发长度,SDRAM就会不再需要控制器连续地提供列地址,依次地自动对后面相应数量的存储单元进行读/写操作。这样,在突发模式读写中,除了第一个数据的传输需要若干个周期(主要是之前的延迟,一般的是tRCD+CL),其后每个数据只需一个周期的即可获得。至于突发长度BL的数值,也是不能随便设或在数据进行传输前临时决定,而是在上文讲到的SDRAM初始化过程中模式寄存器配置阶段就要对突发长度进行设置。目前可用的选项是1、2、4、8、全页(FullPage),常见的突发长度设定是BL=4、BL=8或者全页突发模式。
图5 突发读时序图
七、预充电
在进行完读或写操作后,接下来如果要对同一个L-Bank的另一行进行寻址,就要将原来有效的行关闭,重新发送行/列地址,这是由于SDRAM的寻址具有独占性造成的。L-Bank关闭现有工作行,准备打开新行的操作就是预充电(Precharge)。实际上,预充电就是一种对工作行中所有存储体进行数据重写,并对行地址进行复位的操作。
地址线A10控制着是否进行在读或写操作之后当前L-Bank自动进行预充电。在单独的预充电命令中,A10控制着是对指定的L-Bank还是所有的L-Bank(当有多个L-Bank处于有效/活动状态时)进行预充电,前者需要提供L-Bank的地址,后者只需将A10信号置于高电平。在发出预充电命令之后,要经过一段时间才能允许发送RAS行有效命令打开新的工作行,这个间隔被称为tRP(Precharge command Period,预充电有效周期),单位是时钟周期数,具体值视时钟频率而定。在实际的设计中,我们通常设计让芯片每次读写操作后,自动进行预充电。这样设计时就不需要再单独考虑预充电的影响,只需要等待几个时间周期即可。
图6 读数据预充电时序
上图是突发长度设置为4、列选通潜伏期设置为2时,设置单独预充电命令下的时序图。可以看出,当行激活后,需要两个时钟周期的等待时间(tRCD)接收读命令,SDRAM在接收读命令时A10拉低,即此时不允许预充电,在SDRAM接收到预充电命令的时候才会进入预充电状态。当接收到读命令后,经过两个周期的列地址选通(CAS)潜伏期从DQ数据线连续读出4个数据。在预充电命令下,地址线A10拉高,SDRAM中所有L-Bank进入预充电状态,从接收到行激活命令到接收预充电命令之间的时间间隔就是列选通脉冲拉高的周期数,从接收一个行激活命令到接收下一个行激活命令之间的间隔叫做tRC。 以上就是我对SDRAM读写时序的理解,欢迎大家留言讨论。
|