目录

1、前言

1.1、关于数据、地址等接口位宽说明

1.2、DDR3读写时序理解

2、仿真实例

2.1、IP配置

2.2、仿真模型搭建

2.2.1、IPcore实例化

2.2.2、添加仿真模型

2.2.3、testbench测试激励

2.2.4、顶层top示例

2.2.5、testbench

2.2.6、CTRL模块

2.2.7、工程文件

3、总结


问题记录:

(1)K7系列的DDR3 MIG IP其官方提供的example示例工程可以直接在vivado下进行仿真。但KU系列的FPGA其DDR3 IP 提供的example示例工程直接进行仿真会存在问题,KU的DDR4 IP提供的example示例工程直接仿真不存在问题。

(2)如果在always语句里判断APP_RDY来发APP_CMD、APP_EN的话,如下图CNT=6的RD_REQ发出之后、APP_RDY迅速拉低了,导致第6个RD_REQ没有被DDR MIG所接受。因此,这里需要做一些处理。

(3)DDR MIG APP_RDY在刷新和周期性读访问的时候回拉低,周期性读访问导致的低电平持续336ns左右。

1、前言

一般使用do.sim.do文件,仅是为了方便分析、理解IP的使用访问时序。如何使用modelsim运行do.sim.do,这里就不做介绍。百度一下,很简单。如果仅是看do.sim.do的波形,你可能看不懂它在干什么。

为了更深入的理解IP的使用,最好是自己写testbench测试文件,搭仿真模型。

关于 DDR3 IP的配置过程,可以参考文献1/2;为了便于小白参考,综合考虑,本文提供完整的IP配置流程吧。

在IP配置过程中,需要注意一点,数据位宽、仿真模型型号、主钟,不可以随便选。否则可能会导致仿真模型不能正确响应你写的激励信号,或者出现IP一直初始化不成功等问题。

关于IP 的用户接口控制时序,可以参考文献3。在本文最后,提供完整的工程代码下载链接;若能提供些许帮助,还望读者五星好评一下。Thank you so much!

1.1、关于数据、地址等接口位宽说明

(1)在generate MIG IP的过程中,用户是可以自己选择芯片的数据位宽。如配置成64位,即DDR芯片的DQ数据总线位宽为64位,如下图顶层所示,inout、output端口是连接到DDR3 芯片上的管脚。

(2)用户接口数据位宽相关说明

用户地址app_addr[29-1:0]:位宽== RANK_WIDTH + BANK_WIDTH  + ROW_WIDTH + COL_WIDTH;详细见IP生成的example_design_top文件。
用户数据app_rd_data[512-1:0]:下图中有计算公式:2*4*64=512。

因为DDR的burst突发机制,突发长度为8,即每次给MIG发一个写指令app_cmd,MIG会自动从起始地址app_addr向DDR3芯片中连续写入8个数据。如app_addr起始地址是0,写数据是app_wdf_data = {64'd8,64'd7,64'd6,64'd5,64'd4,64'd3,64'd2,64'd1},

MIG则会在DDR3芯片地址0-7写入数据1-8.见下图。读机制也类似。

下图是写打印的报告。在下图中前四行似乎是在相同地址连续写了四次???注意前四行的开头,它们其实是我例化了四个DDR 仿真模型。因为仿真模型的数据位宽是16,MIG IP配置的DQ数据位宽是64,所以需要四个仿真模型进行拼接。

下图是读打印的报告

1.2、DDR3读写时序理解

在实际应该中,基本上不需要考虑DDR3芯片的接口控制逻辑。因为这部分逻辑都是由DDR3 MIG IP核自动管理的。

用户实际关系和控制的,是DDR3 MIG IP核的用户接口部分;即通过控制app_cmd等接口逻辑,即可实现对DDR3芯片的数据的正常读写访问。

不过,想深入理解数据是如何写入DDR3芯片的,可以看看这部分。

DDR3芯片型号MT41J256M16HA,芯片手册读写指令截图如下

理论写时序图

仿真写时序图,仿真时序图的写指令还是与手册一致,不过写地址似乎不太一样。至于原因,暂时不太清楚。不过,数据能够正确的写入、正确的读出。这一点看上面仿真模型给的打印报告可以确认。

