1.MIG IP核简介
MIG(Memory Interface Generators) IP 核是Xilinx公司针对DDR存储器开发的 IP,里面集成存储器控制模块,实现DDR读写操作的控制流程,下图是7系列的 MIG IP 核结构框图。MIG IP 核对外分出了两组接口。左侧是用户接口,就是用户(FPGA)同 MIG 交互的接口,用户只有充分掌握了这些接口才能操作MIG。右侧为DDR物理芯片接口,负责产生具体的操作时序,并直接操作芯片管脚。这一侧用户只负责分配正确的管脚,其他不用关心。
通过MIG IP核,我们可以很容易的控制DDR3的读写操作,即只需要控制用户端的端口即可对DDR3进行操作。用户端各个端口的含义如下:
其中的输入/输出是相对于MIG IP核来说的,例如ui_clk就是output给用户侧的用户时钟。
下图是一张用户命令正确被IP核接收的时序图,可以看到,只有在app_en 和app_rdy均为有效的时候,命令才能正确得被接收到MIG IP核中
端口名称 | I/O | 位宽 | 备注 |
app_cmd | I | 3 | 命令总线,3’b000表示写命令,3’b001表示读命令 |
app_addr | I | 29 | 将要访问的DDR内存地址,具体位宽与用户生成IP核时的设置有关 |
app_rdy | I | 1 | 空闲信号,指示当前IP核的工作状态,只有该信号为高时,IP核才能正确的想用用户给出的命令 |
app_en | I | 1 | 命令使能信号,该信号有效且app_rdy有效时,命令才能 |
下面的时序图显示了从MIG IP中读出数据的用户操作时序,当用户的读数据命令被IP核接收后,在几个时钟周期后会将读出的数据输出到数据总线上。
读时序比较简单,发出读命令后,用户只需等待数据有效信号(app_rd_data_valid)拉高,为高表明此时数据总线上的数据是有效的返回数据。需要注意的是,在发出读命令后,有效读数据要晚若干周期才出现在数据总线上 (延迟的时间不定)。
用户读操作相关端口的含义如下:
端口名称 | I/O | 位宽 | 备注 |
app_rd_data | O | 256 | 从DDR中读出得数据,一个时钟周期突发读出8个32bit数据(位宽根据IP核设置会有不同) |
app_rd_data_valid | O | 1 | 读出数据有效信号,该信号为高时表示从IP核中读出的数据有效 |
app_rd_data_end | O | 1 | 指示当前数据时突发读写的最后一个周期的数据,这个信号与设置的用户时钟和DDR时钟的比例有关 |
用户写操作相关端口的含义如下:
端口名称 | I/O | 位宽 | 备注 |
app_wdf_wren | I | 1 | 写数据有效信号,当app_wdf_rdy也为有效时,IP核才会接收到用户端发送的app_wdf_data |
app_wdf_rdy | I | 1 | 写空闲信号,IP核内部的写FIFO能够接收用户数据的标志 |
app_wdf_data | I | 256 | 用户写入IP核的256bit数据 |
app_wdf_end | I | 1 | 该信号有效时,表示当前是一次DDR写突发的最后一个数据 |
app_wdf_mask | I | 32 | 32bit数据掩码,每一位对应app_wdf_data的一个8bit数据 |
写操作时序图如下所示:
写数据的情况有3种:
- 写命令与写数据发生在同一时钟周期
- 写数据先于写命令发生(不一定是图上的一个时钟周期,因为数据是先写到了FIFO)发生在同一时钟周期
- 写数据落后于写命令发生,但不能超过两个时钟周期
结合上图,写时序总结如下:首先需要检查 app_wdf_rdy,该信号为高表明此时 IP 核数据接收处于准备完成状态,可以接收用户发过来的数据,在当前时钟拉高写使能(app_wdf_wren),给出写数据 (app_wdf_data)。这样加上发起的写命令操作就可以成功向 IP 核写数据。
在了解了MIG控制器的相关用户端口的信号后,我们就可以着手来自己写一个控制器来简化用户操作,更加简单地对DDR进行操作。接下来我们首先根据开发板所有的资源生成一个对应MIG控制器的IP。
2.IP核配置
首先打开IP Catalog,输入MIG即可找到我们想要的IP,然后双击打开,进入如下页面。
点击next进入MIG Output Options配置页面,该页有几个选项:
1.Create Design:创建DDR3 IP工程设计,此处勾选。
2.表示对已有工程引脚约束进行验证
3. 这个IP生成后的模块名
4. 由于这个IP支持多个控制器,所以这里需要选择主控的数量,FPGA使用的话一般只会存在一个。
5. 这个IP有两种接口,默认使用的接口比较简单,适合FPGA内部使用,勾选5处会使用AXI4接口,这个接口一般给ARM端控制DDR3会比较方便,FPGA内部使用AXI4接口就是把简单的问题复杂化且浪费资源
点击Next到Pin Compatible FPGAs 配置页面,如下图所示该界面可用于配置选择和当前所设定的唯一器件型号做引脚兼容的其它FPGA型号。对于可能升级器件型号的应用而言,这个功能是很实用的。本设计保持默认不做配置。
点击Next进入到如下图所示的Memory Selection配置页面,该IP可以控制DDR3、DDR、LPDDR2等多种器件,所以这里需要选择这个IP具体控制哪种芯片,开发板上板载的是DDR3,这里选择“DDR3 SDRAM”即可。
点击Next进入到如下图所示的Controller Options配置页面该配置,该界面是主要参数的配置界面之一,涉及的内容比较多。
1、Clock Period:设置DDR3的IO时钟频率,根据开发板上实际DDR3支持的最大时钟频率进行设置,MT41K256M16TW-107IT最大支持933MHz的接口时钟,本次设计设置为800MHz的数据时钟。
2、PHY to Controller Clock Ratlo:FPGA给DDR3芯片提供的时钟频率为Clock Period,但是FPGA内部其余模块的时钟一般是运行不到Clock Period这么高的时钟频率的,所以需要给FPGA内部提供一个较低的时钟,这个参数就是用来设置DDR3接口时钟与MIG IP提供给FPGA内部其他模块的时钟(ui_clk)频率比值。本次设计的比值固定为4:1。由于ui_clk与DDR3接口时钟频率比值为1:4,且DDR3的数据在双沿传输,导致用户每次读写MIG IP的数据位宽是DDR3芯片数据位宽的8倍,DDR3如果数据位宽为16位,那么用户每次读写IP的数据为128位,这与DDR3芯片内部的预取思路差不多,通过位宽换取时钟频率。
3、Vccaux_io:设置bank的供电电压,一般都是锁死的,会根据DDR3时钟频率变化而变化。
4、Memory Type:一般选择Components即可,其余几种可能与内存条有关。
5、Memory Part:选择DDR3的型号,芯片类型不同会涉及具体的DDR3时序参数不同以及地址线和数据线的位数不同。
6、Memory Voltage:选择芯片引脚的电平标准,DDR3一般只有1.5V和1.35V两种,根据原理图选择支持的电平的类型即可。本次设计选用1.35V。
7、Data Width:DDR3读写数据位宽,根据原理图选择DDR3位宽。本次设计将位宽设置为16。
8、ECC:数据线多余72为才能使用的功能。
9、Data Mask:启用之后,可以通过一个掩膜信号去控制DDR3写入数据,本质就是去控制DDR3的DM引脚,一般也不会使用此功能。
10、Number of Bank Machies:选择bank数量,DDR3虽然有8个bank,但是如果不需要全部使用时,可以只选择部分bank,降低功耗,节约资源,默认使用4个bank。
11、ORDERING:DDR控制器调度命令的顺序的配置,当选择strict时,严格按照命令先后顺序执行;选择normal时,为了得到更高的效率,可能对命令重排序。
点击Next进入到如下图所示的Memory Options配置页面下。
1.Input Clock Period:MIG IP 核的系统输入时钟周期,该输入时钟是由 FPGA 内部产生的,MIG内部有一个MMCM资源,用来生成用户时钟及DDR3时钟。这个时钟就是输入给MMCM用的,然后由MMCM生成MIG IP核各部各种所需要的时钟。
2.Read Burst Type and Length:突发类型选择,突发类型有顺序突发和交叉突发两种,选择顺序突发(Sequential),其突发长度固定为 8。
3.Output Driver Impdance Control:输出阻抗控制。选择 RZQ/7。
4.RTT:终结电阻,可进行动态控制。选择 RZQ/4。
5.Controller Chip Select Pin:片选管脚引出使能。选择 enable,表示把片选信号 cs#引出来,由外部控制
6.BANK_ROW_COLUMN:寻址方式选择。选择第二种,即 BANK-ROW-COLUMN的形式
1.System Clock:MIG IP 核输入时钟。选择“No Buffer”,因为 IP 核的输入系统时钟是由内部的 MMCM 产生的,MMCM 所产生的时钟默认添加了 buffer。
2.Reference Clock:MIG IP 核参考时钟。同样选择“No Buffer”,将由时钟模块生成。这个时钟是给MIG IP核的IDELAY模块用来调节IO口延迟的,它固定为200MHz,来源可以是外部的单端时钟、差分时钟或者来自MMCM等,如果前面设置系统时钟System Clock也是设置的200MHz,那么可以选择“Use System Clock”,将两个输入时钟合并一个共用的200MHz输入。
3.System Reset Polarity:复位有效电平选择。选择“ACTIVE LOW”低电平有效。
4.Debug Signals Control:该选项用于控制 MIG IP 核是否把一些调试信号引出来,它会自动添加到 ILA,这些信号包括一些 DDR3 芯片的校准状态信息。选择 “OFF”,不需要让 IP 核生产各种调试信号。
5.Sample Data Depth:采样深度选择。当 “Debug Signals Control” 选择 “OFF” 时,所 有采样深度是不可选的。
6.Internal Vref:内部参考管脚,表示将某些参考管脚当成普通的输入管脚来用。不勾选。
7.IO Power Reduction:IO 管脚节省功耗设置。选择“ON”。
8.XADC Instantiation:XADC补偿使能,使能MIG IP通过XADC来获取温度,实现温度补偿,没有单独使用XADC时启用该功能。
点击Next进入到如下图所示的Extended FPGA Option 配置页面中,其中1和2只有在HP Bank的FPGA中才会出现,HR bank没有这两个设置内容,一般默认即可。设定内部终端阻抗(Internal Termination Impedance)为50 Ohm。
点击Next进入到如下图所示的IO Planning Option配置页面中,如果当前IP仅用于仿真,可以选择New Design。本次实例最终是要进行上板测试的,则选择“Fixed Pin Out: Pre-existing pin out is known and fixed”。
选择“Read XDC/UCF”,直接导入管脚分配文件。如下图所示,这里软件默认设置,直接点击“Next”
3.MIG IP核的时钟什么含义以及如何正确的设置时钟
通过前面对ip核的配置我们发现MIG ip核有好几个时钟,那么这些时钟到底是是啥意思?还有就是如何对这些时钟进行配置呢?
首先我们要先知道MIG ip核的时钟架构,如下图所示
从上面的时钟架构中,可以看出,MIG ip核有以下几种时钟:
reference clock:输入,供idelay ctrl使用,通常需要200MHz,可以外部提供(single-end,differential),也可以内部提供(no buffer,use system clock)。
对DDR频率>667MHz时,参考时钟需要300/400MHz(也可从内部产生)
system clock:输入,mig的系统时钟(主时钟),可以外部提供(single-end,differential),也可以内部提供(no buffer)。
ui_clk:输出,供用户接口端使用,对应图中的internal (FPGA) logic clock,具体时钟频率,由PHY to Controller Clock Ratio决定(4:1 or 2:1)
ICLK/ICLKDIV:输出+供MIG内部使用,Read Path (Input) I/O Logic Clock,由PHASER_IN根据外部DQS产生,供内部采样输入的iserdes数据使用
OCLK/OCLKDIV:输出+供MIG内部使用,Write Path (Output) I/O Logic Clock,由PHASER_OUT产生,供产生输出地址/控制+数据的时钟,以及外部的CK和DQS
下面我们再结合ip核配置来进行说明。
首先是Clock Period设置的是MIG输出给DDR3的时钟,也可以理解为DDR3的运行时钟,比如我设置的时钟频率为800MHz,那么根据DDR3双沿传输的特性,我们可以知道DDR3读写数据的速率为1600Mb/s,这个时钟是由内部的MMCM产生的,我们只需要设置它的大小。
PHY to Controller Clock Ratio其实就是ui_clk,也就是MIG ip核输出给用户的时钟,用户按照这个时钟频率给数据或者读数据即可,DDR3的工作频率与其的比值通常可以设置为2:1或者4:1,当DRR3芯片运行频率超过350MHz时只能设置为4:1。我的DDR3运行频率为800MHz,那么MIG ip核输出给用户的时钟频率就是200MHz,用户按这个频率对DDR3进行读写。
Input Clock Period:它是输入给MIG ip核的时钟,为什么要输入一个时钟给MIG ip核呢?因为MIG ip核是一个比较复杂的东西,工作时需要例化一个MMCM来产生各种时钟,而我们都知道MMCM的工作需要一个输入时钟,因此就产生了nput Clock Period,我们一般将其设置为200MHz。由于这个时钟是输入时钟,因此设计时我们需要产生这个时钟,可以通过锁相环来产生这个时钟。
System Clock:其实就是Input Clock Period,只不过这里是设置时钟来源,包括三种方式:Differential(来源是外部的差分时钟)、Single Ended:(来源是外部的单端时钟)和NO Buffer(来源是MMCM或者PLL,因为MMCM的输出会自带BUFG),一般的FPGA开发板的时钟频率都达不到200MHz,因此大多选择NO Buffer。
Reference Clock是给IDELAY模块的参考时钟,用来对IO口进行延迟调节,这个可以直接选择Use System Clock即可。
Xilinx DDR3 MIG IP核设计(2)--IP核的这几个时钟到底如何设计?_mig核时钟-CSDN博客
详细讲解Xilinx DDR3 的MIG IP生成步骤及参数含义_xilinx ddr3 phy dfi接口转换-CSDN博客
Xilinx DDR3 MIG IP核设计(1)--MIG IP核是什么?如何配置MIG IP核?(Native接口)-CSDN博客