基于FPGA高速控制DDR2内存条的设计

时间:2022-06-24 04:09:27

基于FPGA高速控制DDR2内存条的设计

【摘 要】通过FPGA控制2GB的DDR2内存条实现了1.2GHz的16bits并行数据输出,解决了工程应用中速度与容量不能兼容的问题。首先,介绍了FPGA与DDR2内存条点对点互联时的阻抗匹配模型,使用Mentor公司的高速电路仿真软件Hyperlinx对阻抗匹配模型进行布线前和布线后仿真,实现高速数字电路板的信号完整性分析。然后,简要介绍了DDR2内存条的工作流程,使用Verilog语言完成DDR2内存条控制器的代码编写,并通过ModelSim软件对DDR2内存条控制器的功能进行验证。

一、引言

在各种地铁数据通信系统中,对高速、大容量数字信号存储器的需求越来越多。DDR2内存条凭借其高速、大容量、数据更新快等的优点,得到了广泛的应用。本设计应用在毫米波段射频信号形成器的面元法信号形成中,面元法信号形成是通过对具有引信工作频率的连续波进行快速的幅度调制,从而仿真模拟引信的实际回波信号。

基于FPGA实现DDR2内存条的控制,由于DDR2内存条的工作频率高,存储容量大,传输信号的完整性要求高,导致其印制板设计难度大、控制器程序编写复杂等不利于FPGA对DDR2内存条进行开发的因素。本文通过详细介绍FPGA与DDR2内存条之间信号完整性的分析方法,以及验证DDR2内存条控制器的正确性的方法,解决了DDR2内存条设计中的瓶颈问题,实现了DDR2内存条在工程中的较好应用。

二、FPGA与DDR2内存条之间信号完整性设计

本设计中使用的FPGA是Altera公司的StratixII系列的芯片,使用的DDR2内存条是

市场上通用的内存条,容量为2GB。如果使用StratixIII系列更高端的FPGA芯片时,可以使用FPGA内部的OCT功能来省去源端的匹配电阻,DDR2内存条可以使用ODT功能来省去终端匹配电阻,此时只需要FPGA和DDR2内存条直接互联。本设计中没有使用这两种功能,所以不进行讨论。

(一)布线前FPGA和DDR2内存条之间信号完整性分析

DDR2内存条接口信号满足JEDEC-standard 1.8V(兼容SSTL_18)标准。首先,我们将 FPGA到DDR2内存条的信号分为三类:单端单向传输、单端双向传输、差分单向传输,他们分别对用FPGA到DDR2内存条之前的地址与控制信号、数据信号、时钟信号。在FPGA中对应三种信号的匹配模式为:SSTL_18 ClassI、SSTL_18 ClassII和Differential SSTL_18 Class I。我们在Hyperlinx中设计三种阻抗匹配模型如图1所示,在模型的源端和终端分别调用器件的ibis模型,设置仿真参数包括:源端电阻、终端电阻、传输线的长度,通过改变仿真参数,对比传输信号的完整性。

其中,要保证单端信号线的阻抗为50-60Ω±10%;差分信号线的阻抗为100Ω±10%,传输线的阻抗同样可以在Hyperlinx中进行仿真。首先,固定传输线的线宽,通过设计传输线的厚度,铜层的分布,板层之间的介质厚度和介质常数来实现单端传输线阻抗为50-60Ω±10%,通过设计差分传输线的间距来实现阻抗为100Ω±10%。传输线的阻抗确定后,只有传输线的长度和驱动电流两个可以改变的参数。在阻抗匹配电路中,要求源端电阻距离FPGA输出端小于3cm,终端电阻距离DDR2内存条的距离小于2cm。根据实际印制板布局布线的考虑,我们都采用2cm。此时,通过改变传输线的长度和驱动电流的强度,来验证信号完整性随这两个参数的变化。设计中为了保证传输线能够满足400Mhz信号的传输,我们采用最小脉宽为1.25ns的随机脉冲信号作为激励信号,通过观察接收端的眼图来检验信号传输的完整性。在三种模型中,模型二最具有代表性,因此,本文中只分析模型二,其他模型分析方法类似。

