赞
踩
这里只学习DDR3 和 DDR2 SDRAM Memory Interface。
Xilinx 7系列FPGA 存储器接口解决方案(MIS)IP核 组合了 预先设计的控制器(pre-engineered controller) 和 物理层(physical layer,PHY)接口。这个物理层接口连接【用户设计】或【AMBA AXI4(Advanced eXtensible Interface 4)】接口的DDR3、DDR2 SDRAM器件。
选择MIG IP核
确定芯片信息,next
设置IP核名称,接口
Pin Compatible设置是否要兼容其他型号的FPGA,当然只有相同Pin package的FPGA才可选。
选择存储芯片类型,DDR3 SDRAM
这个页面最多分为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
这个特性允许存储器控制器重新排序命令,以提高存储器总线的效率。
未使用
关于这一页的设置,有必要先学习一下这个IP核的时钟架构:
PHY设计要求使用PLL模块来产生各种时钟,并且在整个设计中使用全局和本地时钟网络来分配时钟。PHY也需要一个同一bank的MMCM作为PLL。这个MMCM补偿了BUFG到PHY的insertion delay(即时钟传播延迟,从Clock源到时序组件Clock输入端的延迟时间)。
PHY中的时钟产生、分配电路和网络驱动块大致可分为四个独立通用的功能:
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而变化。
当然,这些都是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直接选择使用系统时钟,这样是最简洁的。
以锁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文件锁好,然后导入就行,不然一个一个锁好了出什么意外就崩溃了。
Next
Accept->Next
Next
Generate
路径[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
示例设计顶层文件。
example_design/par
示例设计的约束文件
example_design/sim
包含DDR3的模型文件以及仿真的模型和脚本。
user_design
除了基本的读写数据、地址,再学习一些控制信号。
信号 | 方向 | 描述 |
---|---|---|
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信号是非零的 |
这一部分太深入了,只能了解了解。
PHY提供于外部DDR2或DDR3 SDRAM的物理接口。PHY产生符合存储器器件接口时序以及顺序的信号。包含clock-,address-以及产生控制的逻辑,写和读数据路径以及在上电后初始化SDRAM的状态逻辑。此外,PHY包含校准逻辑来执行读写数据通路的时序训练,以满足系统静态和动态延迟。
PHY以一个单一的HDL codebase的形式 提供给DDR2和DDR3,然后MIG工具通过顶层HDL parameter以及XDC约束定义SDRAM类型以及其他设计参数。
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分频。
校准逻辑或存储控制器请求的命令作为PHY控制字发送到PHY控制块,并同时输入到address/control/command OUT_FIFO。每个address/control/command信号必须有四个存储器时钟周期的值,因为每个PHY_Clk周期包含四个存储器时钟周期。
有三种类型的命令:
address/control/command 路径示意图OSERDES使用单倍数据速率,因为address/control/command是SDR信号。
数据路径示意图如下。数据路径包括写数据路径和读数据路径。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倍。
欢迎关注我的个人公众号:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。