目录
- 1 简介
- 2 IP核自定义
- 2.1 设置IP核参数
- 2.1.1 Pin Compatible FPGAs
- 2.1.2 Memory Selection
- 2.1.3 Controller Options
- 2.1.4 AXI Parameter
- 2.1.5 Memory Options
- 2.1.6 FPGA Options
- 2.1.7 Extended FPGA Options
- 2.1.8 IO Planning Options
- 2.1.9 Pin Selection
- 2.1.10 System Signals Selection
- 2.1.11 Summary
- 2.1.12 Simulation Options
- 2.1.13 PCB infomation
- 2.1.14 Design Notes
- 3 产生示例设计
- 3.1 文件结构
- 4 关于IP核的架构
- 4.1 结构框图
- 4.2 用户接口
- 4.3 存储器控制器
- 4.4 PHY
- 4.4.1 整体结构
- 4.4.2 I/O 架构
- 4.4.2.1 控制路径
- 4.4.2.2 数据路径
- 参考资料
这里只学习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
-
选择MIG IP核
-
确定芯片信息,next
-
设置IP核名称,接口
-
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
产生测试命令和数据流的模块。
- 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_en | input | app_addr[]、 app_cmd[2:0]、app_sz和app_hi_pri 输入的使能 |
app_rdy | output | 表示UI准备好接收命令 |
app_hi_pri | input | 高有效,提高了当前请求的优先级。 |
app_sz | input | 保留,应该接0。 |
app_correct_en_i | Input | 纠正单比特数据错误。只有使能ECC后有效 |
app_sr_req | input | 保留,应该接0 |
app_sr_active | output | 保留 |
app_ref_req | input | 请求向DRAM发出一个刷新命令。 |
app_ref_ack | output | 内存控制器已将请求的刷新命令发送到PHY接口。 |
app_zq_req | input | 表示一个ZQ校准命令被发送到DRAM。 |
app_zq_ack | output | 内存控制器已将请求的ZQ校准命令发送到PHY接口。 |
ui_clk | output | UI时钟是DRAM时钟的一半或四分之一。 |
init_calib_complete | output | 当校准完成时,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倍。
参考资料
- ug586_7series_MIS
- ds176_7series_MIS
欢迎关注我的个人公众号: