其他分享
首页 > 其他分享> > 基于Vivado MIG IP核的DDR3控制器

基于Vivado MIG IP核的DDR3控制器

作者:互联网

一、前言

由于DDR3的控制时序相当复杂,为了方便用户开发DDR3的读写应用程序,Xilinx官方就提供了一个MIG(Memory Interface Generator) IP核,它可以为用户生成一个DDR3控制器。该控制器结构如下:

在这里插入图片描述
它提供了用户接口(左侧),内部会将用户接口接收到的时序转换成DDR3所需的真正时序,并通过物理端(右侧)的接口连接到DDR3。由于用户接口的时序比较简单,因此该控制器就隐藏了极其复杂的DDR3的控制时序,让用户只需要按照用户端的时序来操作就可以对DDR3进行相应的读写。

二、MIG IP核配置

1、第一步:查找IP核在这里插入图片描述
2、第二步:

在这里插入图片描述

3、第三步:选择以下器件型号,就代表生成的IP不止支持之前已经选择的器件型号,还兼容下面选择的器件型号。

在这里插入图片描述

4、第四步:选择内存类型为DDR3

在这里插入图片描述

5、第五步:DDR3控制器选项设置

在这里插入图片描述
在这里插入图片描述

6、第六步:DDR3选项设置

在这里插入图片描述

7、第七步:
8、第八步:选择终端电阻的阻抗为50欧姆,这是由核心板的硬件设计决定的

在这里插入图片描述

9、第九步:引脚分配

对DDR控制器进行管脚分配,在这里我们选择 Fixed Pine Out,通过读取XDC文件中的引脚分配信息给DDR3分配引脚。
在这里插入图片描述
在这一界面中,选择 Read XDC/UCF为控制器分配引脚,在弹出界面选择我们为用户提供的引脚分配的XDC文件。读取完XDC文件后,点击Validate就可以验证管脚分配是否合理。
在这里插入图片描述
接下来后面一路点击OK或者Next就可以生成所需的IP核了。

三、引脚说明

生成的IP核DDR3_CONTROL会有两组接口:

前面说过,MIG会将从Application interface ports接收到的信号在内部进行时序转换,变成直接控制DDR的时序,由Memory interface ports 输出给DDR3,这个逻辑一定要清楚。

下面打开IP核DDR3_CONTROL的例化模板,介绍下各个端口的作用:

DDR3_CONTROL u_DDR3_CONTROL
      (
// Memory interface ports ddr端接口

       .ddr3_addr                      (ddr3_addr),//output [14:0]行列地址
       .ddr3_ba                        (ddr3_ba),//output [2:0]bank地址
       .ddr3_cas_n                     (ddr3_cas_n),//output列地址选通
       .ddr3_ck_n                      (ddr3_ck_n),//output [0:0]差分时钟p端
       .ddr3_ck_p                      (ddr3_ck_p),//output [0:0]差分时钟n端
       .ddr3_cke                       (ddr3_cke),//output [0:0]时钟有效
       .ddr3_ras_n                     (ddr3_ras_n),//output行地址选通
       .ddr3_we_n                      (ddr3_we_n),//output 0-写允许,1-读允许
       .ddr3_dq                        (ddr3_dq),//inout [31:0] 数据
       .ddr3_dqs_n                     (ddr3_dqs_n),//inout [3:0] 数据选取脉冲
       .ddr3_dqs_p                     (ddr3_dqs_p),//inout [3:0] 数据选取脉冲
       .ddr3_reset_n                   (ddr3_reset_n),//output 复位信号
       .init_calib_complete            (init_calib_complete),//output ddr3 初始化完成信号
       .ddr3_cs_n                      (ddr3_cs_n),//output [0:0] 片选信号,低表示命令有效,否则命令屏蔽
       .ddr3_dm                        (ddr3_dm),//output [3:0] 数据掩码 一位控制一个字节
                                                 //数据是32位,所以刚好是四位
       .ddr3_odt                       (ddr3_odt),//output [0:0] 片上终端使能


// Application interface ports 用户端接口
       .app_addr                       (app_addr),//命令总线,3’b000表示写命令,3’b001表示读命令
       .app_cmd                        (app_cmd),//将要访问的DDR内存地址,具体位宽与用户生成IP核时的设置有关
       //高电平有效
       .app_en                         (app_en),//命令使能信号,该信号有效且app_rdy有效时,命令才能被使用
       .app_wdf_data                   (app_wdf_data),//用户写入IP核的256bit数据
       //高电平有效
       .app_wdf_end                    (app_wdf_end),//该信号有效时,表示当前是一次DDR写突发的最后一个数据
       //高电平有效
       .app_wdf_wren                   (app_wdf_wren),//写数据有效信号,当app_wdf_rdy也为有效时,
                                                      //IP核才会接收到用户端发送的app_wdf_data
       .app_rd_data                    (app_rd_data),//从DDR中读出得数据,一次突发读出8个32bit数据
       .app_rd_data_end                (app_rd_data_end),//指示当前数据是突发读写的最后一个周期的数据,
       //高电平有效                                       //这个信号与设置的用户时钟和DDR时钟的比例有关
       .app_rd_data_valid              (app_rd_data_valid),//读出数据有效信号,该信号为高时表示从IP核中读出的数据有效
       //高电平有效
       .app_rdy                        (app_rdy),//空闲信号,指示当前IP核的工作状态,只有该信号为高时,
                                                 //IP核才能正确的使用用户给出的命令
       //高电平有效
       .app_wdf_rdy                    (app_wdf_rdy),//写空闲信号,IP核内部的写FIFO能够接收用户数据的标志
       
       .app_sr_req                     (1'b0),//一系列的请求信号,一般为0 代表用户对MIG IP没有强力干预
       .app_ref_req                    (1'b0),
       .app_zq_req                     (1'b0),
       .app_sr_active                  (app_sr_active),//上面请求的响应信号
       .app_ref_ack                    (app_ref_ack),
       .app_zq_ack                     (app_zq_ack),
       
       .ui_clk                         (clk),//IP核提供给用户端使用的clk,和ddr3_ck_n/p的比例是1:2或者1:4
       //低电平有效
       .ui_clk_sync_rst                (rst),//是ui_clk的复位信号,当该信号拉低的时候表示ui_clk已经复位完成;
       .app_wdf_mask                   (app_wdf_mask),//32bit数据掩码,每一位对应app_wdf_data的一个8bit数据

// System Clock Ports
       .sys_clk_p                       (sys_clk_p),//系统的差分时钟
       .sys_clk_n                       (sys_clk_n),
       .device_temp                     (device_temp),
       `ifdef SKIP_CALIB
       .calib_tap_req                    (calib_tap_req),
       .calib_tap_load                   (calib_tap_load),
       .calib_tap_addr                   (calib_tap_addr),
       .calib_tap_val                    (calib_tap_val),
       .calib_tap_load_done              (calib_tap_load_done),
       `endif
       .sys_rst                          (sys_rst)//复位信号
       );

各个端口具体是啥意思,已经在注释中写清楚了,至于更加详细的时序,之后有机会再说吧!!!

标签:ddr3,clk,DDR3,app,MIG,Vivado,IP,时钟
来源: https://blog.csdn.net/qq_39507748/article/details/120388978