仿真读时序

手册里的读时序

2、仿真实例

软件版本:vivado2017.4,

芯片型号:见下图

2.1、IP配置

下面有一些被我跳过了,按照默认即可。

1、这里需要注意区分上图中Clock Period时钟是指DDR3芯片时钟,是FPGA输出给DDR3芯片的时钟;

2、Clock Period时钟的四分频(4:1),是用户时钟,800MHZ的四分频是100MHZ,即用户时钟是100MHZ.

3、DDR3芯片的数据位宽,上图配置的是64bit.

MIG是FPGA的硬核资源。若该FPGA芯片中共有6个PLL,在没例化MIG时,这六个PLL都可以被用户例化使用;但若例化了MIG,则用户只能使用剩下的5个PLL资源。如下图所示,在下面的工程中我仅例化了一个PLL和一个DDR3 MIG核,在综合之后显示PLL使用量是“2”,从而验证了上述推论。

 关于上面DDR3芯片的驱动时钟频率,与用户时钟频率之间的关系,进一步补充解释如下图所示:

关于DDR3芯片的数据位宽与MIG核的用户数据位宽之间的关系如下:

因为这里时钟比率选了4:1,DDR3芯片的数据宽度是64bit,并且还是上下沿都能打数据,那么用户数据接口宽度就是64X4X2=512bit。

这里X4是4:1造成的,X2是因为DDR接口上下沿都能打数据,而用户接口不可以这么干,只能老老实实的上沿打数据。

关于系统时钟:上图Input Clock Period是指MIG核的工作时钟(也即系统时钟sys_clk),由于MIG核访问DDR3芯片是采用时钟双沿进行数据传送的,所以在调用MIG核的同时,MIG核会默认占用FPGA芯片的一个PLL IP资源,用于产生DDR3芯片的驱动时钟、MIG核的用户时钟。所以,在介绍Input Clock Period时是将其介绍为PLL input clock(CLKIN),该时钟也就可以理解是MIG核的工作时钟,这个工作时钟需要进一步配置为是单端/差分,如下图所示:

关于参考时钟,因为倍频之后的时钟质量下降,所以还要用没倍频时钟来作为系统运行的基准,计算系统延迟啥的。独立参考时钟或许不接也没问题,这个我没试过。

补充介绍系统时钟sys_clk参考时钟ref_clk,如下图所示。

2.2、仿真模型搭建

工程目录如下,用户逻辑和IP core都在.srcs文件夹里。

点击去,找到 ip -> ddr3_mig,example_design文件夹。

example_design文件夹有官方提供的一个设计实例,有DDR3 芯片的仿真模型和sim.do文件。

example_design文件夹里rtl文件夹,是Verilog代码,里面还有example_top,含有DDR3 IP core的实例化。

example_design文件夹里sim文件夹,放有DDR3芯片的仿真模型,sim.do文件。

2.2.1、IPcore实例化

在example_design--- rtl 文件夹里找到example_top文件,将里面的下面几行代码粘贴复制到你工程的顶层,即完成了对DDR3 IP core的实例化。

(1)clk、rst是DDR3 MIG IP核提供的用户时钟和用户复位信号,高电平复位。

(2)关于系统时钟:sys_clk_i,是FPGA给DDR3 MIG IP core提供的输入时钟(配置MIG IP时配置sys clk nobuffer);若将sys clk配置为差分的,则sys_clk_i会变为sys_clk_p/sys_clk_n。

(3)关于参考时钟:由于在配置MIG核时选择用系统时钟作为参考时钟,所在这里没有ref_clk_i,若是差分参考时钟则是ref_clk_p/ref_clk_n

(4)sys_rst,是DDR3 MIG IP core的复位输入信号。

2.2.2、添加仿真模型

ddr3_model是仿真模型,需要添加到工程仿真文件里;

ddr3_model_parameters,是参数配置,相当于头文件一类的参数,需要添加到工程仿真文件里;

sim_tb_top是官方提供的testbench顶层,里面含有对仿真模型的例化实例,现在打开该文件。

下图就是在sim_tb_top中关于仿真模型的代码。

将下面几行代码粘贴复制到你自己设计的testbench中。

需要注意的是:

