原创 VIRTEX5上使用MIG调试DDR2记录

2012-5-9 16:09 8974 11 33 分类: FPGA/CPLD

 

 

 

 

 

 

 

 

DDR2调试记录

 

详情请见附件

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.1 硬件环境

硬件设计参考xilinx官方开发板ML555设计,硬件板子为公司简化版ML555光口板,主控芯片为XILINX公司的VIRTEX5-xc5vlx50t-ff1136,板子支持两组DDR2模块,单个模块由4片MT47H128M8HQ-3IT组成,单片数据位宽为8BIT,4片DDR2组成32bit总位宽.但是FPGA内部实现方式由一片MT47H128M16XX-37E取代两片MT47H128M8HQ-3IT,这样两片MT47H128M8HQ-3IT共用一组控制线,FPGA内部配置的数据宽度为32BIT,由两片MT47H128M16XX-37E实现,具体的硬件电路细节为

 

时钟2转4

其他控制总线直接一分二,参考电路图即可.

1.2软件配置

直接例化IPCORE,本设计采用无TESTBENCH,无PLL的方式.系统的结构如下图所示,其中dcm4ddr2为时钟输出模块,内部例化两个DCM ,第一个DCM产生200M时钟,第二个DCM直接输出200M时钟以及其他相关时钟;ddr2_test_control为自定义模块,产生测试信号;ddr2_corgen为系统例化IP.

 

ISE结构层次

 

RTL视图

1.2.1 dcm4ddr2模块

本模块的作用是生成200M时钟,以及用户时钟,以及DDR2所需要的各种相位时钟和复位信号.RTL视图即端口引脚说明,如下图所示

 

其内部结构如下图所示

 

所有时钟输出均上BUFG,第二个DCM输出的LOCK信号作为DDR2控制器的复位信号,不过最新版本的UG086推荐使用PLL方式,相信结构会更加精简.

1.2.2 ddr2_test_control模块

本模块实现对例化IP核的控制.内部由状态机实现对IP核控制信号,读写数据信号,地址信号的输出以及输入数据采集,采用chipscope观察,测试机理为:先对DDR2执行一个burst写操作,然后执行相同地址的同样长度的burst读操作,对比写入的数据是否和读出的数据一致.例程采用的时钟为200M时钟,与DDR2的工作时钟一致,所以没有添加任何FIFO.将来使用时,若用户时钟不为200M时,需要从读写端分别添加两个FIFO实现切换工作.

1.2.3 DDR2 IP核的例化

Step1:是用core gen工具,新建工程,利用MIG模块生成DDR2控制器IP核.选定芯片,以及硬件描述语言

 

Step2:搜索MIG,并打开MIG,见下图 ,并点击next

 

Step,本设计例化一个控制器,所以默认选项即可,直接next

 

Step3:直接next

Step4:直奔主题

 

Step5:重要的一步,DDR2工作在200M(双沿400M),因此周期选择5000PS,虽然外部的DDR2硬件是8BIT位宽,但是在这里选择的硬件型号却选择为16bit位宽,而用户数据位宽选择32BIT,这样对于FPGA来说相当于两片16bit的芯片组成的存储结构.两片8bit的存储芯片共用控制线.使能MASK功能

 

Step6:按照下图配置,选择不同的工作模式可以.例程1采用burst4的传输模式,直接在parameter中修改参数即可,这些参数都可变.next

 

Step7:禁用PLL,下面的差分单端时钟自动变灰,这样,就需要外围时钟产生模块产生单端(FPGA内部的)时钟了,通过查阅UG086文档,推荐使用PLL,这样,1.2.1的内容可以忽略.

 

Step8:连点两次next,跳到如下界面,本界面支持两种方式的UCF配置,第一支持XILINX推荐的方式,这样的方式显然适合先做FPGA逻辑验证,然后再画PCB板,UCF配置自由灵便,.第二种就是固定模式的,本人此次调试就采用如下模式,直接利用已有资源,读取UCF文件(read ucf file选型),配置信息自动加载进去,稍作修改(INI_DONE,ERROR RST等信号)即可投入使用.见下图

 

选中FIXED PIN OUT选项,直接next

Step9选中想要的文件后,即可得到下图

 

点击readucf,并且找到你所需要的UCF文件见下图

 

点击打开即可得到下图

 

有几个信号需要你添加IO,

 

随便填上,先过了这一关,一会UCF生成后再来收拾这些无关紧要的信号

