调取 DDR3 IP核后,是不能直接进行读写测试的,必须先进行初始化操作,对 IP 核进行校验。本篇采用 Modelsim 软件配合 DDR3 IP核生成的仿真模型,搭建出 IP核的初始化过程。

一、顶层文件

1、生成 DDR3 IP 核后,在 Source 界面空白处右键点击 Add Source,添加顶层文件。

2、在 DDR3_HDMI\DDR3_HDMI.srcs\sources_1\ip\ddr3_ctrl\ddr3_ctrl\user_design\rtl\ddr3_ctrl.v 可得到 top_ddr3_hdmi 需要的输入输出端口,将其复制过来。

//========================< 端口 >==========================================
(
//system ----------------------------------------
input wire sclkin , //50Mhz
input wire srst_n , //复位,低电平有效
//DDR3 ------------------------------------------
inout wire [:] ddr3_dq ,
inout wire [ :] ddr3_dqs_n ,
inout wire [ :] ddr3_dqs_p ,
output wire [:] ddr3_addr ,
output wire [ :] ddr3_ba ,
output wire ddr3_ras_n ,
output wire ddr3_cas_n ,
output wire ddr3_we_n ,
output wire ddr3_reset_n ,
output wire [ :] ddr3_ck_p ,
output wire [ :] ddr3_ck_n ,
output wire [ :] ddr3_cke ,
output wire [ :] ddr3_cs_n ,
output wire [ :] ddr3_dm ,
output wire [ :] ddr3_odt
);

3、对顶层模块进行编写,可以进入 IP Source 的 ddr3_ctrl.veo文件找到接口复制过来例化,并根据需求更改部分信号,仿真时希望app接口不工作,所有输入接口连接为 0

//DDR3_IP核 -----------------------------------------------------------------
ddr3_ctrl u_ddr3_ctrl //输入为200Mhz,芯片需400Mhz,内部速率为4:1 = 100Mhz
(
// Memory interface ports ----------------------------------------
.ddr3_addr (ddr3_addr ), // output [13:0]
.ddr3_ba (ddr3_ba ), // output [ 2:0]
.ddr3_cas_n (ddr3_cas_n ), // output
.ddr3_ck_n (ddr3_ck_n ), // output
.ddr3_ck_p (ddr3_ck_p ), // output
.ddr3_cke (ddr3_cke ), // output
.ddr3_ras_n (ddr3_ras_n ), // output
.ddr3_reset_n (ddr3_reset_n ), // output
.ddr3_we_n (ddr3_we_n ), // output
.ddr3_dq (ddr3_dq ), // inout [15:0]
.ddr3_dqs_n (ddr3_dqs_n ), // inout [ 1:0]
.ddr3_dqs_p (ddr3_dqs_p ), // inout [ 1:0]
.init_calib_complete (init_calib_complete ), // output
.ddr3_cs_n (ddr3_cs_n ), // output
.ddr3_dm (ddr3_dm ), // output [ 1:0]
.ddr3_odt (ddr3_odt ), // output
// Application interface ports -----------------------------------
.app_addr ( ), // input [27:0]
.app_cmd ( ), // input [ 2:0]
.app_en ( ), // input
.app_wdf_data ( ), // input [127:0]
.app_wdf_end ( ), // input
.app_wdf_wren ( ), // input
.app_rd_data ( ), // output [127:0]
.app_rd_data_end ( ), // output
.app_rd_data_valid ( ), // output
.app_rdy ( ), // output
.app_wdf_rdy ( ), // output
.app_sr_req ( ), // input
.app_ref_req ( ), // input
.app_zq_req ( ), // input
.app_sr_active ( ), // output
.app_ref_ack ( ), // output
.app_zq_ack ( ), // output
.ui_clk ( ), // output 100Mhz
.ui_clk_sync_rst ( ), // output
.app_wdf_mask ( ), // input [15:0]
// System Clock Ports --------------------------------------------
.sys_clk_i (sysclk ), // input 200Mhz
.sys_rst (srst_n ) // input 系统复位
);

