本文中所讲DDR2 MIG核是V5芯片的MIG核,DDR3 MIG核是K7芯片的MIG核。
一、建核区别
DDR2 MIg核的建立过程与DDR3 Mig核的建立过程基本内容都是一致。具体建核教程在相应的datasheet(ug086(DDR2 mig)、ug586(DDR3 mig))中都有说明。
这里具体说一下DDR3 Mig核的特有属性。
二、仿真区别
在我们建立mig核之后,我们一般都会使用mig核自带的example design进行仿真,观察mig核能否正常工作。我们在建立核之后,在这个工程D:\isefile\DDR2_Mig_Core\ipcore_dir\Mig_core路径下(其中DDR2_Mig_Core是自定义的工程名字,Mig_core是自定义的mig核的名字),会有docs(里面主要是mig核的数据手册)、example design(用来测试仿真)、user design(用户使用)三个文件夹。在DDR2mig核中的example design和user design中的rtl和sim文件夹中都包含了仿真所用的.v,只不过example design中仿真数据的产生是在rtl文件下,而user design中仿真数据的产生是在sim文件夹下。因此,example design中所有的.v文件加入工程后可以进行仿真;user design中所有的.v文件加入工程后也可进行仿真。
而DDR3的mig核中的example design和user design中所包含的文件与DDR2中mig核包含的文件情况不太一样。在做DDR3 mig核仿真时,发现DDR3mig核中的example design下的rtl文件夹只包含数据产生部分和example_top.v,并不包含mig的核心控制部分,sim文件夹中内容基本一致;而user design文件夹下只有rtl文件夹,并没有sim文件夹,rtl文件夹下主要是mig的核心控制.v,因此在做仿真时,这example design和user design中的所有.v必须同时加入工程中,才能进行仿真。单独加载example design或user design中的.v是做不了仿真的。(使用ISIM做仿真等init_calib_complete拉高大概用时一个半小时左右,使用Modesim-Se做仿真只需要等待二十分钟左右)。初步仿真完成,证明该mig核就是这样使用的。仿真结果如下图所示:
三、时序区别
3.1 DDR2 SDRAM写时序
图1是DDR2 SDRAM的写时序,由写时序图可以看出在reset_tb信号为低,地址FIFO满信号(app_af_afull)和数据FIFO满信号(app_wdf_afull)均为低,初始化完成信号(phy_init_done)为高情况下,就可以进行DDR2 SDRAM写操作。DDR2 SDRAM写操作包括写地址和写数据两个操作过程,其中写地址由app_af_cmd(指令信号)、app_af_wren(地址有效信号)和app_af_addr(地址信号)这三个信号共同控制;写数据由app_af_cmd(指令信号)、app_wdf_wren(数据有效信号)和app_wdf_data(数据信号)这三个信号共同控制。从图1可以看出,每隔两个clk_tb写一个地址app_af_addr,app_af_wren有效一次,地址变化是按4递增(A1 = A0 + 4、A2 = A1 + 4)。每个clk_tb写两个数据(app_wdf_data,时钟上升沿和下降沿均写入数据),这是因为突发长度是4,所以写一个地址,就需要写四个数据,app_wdf_wren有效长度必须跟有效数据长度保持一致。地址和数据是相互对齐的。
3.2 DDR2 SDARM读时序
DDR2 SDRAM的控制本身是比较难的,但是由于有专用的Mig核,这就使得DDR2 SDRAM的控制就跟BRAM基本一样(其实还是比BRAM难一些的)。无非就是在写的时候给写地址给写数据;在读的时候给读地址,然后从DDR2 SDRAM中读出数据。
图2是DDR2 SDRAM的读时序图,在读的时候,在地址FIFO满信号app_af_afull为低的情况下,每个clk_tb给一个读指令信号app_af_cmd、读地址有效信号app_af_wren和读地址app_af_addr。由于突发长度为4,所以读地址的递增也是以4为单位进行递增的(A1=A0+4、A2=A1+4)。
3.3 DDR3 SDRAM写时序
DDR3 SDRAM在写入数据的过程,也像DDR2 SDRAM一样,需要先写地址,然后再写入数据,唯一不同的是DDR2 SDRAM在写地址和数据必须严格对齐,而DDR3 SDRAM写地址和写数据没有完全对齐的要求。
图3给出了写地址与写数据的三种对应情况:
单独把写时序拉出来看,时序图如下:
通过上图可知,app_en与app_rdy同时有效时,地址才被写入;app_wdf_rdy与app_wdf_wren同时有效时数据才被写入。所以app_rdy和app_wdf_rdy这两个信号可以类比DDR2 SDRAM写时序中的app_af_afull和app_wdf_afull。
再来分析一下不是说好的突发长度为8吗。为什么上图时序图中是每个时钟周期给一个地址和数据呢?
这是因为在设置mig核时,设置了物理接口与用户接口时钟比为4:1,即当物理接口使用400MHz的时钟时,用户接口clk = 100MHz。
由于在时钟的上升沿和下降沿都进行数据的发送,所以每个CLK时钟周期实际上是传送8次数据。
3.3 DDR3 SDRAM读时序
读数据时,在app_en和app_rdy有效时将地址app_addr和命令app_cmd同时写入。app_rd_data_end信号用来指示每个读指令的突发的结束,对于用户来说没啥用。
四、mig核引脚约束及位置约束
在实际使用MIG核时,有两种Pin/Bank Selection Mode有两种选择模式:
1、New Design :Pick the optium banks for a new design.
2、Fixed Pin Out:Pre-existing pin out is known and fixed.
若我们仅仅是仿真mig核可以选用第1中模式,操作比较方便。但是,如果我们是要进行上板调试,推荐使用第二种模式,这样可以避免很多引脚约束错误和固定模块位置约束错误。
我们知道,在使用生成的Mig核的.ucf文件时,.ucf文件中不仅仅包含引脚位置约束,还包含一些时序约束信息和固定块的位置约束信息。如果我们在建核时随意指定引脚位置约束,就会导致固定块的位置约束也是根据你指定的引脚位置约束来指定的。这样在你实际上板之前,你需要更改.ucf文件中的引脚位置约束,但是你不知道如何更改固定块位置约束,这样就会出现时序违规的情况。因此在实际建核时,推荐使用第二种模式,这样无论是在综合还是时序分析时,都可以避免很多问题,很大程度上节约我们调试的时间。