Step10:一路next,直到最后生成.关闭congen

1.3 调试过程

    IP核生成的文档结构如下图所示

 

我们最关心的当属user_design文件夹,rtl中的所有文件是毫无疑问要添加到工程中的,另外一个重要的文件为par文件夹中的ucf文件,前面说过,要做稍微的修改,至于修改哪些视硬件结构而定,例如本应用中只需要一个CS片选即可,那么cs1应当忽略,另外inidone不需要输出,err也不需要输出,应当去掉,DDR2的复位为内部输入,不需要外部输入,因此也去掉,否则综合实现的过程中一定会报错.

1.3.1成功的INI_DONE信号

这是成功的第一步,如果ini_done一直为低,那后续工作无法开展.

1.3.2 burst4调试结果

ddr2_test_control模块中一个burst(BL=4)写入内容如下:

 

Chipscope读出的数据如下图所示从图中可以看出DDR2控制器输出的rd_data_valid与写入的数据一直,调试成功

 

1.3.3 burst8调试结果

将BL改为8,写入的内容如下:

 

Chipscope调试结果如下图所示:

 

 

 

1.4调试中的几个小问题

1.4.1.Four bursts(BL=4)的错误理解

    由于看文档的不仔细,在查阅UG086 P384的时候,错误的理解为此时序图为一个burst的传输,实际上该图突发传输了4次,同理P386的读burst也是4次.xinlinx这个地方为什么不写成3次,或者5次,如果是这样,一定不会误导本人….浪费了两天时间..

1.4.2.mask信号

    在看原设计的时候,由于是用vhdl写的,所以看起来很费劲,我只看了RTL视图,原设计RTL视图mask信号浮空不接,因此我在设计中直接将mask置0.后来才知道mask信号的意义.

1.4.3 地址信号

本应用的DDR2地址参数配置如下:

 parameter BANK_WIDTH   = 3,          // # of memory bank addr bits.

     parameter COL_WIDTH    = 10,         // # of memory column bits.

     parameter ROW_WIDTH   = 14,         // # of memory row and # of addr bits.

parameter CS_WIDTH     = 2,          // # of total memory chip selects.

按照UG086对于用户接口地址总线的说明,这样实际的地址宽度为2+3+10+14为29bit,未使用的地址应当置1.因此DDR2的地址0对应的地址总线数据为(3’b111,28’d0)

 

文章评论22条评论)

登录后参与讨论

用户1855385 2015-9-22 15:09

学习一下

用户1846572 2015-7-21 16:43

好,很详细,但有些地方还是不太明白,继续学习!

用户1843184 2015-6-24 18:12

好东西,

用户1834770 2015-4-13 15:22

感谢楼主!但是对参数的设置还是不是很明了

用户1821169 2014-11-17 11:17

好东西

用户328796 2014-8-28 22:42

最近在调试DDR2,非常需要!

用户618509 2014-8-15 15:39

好东西 ,学习一下

用户377235 2013-11-29 11:08

学习学习

用户439259 2013-11-28 22:16

很好,正好需要用到。

用户1614480 2013-10-13 18:26

您好,我也在调试DDR2,有些问题想请教一下您,可以加您的QQ吗,我的QQ是16963673
相关推荐阅读
用户1321251 2012-09-18 10:31
ISE ERROR:ConstraintSystem:58解决方法
ERROR:ConstraintSystem:58 - Constraint <INST    "u_ddr2_top_0/*/u_phy_calib/gen_rd_data_sel*.u...
用户1321251 2012-09-13 16:07
HD-SDI图像采集回放
HD_SDI视频采集,输入视频是网络播放器,经DDR2缓存后,输出到SDI接口的显示器,参考XAPP1014文档 ...
用户1321251 2012-08-07 10:08
8bitYCBCR对应的RGB色彩表
    RGB Colour Bars YCbCr Colour Bars R G B Y ...
用户1321251 2012-03-14 16:07
【博客大赛】verilog异或校验的两种写法,哪一种写法是正确的?伤不起
check_o   <= (dat_o[63:56]^dat_o[55:48]^dat_o[47:40]^dat_o[39:32]^dat_o[31:24]^dat_o[23:16]^dat...
用户1321251 2012-01-05 09:44
VS2010非WEB MSDN插件 离线版
 ...
我要评论
22
11
关闭 站长推荐上一条 /2 下一条