此种模式下传输的信号是DDR2内存条的数据信号。当输出驱动为16mA,传输线的长度由20cm递增到80cm,DDR2内存条接收端的眼图如图4所示。其中,横坐标为500ps,纵坐标为1V。表1为4个眼图的测量值。为了保证能够正确接收信号和设计的冗余,我们要求眼图的高度大于700mV,在80cm的传输距离内都能够满足要求。

当传输线的长度固定为40cm,驱动电流分别为4mA、8mA、16mA、20mA时接收端眼图如下图5所示,其中,横坐标为500ps,纵坐标为1V,表2 为4个眼图的测量值。此时,16mA、20mA都能可靠的满足眼图高度大于700mV的要求。

上述过程为数据由FPGA传输到DDR2内存条时的情况,当由DDR2内存条输出到FPGA输入端时,DDR2内存条的输出驱动电流可以设置成为正常和减弱,减弱时的驱动电流仅为正常时的45~60%。由于DDR2的正常驱动电流为13.4mA,减弱的电流强度为6~8mA。为了保证FPGA可靠接收,我们采用正常的驱动电流。可以通过上面的方法分析数据由DDR2内存条到FPGA接收端的眼图,检验信号的完整性。

在三种传输模式下,随着传输线的距离的增加,眼图的高度都是逐渐变小。所以,在能够满足布线的条件下我们将三类传输模式下传输线设计成等长的15cm。单端的两种阻抗模型在16mA的时候信号眼图的高度比较理想,同时过冲和功耗都比较小。差分的阻抗模型在8mA的综合上述因素眼图最理想。

(二)布线后仿真

布线后将印制板导入到Hyperlinx中,通过加载器件的ibis模型,设置终端电阻和源端电阻后,选择三类信号分别仿真。图4为布线后在Hyperlinx中单端单向传输、单端双向传输、差分单向传输的仿真眼图,其中,横坐标为500ps,纵坐标为1

与布线前的仿真结果相比,眼图宽度、眼图高度没有多大变化,只是信号的过冲偏大,

这与传输线之间的串扰,以及布线后和布线前的传输线的阻抗有偏差导致的。

三、DDR2内存条控制器的设计

DDR2内存条控制器的实现可以采用DDR2 SDRAM控制器IPcore实现较高效率的控制,此时,在FPGA中的布局布线都是最优的,在StratixII系列的FPGA中对DDR2内存条控制的时钟最高可以达到267MHz。而在不使用DDR2 SDRAM控制器Ipcore的时候执行的效率就没有那么高,此时,最高时钟一般都在166Mhz以下。由于内存条在读写操作的时候需要刷新操作,所以不能100%的时钟速度进行读写。通过计算可以得出平均最高的读写速度为最高时钟速度的95%左右。根据设计本身的要求,我们采用166Mhz的时钟进行存储就够达到设计的要求。考虑到设计的成本,我们采用自己设计编写的DDR2 SDRAM控制器。

(一)DDR2内存条控制流程

DDR2内存条的工作流程如下图7所示。首先,DDR2内存条电源供电需要特定的顺序,我们使用TPS51116开关电源通过控制S3/S5来控制加电的顺序。初始化需要按照固定的时序进行,来保证内存条工作状态正常。进入 IDLE空闲状态时我们可以进行读写和刷新操作,刷新操作需要在64ms内进行8192次刷新指令,确保对所有的行刷新一次,这样平均7.8us刷新一次。但是由于刷新请求的时候,内存条的工作状态可能停留在读写操作中,此时,需要等待内存条的读写完成后回到IDLE状态,然后再响应刷新请求。在166Mhz时钟下,读写操作周期的最大值为一行进行连续的读操作,此过程小于7.8us。因此,不会因为等待读写过程而导致刷次数变少。我们可以采用小于7.8us的时间来请求刷新一次,这样就可以保证刷新的可靠性。

图7 DDR2内存条工作流程

