zl程序教程

您现在的位置是:首页 >  其他

当前栏目

XIlinx MIG 控制DDR3 SO-DIMM内存条(二):MIG IP核学习

控制学习IP So Xilinx 内存条 DDR3
2023-09-11 14:16:29 时间

这里只学习DDR3 和 DDR2 SDRAM Memory Interface。

1 简介

Xilinx 7系列FPGA 存储器接口解决方案(MIS)IP核 组合了 预先设计的控制器(pre-engineered controller) 和 物理层(physical layer,PHY)接口。这个物理层接口连接【用户设计】或【AMBA AXI4(Advanced eXtensible Interface 4)】接口的DDR3、DDR2 SDRAM器件。

2 IP核自定义

2.1 设置IP核参数

2.1.1 Pin Compatible FPGAs

  1. 选择MIG IP核
    在这里插入图片描述

  2. 确定芯片信息,next
    在这里插入图片描述

  3. 设置IP核名称,接口
    在这里插入图片描述

  4. Pin Compatible设置是否要兼容其他型号的FPGA,当然只有相同Pin package的FPGA才可选。
    在这里插入图片描述

2.1.2 Memory Selection

选择存储芯片类型,DDR3 SDRAM
在这里插入图片描述

2.1.3 Controller Options

在这里插入图片描述

这个页面最多分为9个部分。分区的数量取决于所选择的存储器类型。

  • Frequency
    控制器工作频率,范围取决于FPGA器件。我们的DDR是PC3-1600 SDRAM,我这里直接设置为最高工作频率800MHz。

  • PHY to Controller Clock Ratio
    这个特性决定了物理层时钟频率和控制器以及用户时钟的比例。因为双倍数据速率特性,所以2:1比例的用户接口数据总线宽度是物理层存储器接口宽度的4倍,而4:1比例的总线宽度是物理存储器接口宽度的8倍。2:1的比率具有更低的延迟。4:1的比率对于最高的数据速率是很有必要的。
    SO-DIMM固定为4:1,而且物理层数据位宽为64bit,所以我们用户层的数据位宽为2*4*64=512bit

  • VCCAUX_IO

  • Memory Type
    选择SODIMM

  • Memory Part
    这部分的设置需要格外注意,因为我们的存储器条肯定不在器件库里面的,所以必须选择Create Custom Part在这里插入图片描述

    这里的时序参数就是在XIlinx MIG 控制DDR3 SO-DIMM存储器条(一):存储器条SO-DIMM规范与存储器颗粒时序参数中找的参数。
    为什么一定要选择row address = 16的模板器件?
    用户手册说的是根据需求从Row、Column和Bank选项中选择合适的值。但是如果选择其他模板器件,新建了自定义器件,地址位宽改成了16,确实可以修改保存,甚至到了锁引脚这一步都是对的,但是最终产生的输出文件地址位宽是错的,仍然是模板器件的地址位宽。不知道是不是BUG。

  • Memory Voltage
    选择存储器器件的电压。这里需要看原理图,硬件工程师怎么设计的就怎么选。虽然存储器颗粒的数据手册说支持多种电压。

  • Data Width
    默认64位

  • ECC
    默认

  • Data Mask
    此选项在选定时分配数据掩码引脚。取消选择该选项以释放数据掩码引脚并提高引脚效率。此外,对于不支持数据掩码的存储器器件,此功能是禁用的。

  • Number of Bank Machines
    Bank Machine的数量,越少资源利用率越低,性能越差。

  • ORDERING
    这个特性允许存储器控制器重新排序命令,以提高存储器总线的效率。

2.1.4 AXI Parameter

未使用

2.1.5 Memory Options

