Xilinx VIVADO中DDR3 IP核的使用(2)

项目简述

该项目的描述是,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**********************************
//================================================================
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值