为了保证最大效率的传输,我们采用连续读模式,此时,RL=3,BL=4如图8所示。首先执行active指令,同时地址选择相应的bank和行地址,等待tRCD的时间,然后可以进入读指令操作,每一次读出一行1024个数据,需要连续读操作256次,每次读出4个数据。此时,数据实现连续读的速度为时钟速度的两倍。当读完这一行指令后执行precharge指令关闭这一行后回到空闲状态。在IDLE状态中刷新指令的优先级最高,所以,回到IDLE状态后要检查是否有刷新请求,如果有刷新请求,状态机跳转到Auto refresh状态中,执行刷新指令后再跳转回IDLE状态,可以继续重复上述步骤,这样就可以保证最高效率的输出。

图8连续读操作的时序

(二)DDR2内存条控制器的设计方法

DDR2内存条控制器的模块如图9所示。通过使用FPGA内部的DLL产生所需要的DDR2内存条的3对差分时钟,由于三对差分时钟线长度相等,所以到达DDR2内存条的相位一致的。DLL输出的clk为内部系统时钟,产生DDR2的内存条的地、址控制信号,通过对相位的调整,使3对差分时钟信号与地址、控制信号满足时序要求。clk-90°相对比clk相位提前90°,速度一致;clkx2与clk同相,速度为clk的2倍,触发图中的数据模块,产生DQ[63:0]、DQS[7:0]、DM[7:0]信号,以及采样由DD2内存条读入的数据。

首先,数据为异步的16bits数据,我们通过数据接收模块准确可靠的采样下来16位的数据,然后缓存到FIFO1中,由于外来的异步数据速度相对于内部工作频率较低,我们需要对数据进行缓存处理。由于DDR2内存条工作在BL=4的模式下,每一次写操作都会写入64bits×4的数据量,所以,在FIFO1中我们缓存16个数据后由数据位合并模块将数据合并为一个256位的数据,然后再缓存到FIFO2中,通过控制模块查询FIFO 2的状态,只要发现FIFO 2中有数据我们就可以将数据由FIFO 2中读出,写到DDR2内存条中,然后继续判断FIFO 2的状态。当内存条的工作时钟为166MHz时,写操作一次需要20个时钟时,此时,写入数据的速度小于133Mhz时,可以满足大部分的接口传输。

图 9 DDR2内存条控制器的设计模块

将数据由DDR2内存条读出的时候,由于读操作是对DDR2内存条的一整行进行操作,所以,需要将FIFO3的容量开的大一些,保证FIFO3的容量的一半大于一行的数据量。通过判断FIFO3的半满标志来决定是否继续进行读操作,如果FIFO3已经半满了,则不需要再进行读操作,否则数据将会有丢失的可能,如果FIFO 3没有半满则可以继续读操作。在DDR2内存条的工作时钟为166MHz时,假设读一行数据需要1个active操作,256个读操作, 1个percharge操作,1个auto refresh操作,需要的时间为3.2us。此时,能够保证最高300Mhz的64位输出。通过数据拆位和FIFO4的缓存后,可以保证1.2GHz的16位连续输出。

(三)DDR2内存条控制器的验证

针对上述的工作流程我们可以编写测试程序对DDR2内存条控制器的功能进行验证,为了验证对DDR2内存条的控制是否正确,我们可以使用DDR2内存条厂商提供的Verilog模型。将测试程序和DDR2内存条Verilog模型加载到Moldsim软件中进行仿真,输出仿真过程的提示信息如下图10所示。

图10 Moldsim软件中的仿真输出

四、总结

在设计过程过,我们可以按照DDR2 SDRAM控制器Ipcore的设置引脚分配进行布线,这样我们可以兼容两种状态。在速度要求不高而且没有DDR2 SDRAM控制器Ipcore的情况下,我们可以使用上述方法实现DDR2内存条的控制,当速度满足不了系统的要求是我们可以通过ALTERA公司购买DDR2 SDRAM控制器Ipcore,来实现更高速的系统。

上一篇:行动导向教学法在图形图像处理课程中的实践和... 下一篇:火电厂节能技术监督报表系统的设计与实现