4、调取 DDR3 IP 核时,选择了对此 IP 核输入一个200 Mhz 的时钟,由于板卡晶振生成的时钟为 50Mhz,所以还得用一个 IP 核来生出 200 Mhz 时钟。

5、生成时钟后同样找到 .veo 文件接口复制过来例化。

//时钟_IP核 ----------------------------------------------------------------
ddr3_clk_gen u_ddr3_clk_gen
(
.clk_in1 (sclkin ), // input clk_in1
.clk_out1 (sysclk ) // output clk_out1
);

7、有几个信号是我们需要观察的,用 wire 引出来吧。

//========================< 连线 >==========================================
//PLL -------------------------------------------
wire sysclk ;
// ddr3 ip --------------------------------------
wire app_rdy ;
wire app_wdf_rdy ;
wire app_en ;
wire [:] app_addr ;
wire [ :] app_cmd ;
wire [:] app_wdf_mask ;
wire app_wdf_wren ;
wire [:] app_wdf_data ;
wire app_wdf_end ;
wire [:] app_rd_data ;
wire app_rd_data_valid ;
wire app_rd_data_end ;
wire ui_clk ;
wire ui_clk_sync_rst ;
wire init_calib_complete ;

二、测试文件

1、在 Simulation Sources 右键选择 Add Sources,创建 testbench 文件。

2、首先还是把输入输出接口和 top 模块接口在 testbench 中写好。

 `timescale 1ns/1ps  //时间精度
`define Clock //时钟周期 module top_ddr3_hdmi_tb;
//========================< 端口 >==========================================
reg clk ;
reg rst_n ;
wire [:] ddr3_dq ;
wire [ :] ddr3_dqs_n ;
wire [ :] ddr3_dqs_p ;
wire [:] ddr3_addr ;
wire [ :] ddr3_ba ;
wire ddr3_ras_n ;
wire ddr3_cas_n ;
wire ddr3_we_n ;
wire ddr3_reset_n ;
wire [ :] ddr3_ck_p ;
wire [ :] ddr3_ck_n ;
wire [ :] ddr3_cke ;
wire [ :] ddr3_cs_n ;
wire [ :] ddr3_dm ;
wire [ :] ddr3_odt ; //==========================================================================
//== 模块例化
//==========================================================================
//顶层模块
top_ddr3_hdmi u_top_ddr3_hdmi
(
.ddr3_dq (ddr3_dq ),
.ddr3_dqs_n (ddr3_dqs_n ),
.ddr3_dqs_p (ddr3_dqs_p ),
.ddr3_addr (ddr3_addr ),
.ddr3_ba (ddr3_ba ),
.ddr3_ras_n (ddr3_ras_n ),
.ddr3_cas_n (ddr3_cas_n ),
.ddr3_we_n (ddr3_we_n ),
.ddr3_reset_n (ddr3_reset_n ),
.ddr3_ck_p (ddr3_ck_p ),
.ddr3_ck_n (ddr3_ck_n ),
.ddr3_cke (ddr3_cke ),
.ddr3_cs_n (ddr3_cs_n ),
.ddr3_dm (ddr3_dm ),
.ddr3_odt (ddr3_odt ),
.sclkin (clk ),
.srst_n (rst_n )
);

3、DDR3 控制器非常复杂,手写 testbench 是非常困难的。我们上一讲调取 DDR3 IP 核时说过,它已经生成了仿真模型供我们测试。位置在 DDR3_HDMI\DDR3_HDMI.srcs\sources_1\ip\ddr3_ctrl\ddr3_ctrl\example_design\sim,ddr3_model.sv 和 ddr3_model_parameters.vh 即是我们需要的仿真模型,将其复制到 DDR3_HDMI\DDR3_HDMI.srcs\sim_1\new 中,和 top_ddr3_hdmi_tb 文件放在一起。此外还可以看到刚刚那个文件夹中有一个 sim_tb_top 文件,打开它翻到500多行,即可看到该仿真模型的接口模块,我们将其复制到 testbench 中,并根据此次设计情况,更改部分参数。

 //仿真模型
