微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 如何简化V6 DDR3控制器的使用

如何简化V6 DDR3控制器的使用

时间:10-02 整理:3721RD 点击:

在V6 DDR3控制器中,因为写数据通道和命令通道不是简单的FIFO接口,无法通过FIFO的将满信号进行写入的控制,只能根据命令通道和数据通道上的app_wdf_rdy信号和app_rdy信号判断数据是否成功写入,如果没有写入成功则需要重新写入。
      为了简化对V6 DDR3控制器的使用,需要对Xilinx提供的DDR3控制器源码做少量修改。DDR3控制器源码中, app_wdf_rdy信号在用户接口侧指示数据是否成功写入,由wdf_rdy_ns延迟一拍产生。wdf_rdy_ns在DDR3控制器内部用于判断数据是否写入有效。wdf_rdy_ns是由一个FIFO写入侧counter计算出来的,counter的值则取决于FIFO的读写状态。如果Counter的值大于设定的将满阈值15,则wdf_rdy_ns为0,写入的数据无效。
       为了使app_wdf_rdy信号具有将满指示效果,即把app_wdf_rdy用作反压信号时,每个写入的数据都是写入有效的,必须使app_wdf_rdy信号比wdf_rdy_ns更早的为0。wdf_rdy_ns是在counter值等于15时为0,而app_wdf_rdy应该在counter值等于15以前就为0。保险起见,可以在counter为12将app_wdf_rdy置为0。
       对于命令通道的app_rdy信号,由于产生机制过于复杂,不容易通过修改Xilinx源码来使得app_rdy信号具有提前反压效果。只能根据app_rdy信号的指示,确定上一拍数据是否成功写入。

多谢小编分享

从描述看,LZ似乎希望将DDR IP接口简化为类似于FIFO的反压接口,但我觉得DDR 控制器读写接口做成FIFO结构会大大降低IP的调度性能(总线利用率和时延等),因为控制器会对接口中等待的请求根据地址进行调度,写数据的输出也是乱序的,所以接口不能做成FIFO结构
个人愚见,若有理解错误还请指教



    做成类FIFO反压接口的目的恰恰的为了提高读写的效率,这样子就不用读写一次判断很多次。Xilinx源码根据app_wdf_rdy写进数据时,并不一定能写成功,而是要写完以后判断一次,不成功要重新写一次,这样子效率很低下。而我改成这样子以后,如果app_wdf_rdy为1就一定能写成功,不需要写完再判断一次,效率大增。至于你担心命令和数据不对齐,那是多虑了,因为我还是能保证命令输入与数据输入的先后关系,不会写错地址。其实Xilinx只是要求命令输入时,数据也同步输入,但是并不是要求在时钟上完全对齐。至于您说的控制器的对读写顺序的调度,是在控制器的更核心部分,我修改这部分代码是不会影响到那部分功能的。这种做法已经经过我的验证:仿真、上板调试、实际运行(1年)都没有问题。这种改动,是在完全了解Xilinx控制器代码的基础上做出的改动,所以不建议盲目修改,您的担心也是有道理的。
    您思考很心细和深入,值得学习,呵呵!



    有兴趣的话,可以到我的博客,看我的源码修改,看完了Xilinx的app_wdf_rdy信号产生机制,就不对我做的改动产生疑问了。



   

刚看过你的博客,收获很多。不过对你上面的有些观点不能认同。

首先,你说FIFO反压接口可以调高读写的效率,我理解你是说这种接口修改后不需要经过重复判断,可以提高控制器接口接收写数据的效率,请注意,这与我上面提到的控制器执行读写操作的效率概念不同。

我的经验是DDR控制器效率(带宽及延时等)的瓶颈在于控制器没有根据请求的地址及类型对请求进行合理调度,即请求没有快速执行是因为控制器没法执行,因此接口中的数据来早来晚对于控制器效率本身没有影响。

并且按照你的修改,减少了接口的缓存阈值,即控制器可以调度的请求个数会相应减少,这样反而会减低控制器的调度效率。



    嗯,控制器内部合理调度读写命令访问的顺序,减少同一BANK行切换频率的确是提高DDR3利用效率的好办法。以我个人的理解,我修改的是控制器的UI部分,不涉及到控制器核心部分的读写顺序调度,所以应该是不会影响到控制器执行读写操作的效率的。需要仔细阅读Xilinx源码,才能确定我猜想的对不对。

DDR控制器效率其实可以在仿真中大致估算的。你可以在仿真中计算下在一段时间内DRAM接口侧DQS信号有效的拍数占总拍数的比例,再平均下,来估算控制器的总线利用率。再根据你的DRAM的频率及位宽,就可以获得控制器可以得到的最大带宽。
请求延时仿真中不大好估算,不过可以从设计中分析得出最大延时



    构造专门的仿真case的确可以对DDR3的有效带宽做一个评估,好主意!

ffffffffffffff

多谢小编分享,学习一下

真是不错的讨论,很受益。

学习学习

请教楼上高人,你们是啥专业啊?为啥还要把核研究的那么清楚。



   我最近在做DDR3的设计,用的是ISE14.6的MIG 编译成功 下载到板子上以后phy_init_done信号一直不能拉高。用ILA观测,发现用户接口的读写信号app_wr_en 等所有信号都为0,,这可能是什么原因造成的呢,请教一下

看完帖子,收获很大啊

讲的很深入!

ISE可以生产DDR2控制器和DDR2模型以及仿真文件(读写地址和读写数据的产生),目前想通过app_*信号自己给输入,可是phy_init_done信号一直不拉高,即DDR2初始化不成功,用户无法进行读写数据和地址的输入。但是同样的模型和控制器,在ISE自己生成的测试文件下就能正确初始化和读写。phy_init_done信号是如何产生的?需要用户给什么输入信号吗?

谢谢分享

看不懂呢

支持,多谢分享

多谢分享

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top