最近做项目需要利用的DDR3存储芯片先缓存一级数据,然后再读入FPGA中进行处理,所以先在这里记录一下学习使用Xilinx开发的MIG控制核来完成对DDR3读写的过程。
DDR3芯片知识
在使用FPGA对DDR3读写之前,需要先了解一下DDR3芯片的一些基本概念,然后才能去配置相应的MIG IP核。
DDR3是第三代动态随机存储器SDRAM(Synchronous DRAM)的简称,DDR(double data rate)是双数据速率的意思,指的是在时钟上升沿与下降沿各传输一次数据.下面我主要以镁光的MT41K256M16为例来介绍DDR3内存芯片.
DDR3命名介绍
由上面两图可以知道某一型号的DDR3芯片的芯片位宽,bank数目,一个bank内的行数和列数等信息.以MT41K256M16为例,该芯片的芯片位宽为16bits,也就是说每次输出16bits位宽的数据,一个芯片内有8个banks,一个banks内有32K行,1K列,所以该芯片的存储容量为521MB.
芯片的接口
DDR3的各种频率介绍
主要概念有三个:核心频率,工作频率和传输频率.核心频率指的是DDR3芯片内部进行逻辑处理的时钟频率,工作频率指的是DDR3芯片时钟引脚上接的时钟频率.传输频率又叫传输速率,是指数据引脚上数据的传输速率.三种频率关系在下图中有个直观的表示:
对于DDR3而言,工作频率=传输速率/2 . 核心频率=工作频率/4.
DDR3的预读取和突发长度
1.预读取
预读取(prefetch)是进入DDR时代有的技术,在SDRAM中并没有此技术.DDR是两位预取(2-bit Prefetch),有的公司则贴切的称之为2-n Prefetch(n代表芯片位宽)。DDR2是四位预取(4-bit Prefetch),DDR3和DDR4都是八位预取(8-bit Prefetch)。而8-bit Prefetch可以使得内核时钟是DDR时钟的四分之一,这也是Prefetch的根本意义所在。
上图展示了8位预读取的过程,在一个核心时钟周期内从一个存储单元内并行的读取8个n bits的数据,然后在引脚时钟的驱动下,将这8个数据在引脚时钟的上下沿将数据传输出去,因为引脚时钟频率:核心时钟频率=4:1,所以在一个核心时钟周期内可以将这8个数据通过数据引脚传输出去.
同时因为DDR3是8位预读取,所以在一个存储单元内可以存储8n bits的数据,也就是说,给DDR3指定一个地址,可以往这个地址里读或写8n bits的数据.
2.突发长度
突发长度(Burst Length)在SDRAM中指的是在同一行中相邻存储单元连续传输的列数,在DDR SDRAM中不再指连续传输的列数,而是指连续传输的周期数.在DDR3中因为是8位预读取,所以DDR3的突发长度为8.
DDR3读写的地址偏移
介绍完预读取和突发长度的概念后,终于可以介绍一些深入的问题,也就是刚开始做读写测试时一直困扰我的问题.上面说给DDR3指定一个地址,可以往这个地址里读或写8*n bits的数据.按理说我要读写下一地址,只要地址加1就可以.但仿真时地址加1得到的数据都是乱的.要想正常读写数据,需要每次地址加8,这是为什么呢?
我们可以看一下这个DDR3的内部结构图,从这个图中我们可以看出10bit的Column Address的寻址能力只有128,只有7bits用于列地址译码!列地址0,1,2并没有用,而这列地址的低三位被用于确定Burst Length 与Burst Order了.见下图:
所以列地址的低三位并没有用于寻址,所以如果我们想要访问下一存储单元的话,地址需要加8而不是加1.
总结
好了.以上就是需要掌握关于DDR3的全部基础知识了,至于其他的像预充电(Precharge),数据掩码(DQM),数据选通信号(DQS),ODT(On-Die Termination)技术我认为不是必须要掌握的,需要用的时候可以再看看.至于芯片引脚上的时序,会由MIG控制核来帮助我们把引脚时序调整好,感兴趣的可以看看JEDEC官方文档,这里也不做介绍了.下面我将介绍如何配置MIG IP核.