DDR3/4_IP核应用--vivado

 

参考资料

《pg150-ultrascale-memory-ip》

 

以该手册的脉络为主线,对DDR3/4控制器进行探讨。

1.IP核结构

 

 

DDR3/4_IP核应用--vivado_第1张图片

根据官方提供的资料,IP核主要划分为三个部分,分别是用户接口,内存控制器以及物理层接口。对于用户来说,我们需要研究清楚的是用户接口部分内容,其余两部分只需了解即可,这里就不展开论述。

 

 

读写效率

DDR3/4_IP核应用--vivado_第2张图片

X8是表示,该内存颗粒的数据总线为8bit。常见的还有x4/x16。

 

2.读写时序userinterface操作

整个DDR的IP核应用,主要都是围绕这以下几个路径进行,开发者直接打交道的是IP_core的userinterface。其他物理底层的内容,由IP自行完成。主要指令路径包括:Command Path、write_Path、read_Path以及维护指令(Maintenance Commands)。

 

  • Command Path

顾名思义,就是读写操作指令写入的路径。当app_rdy与app_en都有效的时候,新的指令才能写入命令FIFO里,并被执行。

DDR3/4_IP核应用--vivado_第3张图片

  • Write Path

数据内容写入IP核的路径。

DDR3/4_IP核应用--vivado_第4张图片

从上述的时序图看来,与写入路径相关的信号有app_adf_data、app_wdf_wren以及app_wdf_end。虽然说,写入的数据路径与指令路径可以不对齐,但实际应用过程中,建议还是对齐操作,要不然容易出问题(后续调试测试的内容有提到)。

DDR3/4_IP核应用--vivado_第5张图片

app_wdf_end为高,表示该数据这次写入请求的最后一个数。以上图为例,4:1mode是指用户接口时钟与物理层驱动DDR的时钟之比为1:4。比如用户接口的数据总线为64bit,物理层驱动DDR芯片位宽为8bit ,BL=8, 在4:1mode下,那么正好一个用户clk可以执行完一次突发传输(DDR是在时钟上升沿和下降沿都传输数据)。所以在执行传输的过程中,app_wdf_end为高。

 

  • Read Path

数据从IP核中读出来的路径。

DDR3/4_IP核应用--vivado_第6张图片

 

  • Maintenance Commands(维护指令)

DDR3/4_IP核应用--vivado_第7张图片

DDR3/4_IP核应用--vivado_第8张图片

这里可以解析为什么读写效率不能够达到百分百,由于ddr需要刷新等导致。其中启动刷新有两种模式,一种是自动刷新,即IP核自己产生满足时序的刷新请求,另外一种是通过选中“启用用户刷新和ZQCS输入”选项来启用用户模式。在此模式下,当init_calib_complete有效之后,由用户负责发出Refresh和ZQCS命令以满足DRAM组件规范所要求的速率。ZQCS是用于ZQ 校准,这个与ODT相关。

  • 扩展一下:

ODTOn-Die Termination),是从DDR2 SDRAM时代开始新增的功能。其允许用户通过读写MR1寄存器,来控制DDR3 SDRAM中内部的终端电阻的连接或者断开。

为什么要用ODT?一个DDR通道,通常会挂接多个Rank,这些Rank的数据线、地址线等等都是共用;数据信号也就依次传递到每个Rank,到达线路末端的时候,波形会有反射,从而影响到原始信号;因此需要加上终端电阻,吸收余波。之前的DDR,终端电阻做在板子上,但是因为种种原因,效果不是太好,到了DDR2,把终端电阻做到了DDR颗粒内部,也就称为On Die Termination,Die上的终端电阻,Die是硅片的意思,这里也就是DDR颗粒。

所以,使用ODT的目的很简单,是为了让DQS、RDQS、DQ和DM信号在终结电阻处消耗完,防止这些信号在电路上形成反射,进而增强信号完整性。

3.对IP核进行二次封装

建议对IP核的User_interface再封装一层,对外只需预留例如wr_en/wr_data以及rd_en/rd_data等信号,类似于读写FIFO的端口,提高模块的后期复用。

 

DDR3/4_IP核应用--vivado_第9张图片

4.调试与测试记录

 

手册梳理得差不多了,写个简单的程序仿真测试。期间碰到了些问题,分享出来记录一下。

  •  cmd_path与write_path没对齐。

 

DDR3/4_IP核应用--vivado_第10张图片

图中所示,app_rdy为低,但是wdf_wren仍然为高,短期的话应该没有什么问题,但是如果持续一段时间,必然会导致IP核中fifo被写满,导致异常。

 

解决办法:

       令指令与数据路径命令对齐。在写入的时候,当app_rdy与app_wdf_rdy都有效的时候,才触发相应的动作。

 

  • 数据没有写入,导致回读出来的数据不对。

 

DDR3/4_IP核应用--vivado_第11张图片

从时序上来看,写入没有问题。但是我当初忽略了app_wdf_mask,这个没有赋值(正常应该赋0),导致仿真的时候,该信号一致显示高阻态。然后发现ddr4_dm_dbi_n(双向信号)信号异常。

DDR3/4_IP核应用--vivado_第12张图片

读出来的数据一直是0.

DDR3/4_IP核应用--vivado_第13张图片

 

修改过来后,问题解决。

DDR3/4_IP核应用--vivado_第14张图片

 

读写效率测试

地址模式

BL=8,Mode4:1

wr

rd

MEM_ADDR_ORDER        = "BANK_ROW_COLUMN"

 

30.11% (wr_cnt=8192,

Total_cnt= 27207

31.12%

rd_cnt=8192,

Total_cnt= 26316

MEM_ADDR_ORDER        = "ROW_COLUMN_BANK";

 

90.44%

(wr_cnt=8192,

Total_cnt= 9057

93.89%

rd_cnt=8192,

Total_cnt= 8725

从测试的结果来看,尽可能减少行地址的变化,能大大提高IP核的读写效率。

 

MEM_ADDR_ORDER = "BANK_ROW_COLUMN"

 

Wr:

DDR3/4_IP核应用--vivado_第15张图片

 

 

 

Rd:

DDR3/4_IP核应用--vivado_第16张图片

 

MEM_ADDR_ORDER        = "ROW_COLUMN_BANK";

 

Wr:

DDR3/4_IP核应用--vivado_第17张图片

Rd:

DDR3/4_IP核应用--vivado_第18张图片

 

仔细的话,可以观察clk与app_rdy之间的关系,不难发现为什么两者的读写效率会相差这么大。不同的地址排列,在每次读写过程中,IP的效率有很大的关系,这个与DDR的实现机制有关。详细情况在PG150里有相关说明。

 

你可能感兴趣的:(FPGA,DDR)