在这里插入图片描述

  • input Clock Period
    IP核内部的PLL的输入时钟,基于存储器工作时钟计算出来的一个可选列表。这里选择200MHz。
  • Read Burst Type and Length
    选Sequential顺序突发。
  • Output Driver Impedance Contorl
    设置DRAM上的输出驱动器阻抗。所列出的选择是由所选的特定DRAM决定的。RZQ 240Ω。例如,选择RZQ/6,输出驱动器阻抗为40Ω。
  • RTT
    选择器件或DIMM接口上的DQ、DQS/DQS#和DM信号的终端电阻(On Die Termination, ODT)标称值。数据速率在1333Mbps以上时必须设置为RZQ/6 i(40欧姆)。在2插槽的存储器配置中,这个值在写入时用于未被写入的插槽,也在读取时用于未选择的插槽。利用板级仿真选择最优值。
    我们的数据速率为800MHz*64bit大于1333Mbps,选择RZQ/6。
  • Controller Chip Select Pin
    使能引脚。只有1rank器件可以选择disable,此时输出一个低电平。默认使能。
  • Memory Address Mapping Selection
    地址排布方式。

2.1.6 FPGA Options

在这里插入图片描述

  • System Clock
    选择时钟类型(Single-Ended, Differential, 或 No Buffer)sys_clk信号对。当选择No Buffer时,不会在RTL 代码中实例化IBUF基本单元,不会为系统时钟分配引脚。其余两种则会将时钟接到引脚并添加对应的BUFFER。
    如果MIG为No Buffer选项生成的设计在没有执行更改的情况下实现,设计可能会在实现中失败,因为没有为sys_clk_i信号实例化ibuf。因此,对于No Buffer场景,sys_clk_i信号需要连接到一个内部时钟。这里我接到了一个Clock wizard的输出时钟,所以选择No Buffer。
  • Reference Clock
    此选项选择时钟类型(Single-Ended, Differential, No Buffer 或 Use System Clock)的clk_ref信号对。
    Use System Clock选项只在当系统时钟为199MHz~201MHz时可选。参考时钟频率基于数据速率,IP核添加了一个MMCM来创建高于1,333 Mb/s的ref_clk频率。当选择No Buffer选项时,IBUF原语不会在RTL代码中实例化,也不会为参考时钟分配引脚。
  • System Reset Polarity
    选择复位信号的有效极性。
  • Debug Signals Contorl
    选择此选项将使校准状态和用户端口信号被端口映射到example_top模块中的ILA和VIO。这有助于使用Vivado Design Suite调试特性监控用户界面端口上的数据流。
    可选可不选。
  • Sample Data Depth
    该选项为Vivado调试逻辑中使用的ILA模块选择Sample Data深度。当存储器控制器的调试信号选项为ON时,可以选择此选项。
  • Internal Vref
    内部VREF可以用于数据组字节,以允许使用VREF引脚进行正常的I/O使用。内部VREF应该只用于800Mb/s或以下的数据速率。所以我们勾选不了。
  • IO Power Reduction
    该选项通过在控制器处于空闲状态时自动禁用DQ和DQS ibuf来降低平均I/O功耗。
  • XADC Instantiation
    当启用时,该选项指示MIG核心实例化XADC和温度轮询电路的温度监视器功能。如果已经在设计的其他地方使用了XADC,则可以禁用此选项。在这种情况下,必须定期采样设备温度,并将其驱动到存储器接口顶级用户设计模块中的device_temp_i总线上。如果device_temp_i信号未连接,则实例化XADC。否则将不实例化XADC。

关于这一页的设置,有必要先学习一下这个IP核的时钟架构:

PHY设计要求使用PLL模块来产生各种时钟,并且在整个设计中使用全局和本地时钟网络来分配时钟。PHY也需要一个同一bank的MMCM作为PLL。这个MMCM补偿了BUFG到PHY的insertion delay(即时钟传播延迟,从Clock源到时序组件Clock输入端的延迟时间)。

PHY中的时钟产生、分配电路和网络驱动块大致可分为四个独立通用的功能:

  • 内部(FPGA)逻辑
  • 写路径(输出)I/O逻辑
  • 读路径(输入)和延迟I/O逻辑
  • IDELAY参考时钟

DDR3设计,需要一个MMCM来产生IDELAY参考时钟。如果设计的频率>667MHz, IDELAY参考时钟可以是300MHz或400MHz(取决于FPGA速度等级)。MIG实例化一个MMCM来产生300MHz或400MHz。

