全文 3 FPGA对DDR SDRAM的控制
本设计中使用的FPGA是ALTERA公司的cyclone II系列的EP2C20F484C6。对内存条的工作模式设置为BL=4,CL=3,如图7为FPGA对DDR SD-RAM的控制模块框图。
其中,Clkin为外部输入的时钟信号,为了使FPGA到DDR SDRAM的两对时钟信号的质量尽量好,使用FPGA内部的两个锁相环输出差分时钟信号。为了保证锁相环输出的两路差分信号相位一致,在设计PCB时我们使晶振输出到FPGA两个PLL输入的布线距离相等,为了保证两个锁相环输出信号到达DDR SDRAM接口时相位一致,由FPGA锁相环输出到DDR SDRAM的接口布线长度相等。
控制模块采用的工作模式是按照图2所示的状态来跳转,上电以后首先是对DDR SDRAM进行初始化,初始化完成以后就可以进出等待工作的状态。此时刷新计数器开始计数,等待7.8 us后给出刷新请求,在空闲状态时(IDEL)刷新请求的优先级最高,响应刷新请求后执行REFR-ESH指令同时复位刷新计数器。初始化后如果FIF00的读空标志为O说明FIF00中有数据,此时可以进入到写状态。由于采用的是BL=4的工作状态,写操作每次都写入4个64位的数。所以,我们将输入的数据进行并位成256位的数,每次写操作只需要从FIF00中读出一个256位的数。假设我们采用1OOMHz的时钟,每写4个64位的数大概需要10个时钟周期。如果输入的数据位宽为16位,那么由外部传给FPGA的数据率要小于160 MHz。写操作完成的时候进入空闲状态,等待刷新标志或者读空标志。读的时候需要等待系统发出读命令(read),然后进入读状态,读出的数据由Ddrout[127:O]送到FIF01和FIF02中。通过控制FIF01和FIF02的写请求信号来实现将数据分别写入。读的时候BL=4每次读出4个64位数,执行一次读操作大约需要10个时钟周期。如果输出的数据位宽为16位,那么数据由FPGA向外传输的速率要小于160 MHzo控制模块在读写内存条的时候控制数据模块来实现数据率为时钟速度的两倍,数据模块使用两个时钟一个是系统时钟一个是2倍的系统时钟。
因为DDR SDRAM的控制相对复杂,我们可以使用内存条的vefilog模型,通过对内存条的vefilog仿真,我们可以知道自己程序的正确性,图8为modelsim中的仿真波形。如果仿真过程正确,我就可以对程序进行编译,布局布线,然后下载到FPGA中,由于布局布线的延时,输出的信号波形与仿真波形不一致,此时,可以通过调整FPGA内部的锁相环来调整时序,实现对内存条的控制。
4 结束语
通过介绍内存条的工作原理,以及内存条电路设计时的注意事项的介绍,我们可以更合理的实现FPGA与内存条的互连。最后,给出FPGA内部对内存条控制的方法,以及给出仿真波形,实现对内存条的控制。实现FPGA对DDRSDRAM内存条的控制,可以实现大容量高速的数据存储,在工程中的得到广泛的应用。