ISE版本14.7,开发板型号ML605,芯片XC6VLX240T-1ff1156
1.开发板上的SDRAM型号为SODIMMS MT4JSF6464HY-1G1
容量:512MB
row:13 col:10 bank:3(8个) 数据位宽:64bit
容量大小的计算=2^13 * 2^10 * 8(bank) * 64(bit) = 4Gb = 512MB
2.DDR3接口的研究
ddr3_dq:数据输入输出,64位
ddr3_addr:地址输入(行列复用),13位
ddr3_ba:存储堆积地址(页),3位
ddr3_ras_n:行选通
ddr3_cas_n:列选通
ddr3_we_n:写有效
ddr3_reset_n:复位
ddr3_cke:时钟使能
ddr3_odt:终结电阻器,在DRAM颗粒工作时把终结电阻器关掉,而对于不工作的DRAM颗粒则打开终结电阻,减少信号的反射
ddr3_cs_n:片选
ddr3_dm:数据掩码,需要和DQ,DQS配合输入
ddr3_dqs_p、ddr3_dqs_n:高低位数据选通
sys_clk_p、sys_clk_n:差分时钟输入
clk_ref_p、clk_ref_n:参考时钟
鉴于ML605的UCF中没有电压约束,将电压约束copy下
NET "ddr3_dq[*]" IOSTANDARD = SSTL15_T_DCI;
NET "ddr3_addr[*]" IOSTANDARD = SSTL15;
NET "ddr3_ba[*]" IOSTANDARD = SSTL15;
NET "ddr3_ras_n" IOSTANDARD = SSTL15;
NET "ddr3_cas_n" IOSTANDARD = SSTL15;
NET "ddr3_we_n" IOSTANDARD = SSTL15;
NET "ddr3_reset_n" IOSTANDARD = LVCMOS15;
NET "ddr3_cke[*]" IOSTANDARD = SSTL15;
NET "ddr3_odt[*]" IOSTANDARD = SSTL15;
NET "ddr3_cs_n[*]" IOSTANDARD = SSTL15;
NET "ddr3_dm[*]" IOSTANDARD = SSTL15;
NET "sys_clk_p" IOSTANDARD = LVDS_25;
NET "sys_clk_n" IOSTANDARD = LVDS_25;
NET "clk_ref_p" IOSTANDARD = LVDS_25;
NET "clk_ref_n" IOSTANDARD = LVDS_25;
NET "sda" IOSTANDARD = LVCMOS25;
NET "scl" IOSTANDARD = LVCMOS25;
NET "sys_rst" IOSTANDARD = LVCMOS25;
NET "phy_init_done" IOSTANDARD = LVCMOS25;
NET "ddr3_dqs_p[*]" IOSTANDARD = DIFF_SSTL15_T_DCI;
NET "ddr3_dqs_n[*]" IOSTANDARD = DIFF_SSTL15_T_DCI;
NET "ddr3_ck_p[*]" IOSTANDARD = DIFF_SSTL15;
NET "ddr3_ck_n[*]" IOSTANDARD = DIFF_SSTL15;
3.MIG接口
mig是Xilinx公司的仿真工具ISE软件中提供的便于用户使用的ip核,主要用于DDR等存储设备的控制时序转换,提供用户接口。
我们需要关注的是其提供的用户接口而不需要具体了解其如何控制DDR3,主要的控制接口如下(DDR3.v):
input sys_clk_p, //differential system clocks
input sys_clk_n,
input clk_ref_p, //differential iodelayctrl clk
input clk_ref_n,
inout sda,
output scl,
input app_wdf_wren,
input [(4*PAYLOAD_WIDTH)-1:0] app_wdf_data,
input [(4*PAYLOAD_WIDTH)/8-1:0] app_wdf_mask,
input app_wdf_end,
input [ADDR_WIDTH-1:0] app_addr,
input [2:0] app_cmd,
input app_en,
output app_rdy,
output app_wdf_rdy,
output [(4*PAYLOAD_WIDTH)-1:0] app_rd_data,
output app_rd_data_end,
output app_rd_data_valid,
output ui_clk_sync_rst,
output ui_clk,
output phy_init_done,
input sys_rst // System reset
app_wdf_wren:写入的数据接口app_wdf_data的使能,拉高时app_wdf_data有效
app_wdf_data:写入的数据
app_wdf_end:不用考虑,功能时序与app_wdf_wren相同
app_addr:操作地址=bank+row+column(与生成核时候选择有关)
app_cmd:0为写入,1为读出
app_en:操作地址app_addr的使能信号
其他输入:
sys_clk:输入时钟信号
clk_ref:参考时钟,一般就可以为sys_clk
app_wdf_mask:默认为0即可
关键输出:
app_rdy:输出端口,1有效,表示mig准备接受数据和命令
app_wdf_rdy:输出端口,表示mig准备接受写数据和写命令,1有效
app_rd_data:数据输出端口,只有在app_rd_data_valid输出为1时才有效
app_rd_data_end:基本无意义
app_rd_data_valid:读出数据有效
ui_clk_sync_rst:同步复位输出,为0时才能接受控制操作
ui_clk:同步时钟输出
phy_init_done:mig物理层初始化和校准标志输出,为1时,表示完成
4.MIG时序
写时序:
phy_init_done拉高时,表示mig已经初始化完成
在app_rdy和app_wdf_rdy同时为1时,mig才能接受写命令
此时将app_en,app_wdf_wren和app_wdf-end置1,在app_cmd输入“000”,在app_addr输入相应地址,app_wdf_data输入相应数据
读时序:
app_rdy为1,将app_en置1
同时app_cmd输入“001”,app_addr输入相应的读地址,只有在app_rd_data_valid为1时,读出的数据才有效
5..do仿真
在modelsim和ise库关联完成后,在...\ipcore_dir\DDR3\example_design\sim文件夹中简历modelsim工程,并修改其中相关语句为:
vlog +incdir+. +define+x2Gb +define+sg15E +define+x8 -suppress 2902 ddr3_model.v
之后在modelsim中输入
do sim.do
即可观察波形。