目录
1、前言
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配置
下面有一些被我跳过了,按照默认即可。
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的实例化。
其中,clk、rst是DDR3 MIG IP核提供的用户时钟和用户复位信号,高电平复位。
sys_clk_i,是FPGA给DDR3 MIG IP core提供的输入时钟,
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.3testbench测试激励
激励这里我仅是提供了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结束语
如果你在仿真波形里,顺利的向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】https://blog.csdn.net/zhyl558/article/details/82018271#
【2】https://blog.csdn.net/fzhykx/article/details/79642327
【3】https://blog.csdn.net/qq_22168673/article/details/89743195