ddr3_model u_ddr3_model
(
.rst_n (ddr3_reset_n ),
.ck (ddr3_ck_p ),
.ck_n (ddr3_ck_n ),
.cke (ddr3_cke ),
.cs_n (ddr3_cs_n ),
.ras_n (ddr3_ras_n ),
.cas_n (ddr3_cas_n ),
.we_n (ddr3_we_n ),
.dm_tdqs ({ddr3_dm[],ddr3_dm[]} ), //ddr3_dm为2位
.ba (ddr3_ba ),
.addr (ddr3_addr ),
.dq (ddr3_dq[:] ), //ddr3_dq为16位
.dqs ({ddr3_dqs_p[],ddr3_dqs_p[]} ), //ddr3_dqs_p为2位
.dqs_n ({ddr3_dqs_n[],ddr3_dqs_n[]} ), //ddr3_dqs_n为2位
.tdqs_n ( ),
.odt (ddr3_odt )
);

3、此外还需要产生一个 50 Mhz 时钟和低电平有效的复位信号。

 //==========================================================================
//== 时钟信号和复位信号
//==========================================================================
initial begin
clk = ;
forever
#(`Clock/) clk = ~clk;
end initial begin
rst_n = ; #(`Clock*+);
rst_n = ;
end

4、回到 Vivado,发现仿真模型文件已经出现了,但是处于问号状态,我们选中它,右键 Add Sources,将 ddr3_model.sv 和 ddr3_model_parameters.vh 添加进来即可。

三、启动 Modelsim 验证 DDR3 IP核

1、使用 Modelsim 进行仿真前,需要先编译 Vivado 和 Modelsim 之间的关联库,具体步骤请另行搜索。

2、点击 Vivado 的 Setting 进行设置,Target simulator 选择 ModelSim Simulator,仿真顶层文件选择第二步的仿真文件,仿真库则自动定位好了。

3、点击 Vivado 左侧菜单 Run Simulation --- Run Behavioral Simulation,Modelsim 就自动打开仿真了。

4、选取信号,跑一段时间,可以看到时钟信号和复位信号正常,  init_calib_complete 信号在拉低一段时间后拉高,表面本次 DDR3 IP核验证成功。

以上。

参考资料:威三学院FPGA教程