PHY需要一个MMCM和一个PLL。PLL用于产生大部分内部逻辑的时钟,其中包括移相器(phaser)的频率参考时钟,以及在多I/O bank implementation中保持PHY控制块同步所需的同步脉冲。

DDR3 SDRAM时钟频率在400Mhz~933Mhz之间时,两个phaser频率参考时钟与存储器时钟频率相同。当DDR2或DDR3 SDRAM时钟频率400MHz以下,其中一个phaser的频率参考时钟与存储器时钟同频,第二个phaser参考时钟频率必须2x或4x存储器时钟频率,使其满足的400Mhz~933Mhz的范围要求。两个phaser频率参考时钟必须由相同的PLL产生,所以它们彼此是同相的。freq_refclk的相位根据操作频率和存储接口引脚选择的bank而变化。

  • 存储器接口使用HP bank,且存储器频率大于等于400MHz时,相位是337.5°。
  • HP bank,200–400MHz(不含400MHz),相位是315°
  • 低电压器件,HP bank,大于等于400MHz,相位是337.5°。
  • 低电压器件,HP bank,200–400MHz(不含400MHz),相位是0°。

当然,这些都是IP核自动识别设置的。

PLL乘(M)和除(D)值的默认设置是让系统时钟输入频率等于存储器时钟频率。这个1:1的比例不是必需的。PLL输入分频器(D)可以是任何约束条件的有效值。约束条件:PLL乘(M)的值必须在1到16之间。存储器时钟的PLL输出分频器(O)必须是2(800Mb/s以上),和4(400到800 Mb/s)。sync_pulse必须是mem_refclk频率的1/16,占空比必须是1/16或6.25%

在这里插入图片描述

有上面的时钟架构图就很明了了。所以说,我们的系统频率sys_clk设置为200MHz,然后产生IDELAY 参考时钟的MMCM的输入时钟ref_clk直接选择使用系统时钟,这样是最简洁的。

  • 内部(FPGA)逻辑时钟:时钟由一个MMCM输出,频率取决于我们选的数据位宽比例。
  • 写路径(输出)I/O逻辑时钟:时钟由PHASER_OUT驱动,给每个byte组的OUT_FIFO、OSERDES/ODDR。产生一个byte clock (OCLK),与移相器的频率参考时钟同频。divided byte clock(OCLKDIV)输出频率为一半。delayed byte clock (OCLK_DELAYED)移相90°。
  • 读路径(输入)和延I/O逻辑时钟:ICLK是频率参考时钟的延迟版本,它与DQS相位对齐。ICLKDIV用于将数据捕获到ISERDES中的第一级触发器中。ICLKDIV对齐到ICLK,是ISERDES中最后一排触发器的并行传输时钟。
  • IDELAY参考时钟:提供200MHz ref_clk。然后MMCM会产生IDELAYCTRL的时钟。IDELAYCTRL模块持续校准I/O区域中的IDELAY元素,以适应不同的环境条件。

2.1.7 Extended FPGA Options

在这里插入图片描述

  • DCI Cascade
    此选择使能在高性能 bank可用的VRN/VRP引脚为地址/控制和reset_n端口分配。
    这直接使能就完事了。
  • Internal Termination for High Range Banks
    内部终端选项,可以设置为40、50、60Ω或禁用。此选择仅适用于high range bank。

2.1.8 IO Planning Options

在这里插入图片描述

2.1.9 Pin Selection

在这里插入图片描述

以锁ddr3_dq[0]为例,xdc约束为:

set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[0]}]
set_property SLEW FAST [get_ports {ddr3_dq[0]}]
set_property IOSTANDARD SSTL15_T_DCI [get_ports {ddr3_dq[0]}]
set_property PACKAGE_PIN AB17 [get_ports {ddr3_dq[0]}]

把所有的引脚用一个xdc/ucf文件锁好,然后导入就行,不然一个一个锁好了出什么意外就崩溃了。

2.1.10 System Signals Selection

在这里插入图片描述

2.1.11 Summary

Next

2.1.12 Simulation Options

Accept->Next

2.1.13 PCB infomation

