FPGA实现DDRIP核高速读写(3)

FPGA实现DDRIP核高速读写(3)

在前面两个讲了DDR的基本工作原理和仿真,这里来实现数据的读写。高速的读写要参考官方文档UG086.这里有对申请的IP核结构有着详细的解释。
DDR官方IP主要有时钟部分、用户接口部分、控制部分和驱动部分组成。下图是采样外部参考时钟的DDR2内存控制核的结构。这里大部分工作都已经在IP核内实现,用户只需要在用户接口层来对IP进行控制即可。
FPGA实现DDRIP核高速读写(3)
上图中左侧接口为用户接口,这些接口的意义如下图所示:
FPGA实现DDRIP核高速读写(3)
在DDR2控制中时钟是一个很重要的部分。由于DDR2时钟频率较高,采用双沿双速率进行数据传输,因此对时钟的精度和稳定度要求很高,如果时钟抖动较大会导致数据读写错误,因此大多数情况下采用外部输入差分时钟能在很大程度上减少数据的误码率。时钟处理转换过程如下图:
FPGA实现DDRIP核高速读写(3)
理解了时钟的处理后首先要知道读写数据的缓存大小,在一次突发传输读写时数据量尽量小于BUFF的长度,这样就避免写入或者读出数据满这个情况,能很大程度减小控制代码的复杂度。
FPGA实现DDRIP核高速读写(3)
在写入数据和命令时主时钟采用clk_tb,这个时钟来自于IP核内部,写入数据时写地址、写命令和写地址使能要同步,并且写入数据数量和地址增量要对应,不然容易出现数据多写入或者少写入(写地址和数据采用独立的BUFF和时序),写入数据时序如下图:
FPGA实现DDRIP核高速读写(3)
数据的读出时序想读简单,但是需要注意由于刷新操作的存在会导致数据读出时存在中断的过程,数据的有效要根据rd_data_valid标志位判断。数据读出框架如下图:
FPGA实现DDRIP核高速读写(3)
数据突发读出时地址、命令和读有效位时序要保持一致,而数据的读出是根据rd_data_valid标志位判断数据的有效性。数据读出时序如下图:
FPGA实现DDRIP核高速读写(3)
通过实现上面的时序即完成了DDR时序的设计,但是要想DDR2稳定的工作还需要根据官方提供的时序对布局布线进行约束,DDR2的约束主要是对时钟、控制线这些路径约束,这里根据代码层次对在.ufc文件内加入约束。部分约束如下图所示:
FPGA实现DDRIP核高速读写(3)
通过上面设计完成了DDR的高速读写,经过实际测试数据能准确的读写。