pcie读写ddr_DDR4读写测试(一):MIG IP核配置

上回学习了万兆接口,下回打算学习PCIe接口,但如果要是做个加速的玩意儿的话,好像还缺个存东西的地方,那就拿DDR存东西吧。

刚好最近学习了Xilinx家的DDR4控制器IP核,所以来知乎上简单分享一下如何使用这个MIG IP核,按照惯例还是翻译手册,好像又开了个新坑( ﹁ ﹁ ) 。

本系列将分为:MIG IP核配置、连续读写测试、一些问题的解决等等......

本次读写测试中采用:FPGA硬件平台为Xilinx的评估版KCU116,硬件开发平台为XIlinx的Vivado 2018.3。

什么是DDR?

DDR?不就是内存条嘛,去年DDR大降价我花599还买了好几根呢!狗东搜索”DDR“结果

那为什么现在的内存条要叫DDR呢?

DDR(Double Data Rate,双倍数据速率),一般作为DDR SDRAM(双倍速率同步动态随机存储器)的简称使用,也就是说不是所有的内存条都叫DDR。DDR不过就是一项提高SDRAM性能的一项技术,相较于SDRAM,它可以在一个时钟的上升沿和下降沿都传输数据以实现双倍数据速率,至于DDR是怎么实现双倍数据速率的可以去看看其他文章,这里不再赘述,其实笔者也没搞懂其原理就不好意思丢丑了。

那么我们可以使用DDR来干嘛?

前面说了它就是一个存储器,存储器的作用自然是用来存数据,比如我们需要设计一个什么数据加速引擎的东西,数据量太大一时处理不过来怎么办?

存FIFO?满了溢出导致数据丢失,读了就没了,下次想要还没地儿找;

存BRAM?资源比较紧张怎么办,总不能存个东西占我几十兆的资源,地主家也没有余粮啊~

而DDR SDRAM,置身事外,又不占FPGA内部资源,还容量大,还跑得快,不就非常适合大数据处理存储的需要。

DDR4与DDR3有什么区别?DDR4相较于DDR3的功耗降低、核心频率提升、容量提升;

DDR4引入Bank Group结构,使得读写命令访问不同Bank的时延降低;

其他区别详见网上其他文章,这里不再赘述。

总之DDR4比DDR3好,毕竟4大于3。

MIG IP核

前面讲了DDR就是一个有神秘加成的存储器,我们从其接口信号和其读写过程来看,直接对这些接口信号进行一次读操作或者写操作,就太过于复杂了。

如果有一个IP核直接帮我们解决这些这些过程,我们只要告诉它写在哪个地方和写什么数据就行了。

恰好,Xilinx提供了这样的IP核,名为MIG(Memory Interface Generator),它可以为提供DDR3、DDR4等多种存储器提供接口。本次DDR4读写采用的就是这个IP核,不过7系的FPGA与UltraScale系的FPGA所所对应的MIG IP核在客制化上有所区别,本文暂且只讨论UltraScale+系列FPGA所对应的MIG IP核,并且只针对DDR4的使用(7系的MIG之后有空补上U•ェ•*U)。

从手册上来看,该IP核的基本结构如下图所示

当然这是在UltraScale系列芯片下的IP核的结构,其他芯片的IP核大致差不多。

可以从图中看出,其大致由物理层、控制器和用户接口组成,其中物理层(Physical Layer):提供与外部DDR4 SDRAM的高速接口,包括数据传输、高速时钟生成和恢复以及对DDR SDRAM的初始化操作和校正操作;

控制器(Memory Controller):接收来自用户接口的读写命令,处理其突发事务,主要就是把用户接口的命令变的更加有效的在DDR SDRAM上执行以及将DDR SDRAM上来的传输等事务更加有效的传递到用户接口上,可详见PG150的第24页;

用户接口(User Interface):提供简易的app接口供用户使用。

怎么定制与生成IP核?

在IP Catalog里搜索“MIG”,选择DDR4 SDRAM;IP Catalog 里搜索“MIG”

如果是Xilinx的官方评估版的话,比如笔者使用的是KCU116,那么sys_clk和DDR4可以如下勾选,这样在后面界面里不用再选择DDR4的颗粒型号等东西了;Board 界面

Basic界面这部分保持默认就可以了,其中:Controller/PHY Mode 选择两个都选(除非另有用途,比如自己写控制器等);AXI4 Interface,勾选的话就是AXI4作为用户接口,不勾就是app用户接口,这里不勾,当然,熟悉AXI的话推荐使用AXI4 Interface。Basic 界面1

Basic 界面这部分也保持默认就好,但是如果在Board界面里DDR4选了custom的话,在这里需要自行把DDR4的型号、数据位宽等信息填上;Basic 界面2

Advanced Clocking 界面需要注意,如果需要该IP核提供多个用户时钟的话,比如用于部分逻辑的时钟驱动,可在Additional Clock Option里面勾选,其他保持默认;Advanced Clocking 界面

Advanced Options 界面,如果没有下面这些需求的话,可以按照图中勾选;Advanced Options 界面

IP核定制到此结束,直接生成IP核即可。

IP核接口信号

如果要例化上述已生成好的IP核的话,可以看到如下图所示诸多接口信号,为了方便将其简单注释了一下。IP核例化的接口信号

由上图可知该IP核的接口信号大致分为:复位信号、物理引脚接口信号、app接口信号、提供的用户时钟复位信号和Debug接口信号。当然,对于我们普通使用者而言,我们只需要关心app接口即可,其他信号就爱怎么连怎么连,跟我们关系不大 。

为此笔者简单把app接口信号app接口信号定义

由上图可知,app接口信号大致分为:命令通道、写数据通道和读数据通道。虽然写读通道相互独立,但它们共用一个命令通道,也就是写命令和读命令不能同时进行,三个通道的具体时序会在下一章中详细说明。

本章大致就码这么多字了,接下来的具体怎么使用就在后面章节再码出来了。

笔者还只是个蔡鸡,刚刚学会怎么使用这个IP核,只是来知乎上再水几篇文章,之后打算就从个人使用过的经历上来谈谈这个DDR4可以用出几个花样,暂时能想到就是多路读写请求通道同时竞争DDR4的问题等,当然只是蔡鸡使用水平。

以上仅供参考,若有疑问,可以讨论,若有不足,予以指正~

参考^Xilinx手册PG150的第14页

^Xilinx手册PG150的第13-14页

^Xilinx手册PG150的第223-243页

^Xilinx手册PG150的第122-131页


版权声明:本文为weixin_39604189原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。