Next

2.1.14 Design Notes

Generate

3 产生示例设计

在这里插入图片描述

3.1 文件结构

路径[IP 组件名称]_ex\[IP 组件名称]_ex.srcs\sources_1\ip\[IP 组件名称]\[IP 组件名称]下,文件夹结构为:

├─docs
├─example_design
│ ├─par
│ ├─rtl
│ │ └─traffic_gen
│ └─sim
└─user_design
├─constraints
└─rtl
├─clocking
├─controller
├─ecc
├─ip_top
├─phy
└─ui

  • example_design/rtl
    示例设计顶层文件。

    • traffic_gen
      产生测试命令和数据流的模块。
  • example_design/par
    示例设计的约束文件

  • example_design/sim
    包含DDR3的模型文件以及仿真的模型和脚本。

  • user_design

    • rtl 和 xdc 文件夹
    • 顶级封装模块<component_name>.v/vhd
    • 顶层模块<component_name>_mig.v/vhd 和 <component_name>_mig_sim.v/vhd

4 关于IP核的架构

4.1 结构框图

在这里插入图片描述

  • User FPGA Logic
    用户逻辑通过用户接口连接到存储器控制器。
  • AXI4 Slave Interface Block
    AXI4从接口将AXI4事务映射到UI(user interface),从而为存储器控制器提供一个行业标准总线协议接口。
  • User Interface Block and User Interface
    UI块将UI呈现给User FPGA Logic块。它通过呈现平面地址空间和缓冲读写数据,为 native interface提供了一个简单的替代方案。就是说将行地址与列地址组合成了一个User_addr。可以很方便的使用。
  • Memory Controller and Native Interface
    存储器控制器(MC)的前端为UI块提供 native interface。 native interface允许用户设计提交存储器读和写请求,并提供将数据从用户设计移动到外部存储器设备的机制,反之亦然。存储器控制器的后端连接到物理接口,并处理该模块的所有接口要求。存储器控制器还提供了一个重新排序选项,可以对接收到的请求重新排序,以优化数据吞吐量和延迟。
  • PHY and the Physical Interface
    PHY的前端连接存储器控制器。PHY的后端连接到外部存储设备。PHY处理所有存储设备的信号排序和时序。
  • IDELAYCTRL
    在任何bank中使用IDELAY都需要一个IDELAYCTRL。IDELAY与数据组(DQ)相关联。任何使用这些信号的bank/clock region 都需要一个IDELAYCTRL。
    MIG工具实例化一个IDELAYCTRL,然后使用IODELAY_GROUP属性(参见iodelay_ctrl.v模块)。基于此属性,Vivado在设计中根据需要适当地复制IDELAYCTRL。如果跨bank了,vivado自己例化对应bank的IDELAYCTRL。
    IDELAYCTRL参考频率由MIG工具设置为200 MHz、300 MHz或400Mhz,取决于存储器接口频率和FPGA的速度等级。根据所设置的IODELAY_GROUP属性,Vivado复制IDELAYCTRL用于每个存在IDELAY块的 region。
    当用户自己创建一个多控制器设计时,每个MIG输出都有使用原语实例化的组件。这违反IDELAYCTRL和IODELAY_GRP属性的使用规则。IDELAYCTRL只需要有一个组件的实例化,并且属性设置正确,并允许工具根据需要进行复制。

4.2 用户接口

除了基本的读写数据、地址,再学习一些控制信号。

