DDR内存接口的设计与实现
扫描二维码
随时随地手机看文章
摘 要: 针对当今电子系统对高速大容量内存的需要,本文阐述了使用DDR控制器IP核来设计实现DDR内存接口的方法。该方法能使设计尽可能简单,让设计者更专注于关键逻辑设计,以便达到更高的性能。该设计经过仿真显示,完全符合要求。
关键字:DDR内存 IP核 地址产生逻辑 FIFO
1.引言
在当今的电子系统设计中内存被使用的越来越多,用来存放数据和程序。并且对内存的要求越来越高,要求内存读写速度尽可能的快,容量尽可能的大。面对这种趋势,设计实现大容量高速读写的内存显得尤为重要。
本文结合笔者承担的T比特路由器项目,对其中的大容量高速DDR内存接口的设计实现进行了详细阐述。本文第2节对与DDR内存相关的知识做了简单的介绍,从总体上对DDR内存有个认识;第3节阐述了DDR内存接口模块的整体设计;第4节对整个设计中的关键设计地址产生逻辑进行了详细阐述;最后总结全文。
2.DDR内存相关知识介绍
DDR SDRAM是双数据率同步动态随机存储器的缩写。它能够在一个时钟周期内传送两次数据,也就是说数据速率是时钟频率的两倍,可以达到很高的数据读写速度。此外它通过对地址线的分时复用,可以做到很大的容量。比如我们设计实现的DDR内存时钟频率可达到150MHz,数据速率为300MHz,容量达到1M x 72bit。
DDR内存为了更精确的同步使用若干对差分时钟;它还有一个独特的数据脉冲信号(DQS)。DDR内存就是根据DQS来分割一个时钟周期内的两次数据。更需要注意的是:DDR内存没有一个信号是发送读或写的明确命令的,而是通过芯片的可写状态来达到读/写的目的。具体为:片选信号(CS),行地址有效信号(RAS),列地址有效信号(CAS),写允许信号(WE)。它们都是低电平有效,它们的不同组合构成了对DDR内存的不同命令。比如CS,CAS有效,RAS无效,WE无效,表示从现在地址线指示的存储单元处读出一个数据放到数据线上;再如CS,CAS有效,RAS无效,WE有效,表示将数据线上的数据写入现在地址线指示的存储单元处。
DDR内存可以支持突发读写,并能根据不同的需要选择不同的突发长度(BL);位宽也可以选择,并能利用掩码技术灵活的选择每次读写的有效数据宽度(以8bit为单位);此外由于DDR内存读写时需要先激活(Active)将要读写的存储单元行,然后再读写,但DDR内存任何时候只能有一存储行是打开的(处于激活态),因此在需要读写不同存储行时,要先关闭前已打开的存储行,才能打开现在将要读写的存储单元行,这一操作被称为预充电(precharge)。另外由于DDR内存是动态存储器,需要对存储体进行周期性的刷新(refresh)。
从上面的介绍中可以看出DDR内存的性能虽然好,但接口控制很复杂。为了快速实现DDR内存接口,缩短设计周期,我们使用已经成熟的商业化内存控制器 IP 核对DDR内存进行控制。我们使用的是Altera公司的DDR Controller IP核,版本为2.2.0,使用的开发工具为Quartus II 4.1,使用VHDL语言进行描述。
3.独立内存接口模块整体设计
为了将内存接口模块设计成相对独立的模块,也为了调整不同模块之间的时钟相位差,使数据稳定输入输出,我们给DDR内存接口模块前端增加了一个入口FIFO,出口增加了一个出口FIFO。我们的功能需求是根据出口FIFO的状态确定是否将数据送往DDR内存条中进行缓存,并且设计中必须充分考虑DDR内存条存储器带宽的利用效率,设计成批量读写的模式,减少读写切换工作的开销。该内存模块具体完成以下功能:
1)使用DDR控制器IP核完成对DDR内存的初始化配置,产生读写命令和其他各种控制信号;
2)根据出口FIFO状态产生对DDR内存接口的读写请求;
3)并且整个系统对数据的缓存处理应该公平,不能有系统差别,也就是说要保证在任何情况下读出的数据都是有效的数据,写入的数据不覆盖DDR中的原有效数据;DDR内存接口模块主要功能由DDR控制器IP核完成,对DDR内存进行初始化配置,产生读写命令和其他各种控制信号。DDR控制器有两个接口:DDR-interface和local-interface。DDR-interface直接与DDR内存条相连,不需要干预。local-interface就是根据不同需要输入不同信号,可以增加自己的逻辑。我们需要设计的逻辑就是产生读写请求信号和对应的地址信息送给DDR控制器,DDR控制器把这些请求转换为对DDR内存的数据读写。因此DDR内存接口模块的重点是对地址产生逻辑的设计。我们的内存模块设计框图详见图1。
图1 DDR内存接口模块设计框图
4.内存读写地址产生逻辑的FPGA设计实现
根据本模块的功能需求,在出口FIFO的状态为忙时,要将数据送往DDR内存条缓存,当出口FIFO的状态为非忙时,要将数据从DDR内存条读出送到出口FIFO。并且设计必须充分考虑DDR内存条存储器带宽的利用效率,设计成批量读写的模式,减少读写切换工作的开销。出口FIFO的状态能由门限信号th1和th2反映出来,从而根据th1和th2反馈控制地址产生逻辑。
此外还要注意数据的次序,要保证对数据的公平处理,不能对数据造成系统差别,因此整个DDR内存逻辑上是一个循环队列。还要保证:DDR内存满时,不应再写DDR内存;DDR内存空时,不应再读DDR内存。DDR内存的空满对地址产生逻辑也有重要影响。
从上面分析中看出:对地址产生逻辑有影响的信号是出口FIFO的状态指示信号th1和th2,DDR内存的空满信号;输出信号为对DDR内存的读请求rd_req和写请求wr_req,地址addr。规定:th1=1表示出口FIFO几乎空,出口FIFO状态为非忙,可以对DDR内存发出读请求,直到th2=1为止;th2=1表示出口FIFO几乎满,出口FIFO状态为忙,可以对DDR内存发出写请求,直到th1=1为止。
DDR内存的空满由读写地址的比较得出,并且要提前几个时钟周期置出。非空标志由这样的地址比较得出:rdaddr/= wraddr-2 and rdaddr/= wraddr-1 and rdaddr/=wraddra;非满标志由这样的地址比较得出: wraddr+2/=rdaddr and wraddr+3/=rdaddr and rdaddr/= wraddr+1。
读请求rd_req产生条件是: ①DDR内存非空,DDR内存满且th2=0;
②DDR内存非空,DDR内存非满且th1=1至th2=1。
写请求wr_req产生条件是:①DDR内存非满,DDR内存空;
②DDR内存非满,DDR内存非空且th2=1至th1=1。
DDR内存模块的地址产生逻辑使用VHDL语言在Quartus II 4.1上实现,最后编程例化到Altera公司的Stratix GX系列FPGA中物理实现。具体仿真波形详见图2。
图 2 DDR内存模块地址产生程序的信号仿真波形
仿真说明:输入时钟为150M,复位信号高有效,ready为DDR控制器准备好信号,th1=1表示出口FIFO几乎空,在DDR内存非空时,应该读DDR内存;th2=1表示出口FIFO几乎满,在DDR内存非满时,应该写DDR内存;输出数据为读请求信号rdreq,写请求信号wrreq,输出地址信号ddraddr(为仿真方便,仿真时的地址位宽设定为5bit)。
通过仿真从Quartus II 4.1的报告中可以看到如此设计的时钟可以最高达到162.92MHz,符合设计要求的150MHz。其它功能要求也能满足。
5.结束语
本文根据电子系统对高速大容量内存的需要,使用成熟商业化DDR控制器IP核来设计独立的DDR内存接口模块,不仅能从控制的细节中解脱出来,专注于系统的关键功能设计,并且能够获得更高的性能,完全满足我们的功能性能需要。经测试该设计性能稳定,整个工作流程简单实用,符合设计要求。
参考文献
1 stratix_GX_datasheet. Altera公司,2003
2 Double Data Rate(DDR)SDRAM Handbook.Micron公司,2004
3边计年,薛宏熙.用VHDL设计电子线路[M].北京:清华大学出版社,2000