(1)下面有一些参数是需要从sim_tb_top前面的一些parameter等参数里去找。最好将那几个参数粘贴复制过去。

(2)下面的信号连线也是需要需该的,修改为top的那些端口,连接到一起就行了。

(3)还是不知道该怎么操作???好吧,下面提供关于仿真模型的搭建代码!

下面generate了4片仿真模型。为啥是4片?还不知道为啥????

再说一遍吧,因为仿真模型的数据位宽是16,DDR3 MIG IP配置的数据位宽是64。所以是4个仿真模型。

2.2.3、testbench测试激励

激励这里我仅是提供了DDR3的时钟输入和复位输入信号。读写控制都放在顶层的CTRL模块里。

如果能实现读写一个burst,则基本就会使用DDR3了。

至于是否要进行板级测试,有条件的可以进行。每有板子的,做仿真跟板卡测试的效果是一样的。

因此,小白们不用担心自己是否有DDR3的板子!

2.2.4、顶层top示例

2.2.5、testbench

2.2.6、CTRL模块

至于这个模块的设计呐,就交给天赋异禀的你了!

因为你必须理解自己想放DDR3里写入什么数据,然后回读回来,才能表明你理解并会用DDR3 MIG IP core了。

按照前一篇博客的时序设计就好。能够实现简单的读写测试即可。

好吧,我还是把前面的时序粘贴在这里吧

写控制时序:

读控制时序:

2.2.7、工程文件

上面都整理完后,工程文件应该是这几个。

3、总结

在配置MIG IP核时,需要注意区分核掌握概念:

小结一:DDR3芯片驱动时钟与用户时钟之间的关系;

小结二:DDR3芯片的数据位宽与MIG核用户数据位宽之间的关系;

小结三:理解MIG核的系统时钟sys_clk(即PLL的输入时钟,这个PLL是MIG核自动占用的一个PLL资源)与参考时钟的概念。

小结四:掌握MIG核用户读写访问指令与时序;

小结五:建立工程,搭建仿真环境,对MIG核进行读写访问。

如果你在仿真波形里,顺利的向DDR3 MIG IP core 发了一个写命令,并顺利的回读出来该数据,则恭喜你,基本掌握DDR3的使用方法。

补充:

ISE中Kintex-7 DDR3 IP core的仿真与vivado应该差不多,再次提醒,不要随便乱选仿真模型、数据位宽、主钟等一类的东西,否则可能会导致仿真模型工作不正常。

至于Sparten6 DDR3 IP core的仿真,可以参考我的上一片博客的架构。

最后,附上上述工程的全部代码。看在本人辛苦整理的份上,希望大家给贡献点下载积分!非常感谢!

下载链接:  https://download.csdn.net/download/qq_22168673/11171084

>>点击这里返回导航页<<

参考文献:

作者 博文
1、第二层皮-合肥 DDR设计总结
2、为中国IC之崛起而读书 Xilinx MIG 控制器使用详解(一)
3、布衣不牢 基于Spartan-6的DDR3 IP核应用
4、fzhykx Xilinx DDR IP详解与时序分析
5、我心狂野 DDR工作原理
6、hierro_sic DDR4标准
   