信号方向描述
app_cmd[2:0]input为当前请求选择命令。Read:3’b001;Write:3’b000
app_eninputapp_addr[]、 app_cmd[2:0]、app_sz和app_hi_pri 输入的使能
app_rdyoutput表示UI准备好接收命令
app_hi_priinput高有效,提高了当前请求的优先级。
app_szinput保留,应该接0。
app_correct_en_iInput纠正单比特数据错误。只有使能ECC后有效
app_sr_reqinput保留,应该接0
app_sr_activeoutput保留
app_ref_reqinput请求向DRAM发出一个刷新命令。
app_ref_ackoutput内存控制器已将请求的刷新命令发送到PHY接口。
app_zq_reqinput表示一个ZQ校准命令被发送到DRAM。
app_zq_ackoutput内存控制器已将请求的ZQ校准命令发送到PHY接口。
ui_clkoutputUI时钟是DRAM时钟的一半或四分之一。
init_calib_completeoutput当校准完成时,PHY断言init_calib_complete。
app_ecc_multiple_err[7:0]output此信号适用于启用ECC并与app_rd_data_valid同时有效。如果从外部内存中读取的数据在一个读突发中有两个比特错误,那么app_ecc_multiple_err[3:0]信号是非零的。SECDED算法不会纠正相应的读取数据,而是将该信号置1上,以便在UI上通知读取的数据损坏
app_ecc_single_err[7:0]Output如果从外部内存中读取的数据在每一拍读突发中有一个比特错误。那么app_ecc_single_err信号是非零的

4.3 存储器控制器

在这里插入图片描述

这一部分太深入了,只能了解了解。

  • Bank Machines
    Bank Machine相当于DRAM的bank。给定的Bank Machine在任何给定时间管理单个DRAM银行。但是,Bank Machine的分配是动态的,所以没有必要为每个物理bank都配备一台Bank Machine。可以配置bank的数量来在area和 performance之间进行权衡。
  • Rank Machines
    Rank Machine相当于DRAM的Rank。Rank Machine监视Bank Machine的活动,并跟踪rank或特定于器件的时序参数。例如,Rank Machine监视在一个时间窗口内发送给rank的activate命令的数量。在允许的activate数被发送后,Rank Machine产生一个抑制信号,阻止Bank Machine再向rank发送任何的activate,直到时间窗口移动到允许更多的activate为止。
  • Column Machine
    单个Column Machine生成管理DQ数据总线所需的时序信息。尽管可以有多个DRAM rank,因为只有单个DQ总线,所有DRAM rank中的所有column都作为单个单元进行管理。Column Machine监视Bank Machine发出的命令,并产生抑制信号返回到Bank Machine,使DQ总线被有序地利用。
  • Arbitration Block
    Arbitration Block接收从Bank Machine向DRAM阵列发送命令的请求。行命令和列命令是独立仲裁的。对于每个命令机会,Arbitration Block选择一个行和一个列命令转发到物理层。Arbitration Block采用轮循协议,以保证向前处理。
  • Reordering

4.4 PHY

PHY提供于外部DDR2或DDR3 SDRAM的物理接口。PHY产生符合存储器器件接口时序以及顺序的信号。包含clock-,address-以及产生控制的逻辑,写和读数据路径以及在上电后初始化SDRAM的状态逻辑。此外,PHY包含校准逻辑来执行读写数据通路的时序训练,以满足系统静态和动态延迟。

PHY以一个单一的HDL codebase的形式 提供给DDR2和DDR3,然后MIG工具通过顶层HDL parameter以及XDC约束定义SDRAM类型以及其他设计参数。

4.4.1 整体结构

7系列FPGA PHY由专用块和软校准逻辑组成。专用块是用back-to-back互连结构的,以最小化 构建高性能物理层 所需的时钟和数据路径路由。I/O bank中的byte group clock专用时钟结构有助于最小化 byte group clock驱动 锁驱动的负载数量。byte group clock是由phaser块驱动的。phaser块(PHASER_IN和PHASER_OUT)是多级可编程延迟线环路,可以动态跟踪DQS信号变化并提供精确的相位调整。

每个7系列FPGA I/O bank都有专用块,其中包括一个PHY控制块,四个PHASER_IN和PHASER_OUT块,四个IN/OUT_FIFOs, IOLOGIC (ISERDES, OSERDES,ODDR、IDELAY)和IOB。一个I/O bank中有4个byte group,每个byte group包含PHASER_IN和PHASER_OUT, IN_FIFO和OUT_FIFO,以及12个IOLOGIC和IOB块。一个byte group中12个IOI中的10个用于DQ和DM位,另外两个IOI用于实现差分DQS信号。

