VIVADO 中基于mig IP完成DDR3的循环测试
项目简述
该项目的描述是,FPGA向DDR3芯片写入数据,然后再读出数据,从而验证读写模块的正确性。该项目具有一定的实际意义,就是我们新制作的一块FPGA板卡,最有可能出问题的部分就是DDR芯片,因为DDR的实际属于高速设计,然后我们将对应的循环测试的程序下载进去,验证我们硬件板卡的正确性。通过本项目,我们可以学到VIVADO MIG的读写DDR3的方法,便可以掌握VIVADO 操作DDR3的操作流程。
本次实验所用到的软件环境:
1、VIVADO2019.1软件开发环境
2、modelsim仿真环境
3、米联客MA7035FA
MIG接口的简单描述
对于生成的MIG IP核,我们现在对其接口信号做出相应的描述,以便于大家可以充分理解信号的作用,
mig_7series_0 mig_7series_0_inst (
// Memory interface ports
.ddr3_addr (ddr3_addr ), // output [13:0] ddr3_addr
.ddr3_ba (ddr3_ba ), // output [2:0] ddr3_ba
.ddr3_cas_n (ddr3_cas_n ), // output ddr3_cas_n
.ddr3_ck_n (ddr3_ck_n ), // output [0:0] ddr3_ck_n
.ddr3_ck_p (ddr3_ck_p ), // output [0:0] ddr3_ck_p
.ddr3_cke (ddr3_cke ), // output [0:0] ddr3_cke
.ddr3_ras_n (ddr3_ras_n ), // output ddr3_ras_n
.ddr3_reset_n (ddr3_reset_n ), // output ddr3_reset_n
.ddr3_we_n (ddr3_we_n ), // output ddr3_we_n
.ddr3_dq (ddr3_dq ), // inout [31:0] ddr3_dq
.ddr3_dqs_n (ddr3_dqs_n ), // inout [3:0] ddr3_dqs_n
.ddr3_dqs_p (ddr3_dqs_p ), // inout [3:0] ddr3_dqs_p
.init_calib_complete (init_calib_complete ), // output init_calib_complete
.ddr3_cs_n (ddr3_cs_n ), // output [0:0] ddr3_cs_n
.ddr3_dm (ddr3_dm ), // output [3:0] ddr3_dm
.ddr3_odt (ddr3_odt ), // output [0:0] ddr3_odt
// Application interface ports
.app_addr ( ), // input [27:0] app_addr
.app_cmd ( ), // input [2:0] app_cmd
.app_en ( ), // input app_en
.app_wdf_data ( ), // input [255:0] app_wdf_data
.app_wdf_end ( ), // input app_wdf_end
.app_wdf_wren ( ), // input app_wdf_wren
.app_rd_data ( ), // output [255:0] app_rd_data
.app_rd_data_end ( ), // output app_rd_data_end
.app_rd_data_valid ( ), // output app_rd_data_valid
.app_rdy ( ), // output app_rdy
.app_wdf_rdy ( ), // output app_wdf_rdy
.app_sr_req (1'b0 ), // input app_sr_req
.app_ref_req (1'b0 ), // input app_ref_req
.app_zq_req (1'b0 ), // input app_zq_req
.app_sr_active ( ), // output app_sr_active
.app_ref_ack ( ), // output app_ref_ack
.app_zq_ack ( ), // output app_zq_ack
.ui_clk (ui_clk ), // output ui_clk
.ui_clk_sync_rst (ui_clk_sync_rst ), // output ui_clk_sync_rst
.app_wdf_mask (app_wdf_mask ), // input [31:0] app_wdf_mask
// System Clock Ports
.sys_clk_i (clk_200m ),
.sys_rst (locked ) // input sys_rst
);
查阅技术手册,我们对上面的信号做系列陈述:
1、所有前缀是ddr3的信号,都是与DDR硬件连接的信号,具体含义参考DDR的数据手册,相信如果大家学过SDRAM控制器,对下面的信号很熟悉:
ddr3_addr
ddr3_ba
ddr3_cas_n
ddr3_ck_n
ddr3_ck_p
ddr3_cke
ddr3_ras_n
ddr3_reset_n
ddr3_we_n
ddr3_dq
ddr3_dqs_n
ddr3_dqs_p
init_calib_complete
ddr3_cs_n
ddr3_dm
ddr3_odt
2、init_calib_complete信号,MIG IP核的初始化信号,MIG自我配置成功之后,该信号拉高,对DDR的操作必须等到该位拉高之后进行
3、app_addr信号,提供给我们的地址信号,注意这里与ISE中的不太一样,ISE中的是字节地址,而vivado对应DDR3的实际地址
4、app_cmd信号,用户给DDR芯片的读写命令信号,0是写命令,1是读命令
5、app_en信号,命令路径的使能信号,该信号有效时,app_cmd、app_addr信号才有效,其余的时刻信号无效
6、app_wdf_data信号、数据路径的数据信号
7、app_wdf_end信号,数据一次突发结束信号,4:1模式下与app_wdf_wren相同,2:1模式下app_wdf_wren每两个app_wdf_end使能一次
8、app_wdf_wren信号,写路径数据的有效信号
9、app_wdf_rdy信号,MIG信号给用户的信号,在该信号与app_wdf_wren信号同时有效时,数据被写入DDR芯片
10、app_rd_data信号,DDR3芯片给用户的数据信号
11、app_rd_data_end信号,DDR3给用户读命令结束信号
12、app_rd_data_valid信号,DDR3芯片给用户数据有效信号
13、app_rdy信号,命令路径准备好接受用户的命令信号,与app_en有效时命令有效
14、app_sr_req 、app_ref_req、app_zq_req信号,一系列的请求信号,一般为0代表用户对MIG IP没有强力干预
15、app_sr_active、app_ref_ack、app_zq_ack信号,上面请求的响应信号
16、ui_clk信号,MIG给用户使用的时钟,用户对MIG IP核的操作必须使用该时钟
17、ui_clk_sync_rst信号,MIG给用户使用的复位信号,用户对MIG IP核的操作必须使用该复位信号
18、app_wdf_mask信号,写数据的掩码
19、sys_clk_i信号,MIG的系统时钟,在MIG的选项中选择了200MHz
20、sys_rst信号,MIG IP核的复位信号,与系统时钟相关联
MIG IP的读写时序
我们从技术手册中查找写时序的图形如下:
当用户逻辑 app_en 信号有效并且 app_rdy 信号有效时,命令被 接受并写入 FIFO。
当 app_rdy 被取消置位时,用户逻辑需要将 app_en 保持为高电平以及有效的命
令和地址值,直到 app_rdy 有效。
此图描述了 app_wdf_data , app_wdf_wren 和 app_wdf_end 信号的三种场景,
如下所示:
1.写入数据以及相应的写入命令( BL8 的下半部分)。
2.写入数据在相应的写入命令之前。
3.写入数据在相应的写命令之后,不应超过两个时钟周期的限制。
对于在写入命令后输出的写入数据,如注 3 所示,最大延迟为两个时钟周期。
上面的模式时no-back-back模式,当是back-back模式的情况下,没有最大延迟的限制
上面便是back-back模式,通俗来讲就是命令是连续的。
读时序如上图,读取的数据由 MIG以请求的顺序返回,并且在 app_rd_data_valid 有效时数据有效。app_rd_data_end 信号表示每个读命令脉冲串的结束,在用户逻辑中不需要。
MIG IP循环校验设计时序
读写设计的时序如下图,以下两张图是一个模块的时序设计图,为了观看方便我们截了两张图片:
有了上面的时序图,我们可以比较方便的设计出响应的逻辑代码。
MIG IP的读写循环代码
ddr3_top模块:
`timescale 1ns / 1ps
// *********************************************************************************
// Project Name : OSXXXX
// Author : zhangningning
// Email : nnzhang1996@foxmail.com
// Website :
// Module Name : ddr3_top.v
// Create Time : 2020-02-27 23:16:16
// Editor : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date By Version Change Description
// -----------------------------------------------------------------------
// XXXX zhangningning 1.0 Original
//
// *********************************************************************************
module ddr3_top(
//System Interfaces
input sclk ,
input rst_n ,
//DDR3 Interfaces
output wire [13:0] ddr3_addr ,
output wire [ 2:0] ddr3_ba ,
output wire ddr3_cas_n ,
output wire ddr3_ck_n ,
output wire ddr3_ck_p ,
output wire ddr3_cke ,
output wire ddr3_ras_n ,
output wire ddr3_reset_n ,
output wire ddr3_we_n ,
inout [31:0] ddr3_dq ,
inout [ 3:0] ddr3_dqs_n ,
inout [ 3:0] ddr3_dqs_p ,
output wire [ 0:0] ddr3_cs_n ,
output wire [ 3:0] ddr3_dm ,
output wire [ 0:0] ddr3_odt
);
//========================================================================================\
//**************Define Parameter and Internal Signals**********************************
//================================================================