DDR3(2):初始化的更多相关文章

  1. DDR3内存详解,存储器结构+时序+初始化过程

    DDR3内存详解,存储器结构+时序+初始化过程 标签: DDR3存储器博客 2017-06-17 16:10 1943人阅读 评论(1) 收藏 举报  分类: 硬件开发基础(2)  转自:http:/ ...

  2. DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)

    转自:http://www.360doc.com/content/14/0116/16/15528092_345730642.shtml 以及参考网络. 首先,我们先了解一下内存的大体结构工作流程,这 ...

  3. 【转】DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)

    这两天正在学习FPGA如何控制DDR3的读写,找到一篇个人感觉比较有意义的文章,可以对DDR的内部结构有一个初步的了解.原文出处:http://blog.chinaunix.net/uid-28458 ...

  4. 【接口时序】8、DDR3驱动原理与FPGA实现(一、DDR的基本原理)

    一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:无 3.仿真工具:无 硬件平台: 1. FPGA型号:无 2. DDR3型号:无 二. 存储器的分类 存储器一 ...

  5. [求助] 关于DDR3的读写操作,看看我的流程对吗?

    [求助] 关于DDR3的读写操作,看看我的流程对吗? 最近简单调了一下KC705开发板上面的DDR3,型号是MT8JTF12864HZ-1G6:有时候加载程序后,发现读出数据不是写进去的,在这将我的操 ...

  6. DDR3内存技术原理

    随着AMD AM2平台CPU的上市,目前两大处理器巨头均提供了对DDR2内存的支持.不过,DDR2远不是内存技术发展的终点,CPU和内存厂商已经在着手进行DDR3内存的相应准备.DDR2内存的好日子还 ...

  7. DDR中的一些知识点说明(ODT,ZQ校准,OCT,TDQS)

    ODT ( On-DieTermination ,片内终结)ODT 也是 DDR2 相对于 DDR1 的关键技术突破,所谓的终结(端接),就是让信号被电路的终端吸 收掉,而不会在电路上形成反射, 造成 ...

  8. 各个DDR对比

    一.容量和封装相关 (1)逻辑Bank数量增加 DDR2 SDRAM中有4Bank和8Bank的设计,而DDR3起始的逻辑Bank是8个,另外还为未来的16个逻辑Bank做好了准备. (2)封装(Pa ...

  9. 转:DDR原理详解

    首先,我们先了解一下内存的大体结构工作流程,这样会比较容量理解这些参数在其中所起到的作用.这部分的讲述运用DDR3的简化时序图. DDR3的内部是一个存储阵列,将数据“填”进去,你可以它想象成一张表格 ...

  10. tiny4412 裸机程序 七、重定位代码到DRAM【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37116637 一.关于DRAM 上一章我们讲解了如何对代码进行重定位,但是将代码重定位到只有25 ...

随机推荐

  1. Clang交叉编译初识

    最近工作中要编译一个第三方的C库用于iOS端使用,我直接在Mac OS的终端中./configure & make & make install常规走下来,却无法在真机iOS上使用,提 ...

  2. Jupyter 中的 10 个魔法函数

    1)%pwd 于显示Jupyter当前的工作空间. 2)%hist 显示当前Jupyter中,所有运行过的历史代码. 3)%who 显示当前Jupyter环境中的所有变量或名称. 4)%reset 删 ...

  3. 腾讯面试Android高级岗,居然被一个多线程基础面倒了?

    前言 一个在深圳从事开发五年的老友一个月前从原公司辞职后,昨天去腾讯总部面试Android高级岗,一面的时候,自我介绍后,陆陆续续问了很多问题,有着五年的从业经验很多项目开发的技术问题都回答的很通顺, ...

  4. NVIDIA-GPU归入K8S集群管理的安装文档--第二版

    一,nvidia K80驱动安装 1,  查看服务器上的Nvidia(英伟达)显卡信息,命令lspci |grep NVIDIA 2,  按下来,进行显卡驱动程序的安装,驱动程序可到nvidia的官网 ...

  5. django 权限设置

    关于权限: 首先明确权限是为了限制其他访问的url 通过在models使之关联的表再通过关联表的权限来permissions的url 来检测url的访问 一. 需要三个类五张表 from django ...

  6. angularjs中设置select的选中项

    最近用angularjs比较多,里面有很多自己的方法,都不咋会用,这篇只是个笔记,防止自己忘记 <select style="width:100%" ng-model=&qu ...

  7. vue-loader作用

    (1)浏览器本身并不认为.vue文件,所以必须对.vue文件进行加载解析,此时需要vue-loader (2)类似的loader还有许多,如:html-loader.css-loader.style- ...

  8. MySQL小测试

    <> 2.创建一个字符集为utf8的数据库,将数据库字符集修改为gbk create database db1 charset='utf8'; alter database db1 cha ...

  9. Python学习进阶之薄弱点总结

    ''' 1.实现用户传入一个普通字符串, 返回字符串的md5加密结果的函数 ''' # import hashlib # # def M(str): # m = hashlib.md5() # m.u ...

  10. go处理XML

    XML 数据格式 对于如下的XML: <Person> <FirstName>Laura</FirstName> <LastName>Lynn</ ...