下图显示在单个I/O bank中可用的专用块。一个PHY控制块 与 I/O bank中的所有四个PHASER_IN和PHASER_OUT块 通信。

在这里插入图片描述

存储器控制器以及校验逻辑与专用的PHY进行通信,他们所处的慢时钟域是DDR2 或 DDR3 存储器时钟的4或2分频。

在这里插入图片描述

4.4.2 I/O 架构

4.4.2.1 控制路径

校准逻辑或存储控制器请求的命令作为PHY控制字发送到PHY控制块,并同时输入到address/control/command OUT_FIFO。每个address/control/command信号必须有四个存储器时钟周期的值,因为每个PHY_Clk周期包含四个存储器时钟周期。

有三种类型的命令:

  • 写命令包括写和带自动预充电写。这两个写命令的PHY控制字中的PHY命令值是相同的(0x01)。不同之处在于输入到OUT_FIFO的地址值。地址位A10为1,表示地址OUT_FIFOs中带有自动预充电的写入。
  • 读取命令包括读和带自动预充电读。这两个读命令的PHY控制字中的PHY命令值是相同的(0x11)。不同之处在于输入到OUT_FIFO的地址值。地址位A10为1,用于OUT_FIFOs地址中带有自动预充电的读取。
  • 非数据类命令包括模式寄存器置位(Mode Register Set)、刷新(Refresh)、预充电(Precharge)、所有bank预充电(Precharge All Banks),激活(Activate),不操作( No Operation),取消选择(Deselect),ZQ校准长(ZQ Calibration Long),ZQ校准短(ZQ Calibration Short)。所有这些命令的PHY控制字中的PHY命令值是相同的(0x100)。RAS_N、CAS_N、WE_N、bank地址和地址指输入到与这些命令关联的OUT_FIFO是不同的。

address/control/command 路径示意图OSERDES使用单倍数据速率,因为address/control/command是SDR信号。

在这里插入图片描述

4.4.2.2 数据路径

数据路径示意图如下。数据路径包括写数据路径和读数据路径。7系列FPGA中的数据路径完全在专用逻辑中实现,使用IN/OUT_FIFO与FPGA逻辑连接。IN/OUT_FIFO除了提供时钟域跨越功能之外,还提供数据路径serialization/deserialization,从而允许FPGA逻辑在低频率下工作,最高可达DDR2或DDR3 SDRAM时钟频率的1/4。

在这里插入图片描述

每个IN/OUT_FIFO都有一个存储阵列,存储单元排列为10组,宽度为8,深度为8。在写入过程中,OUT_FIFO从校准逻辑或内存控制器接收每个DQ位的8位数据,并将数据写入PHY_Clk时钟域的存储阵列,这是DDR2或DDR3 SDRAM时钟频率的1/4。

OUT_FIFO从8位串行化到4位,并将4位数据输出到OSERDES位于OCLKDIV域中,是DDR2或DDR3 SDRAM时钟频率的一半。OSERDES进一步将4位数据串行化为OCLK域中的串行DDR数据流。PHASER_OUT时钟输出OCLK用于时钟DQ位,而
OCLK_DELAYED输出用于时钟DQS,以实现写入过程中DQS和相关DQ位之间的90°相位偏移。在写调平期间,OCLK和
OCLK_DELAYED被移位到一起,以使每个DDR2或DDR3组件的DQS与CK对齐。

IN_FIFO从给定字节组中的每个DQ位ISERDES接收4位数据,并将它们写入存储阵列。通过将两个4位数据包写入一个8位内存单元,IN_FIFO用于进一步解串数据。这个8位并行数据输出在PHY_Clk时钟域,是DDR2或DDR3 SDRAM时钟频率的1/4。IN_FIFO的每个读取周期包含在一个突发长度为8的内存读取事务中读取的所有字节数据。将数据总线的宽度输入到专用的当FPGA逻辑以DDR2或DDR3 SDRAM时钟频率的1/4运行时,PHY是DDR2或DDR3 SDRAM的8倍。

参考资料

  1. ug586_7series_MIS
  2. ds176_7series_MIS

欢迎关注我的个人公众号:
在这里插入图片描述