对于DDR系列存储器的使用,常常会直接例化成熟的IP,Quartus II中可以调用DDR2 SDRAM Controller with ALTMEMPHY,Vivado中则可以调用MIG,在数字IC领域也有相关的IP核可以直接使用,一定程度上避开了了DDR接口设计这个难题,而进一步对IP核进行封装可以使DDR的使用更加简单。但出于学习的目的,在本系列文章中选择使用代码实现DDR2 SDRAM的控制器,在后续DDR3 SDRAM的学习中再使用IP核。
一、接口
采用镁光公司提供的DDR2 SDRAM的仿真模型,其接口如下。
module ddr2 (
ck ,
ck_n ,
cke ,
cs_n ,
ras_n ,
cas_n ,
we_n ,
dm_rdqs ,
ba ,
addr ,
dq ,
dqs ,
dqs_n ,
rdqs_n ,
odt
);
接口具体说明如下表。
接口 |
类型 |
描述 |
---|---|---|
ck, ck_n |
IN |
差分时钟输入。所有地址和控制输入信号都在ck的正边沿和ck_n的负边沿交叉点上被采样。输出数据(dq和dqs/dqs_n)是参照ck和ck_n的交叉点。 |
cke |
IN |
时钟使能。高电平时启用DDR2 SDRAM上的时钟电路,低电平时禁用时钟电路,被启用/禁用的具体电路取决于DDR2 SDRAM的配置和操作模式。 |
cs_n |
IN |
片选信号(低电平有效),被视为命令代码的一部分。当cs_n为高电平时,所有命令都被屏蔽。 |
ras_n, cas_n, we_n |
IN |
命令。ras_n, cas_n和we_n(连同cs_n)定义了输入给DDR的命令。 |
dm_rdqs |
I/O |
数据掩码。dm_rdqs是读写数据的掩码信号,每bit掩码信号控制8bit的数据信号,当dm_rdqs与输入数据一同被采样为高电平时,输入数据将被掩码。dm_rdqs在dqs的两个边沿上都被采样。 |
ba |
IN |
存储bank地址。定义了ACTIVATE、READ、WRITE或PRECHARGE命令正在被应用到哪个存储bank;还定义了在LOAD MODE命令期间加载的模式寄存器,包括MR、EMR、EMR(2)和EMR(3)。 |
addr |
IN |
地址。为ACTIVATE命令提供行地址,为READ/WRITE命令提供列地址和自动预充电位(A10),以在相应存储bank中选择一个存储位置。 |
dq |