Sparten6/Kintex-7 DDR3 IP仿真实例相关推荐

  1. Sensor Demoasic (CFA)IP仿真实例

    Sensor Demoasic (CFA)IP仿真实例 AT7_Xilinx开发板(USB3.0+LVDS)资料共享 腾讯链接:https://share.weiyun.com/5GQyKKc 百度网 ...

  2. ddr3ip核心_XILINX DDR3 IP核使用教程

    XILINX DDR3 IP核使用教程 [复制链接] 本教程选择一个例子来讲,那就是xilinx平台下用DDR3(常见的笔记本内存条) 接下来是你玩转这个教程所必须要准备的工具: xilinx ISE ...

  3. HyperLynx(二十六)电源完整性之AC去耦仿真实例(一)

    电源完整性之AC去耦仿真实例(一) 1.电源分配网络与AC仿真流程 2.去耦分析实例(pre-layout) 1.电源分配网络与AC仿真流程 (1)电源分配网络 在高速电路中,大部分输出噪声都是由 P ...

  4. 【UG NX MCD 机电一体化概念设计】UG NX MCD+PLCSIM Advanced联合仿真实例(三) 联合调试

    Step0 前言 上一篇中, 我们采用仿真序列的方式,进行了搬运逻辑的尝试,仅仅是固定一个点去放盒子,所以这篇文章将通过PLC程序控制去每一层地垒起来. Step1 MCD创建信号 信号可选择是否为运 ...

  5. 快速上手Xilinx DDR3 IP核(3)----把MIG IP核封装成一个FIFO(上)(Native接口)

    写在前面 本文将把Xilinx的MIG IP核DDR3的Native接口进行二次封装,将其封装成一个类似FIFO的接口,使其应用起来更加方便简单. DDR3系列文章: 快速上手Xilinx DDR3 ...

  6. 快速上手Xilinx DDR3 IP核(2)----MIG IP核的官方例程与读写测试模块(Native接口)

    写在前面 接上一篇文章(配置MIG IP过程): 快速上手Xilinx DDR3 IP核(1)----MIG IP核的介绍及配置(Native接口) DDR3系列文章: 快速上手Xilinx DDR3 ...

  7. 快速上手Xilinx DDR3 IP核(4)----把MIG IP核封装成一个FIFO(下)(Native接口)

    写在前面 本文将把Xilinx的MIG IP核DDR3的Native接口进行二次封装,将其封装成一个类似FIFO的接口,使其应用起来更加方便简单. 本文为下篇,建议与上篇一起阅读,有利于理解: 快速上 ...

  8. 【SLAM建图和导航仿真实例】(三)- 使用RTAB-MAP进行SLAM建图和导航

    引言 在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是 (一)模型构建 (二)根据已知地图进行定位和导航 (三)使用RTAB-MAP进行建图和导航 该项目的slam_bot已经上传 ...

  9. 【SLAM建图和导航仿真实例】(一)- 模型构建

    引言 在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是 (一)模型构建 (二)根据已知地图进行定位和导航 (三)使用RTAB-MAP进行建图和导航 该项目的slam_bot已经上传 ...

  10. python的format输出报文_python构造IP报文实例

    我就废话不多说了,大家还是直接看代码吧! import socket import sys import time import struct HOST, PORT = "10.60.66. ...

最新文章

  1. Spring Filter过滤器,Spring拦截未登录用户权限限制
  2. exchange 2003队列清空方法参考
  3. aliyun oss 文件上传 java.net.SocketTimeoutException Read timed out 问题分析及解决
  4. 三星专业级360度视频拍摄设备登场,能直接传输3D VR视频
  5. makefile入门
  6. 一文看懂Python(四)-----os.path模块篇
  7. 有没有一种让人很爽的学习方法?
  8. 【机器视觉】 import算子
  9. pip 删除安装包_Python中PIP的快速指南
  10. ubuntu下android源码编译环境,ubuntu12.04 64位上搭建android源码编译环境
  11. 单片机全局有必要封装_C语言开发单片机为什么大多数都采用全局变量的形式?...
  12. 程序员思维是什么?程序员思维从哪里来?程序员思维到哪里去?
  13. retrofit框架学习(二)----retrofit封装
  14. System.arraycopy详解
  15. Android 通过开源框架AsyncHttpClient进行get和post请求
  16. QOS 原理阶段学习总结
  17. mocha 的基本介绍expect风格断言库的基本语法
  18. E - Game 树上dfs贪心
  19. json编辑器插件 vue_vue-json-editor json编辑器
  20. Android recovery分区表

热门文章

  1. UMail邮件服务器竖铜墙铁壁有效阻止垃圾邮件入侵
  2. Flutter 混合开发
  3. 【maven】Unable to find javadoc command: The environment variable JAVA_HOME is not correctly set.
  4. SQL数据库-第一次试验-表与视图的基本操作
  5. 北航2019计算机学院就业报告,北京航空航天大学2019届毕业生就业质量年度报告.pdf...
  6. ubuntu rar解压缩
  7. Android2017Google IO
  8. 安装telnet服务
  9. 【VS2015】Win7 X64上面安装VS2015
  10. 6英寸划片机 陆芯3252半自动单轴晶圆切割机