博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DDR3基本概念4 - 预充电和刷新,以及Lattice DDR3 SDRAM controller实战注意事项
阅读量:4188 次
发布时间:2019-05-26

本文共 2040 字,大约阅读时间需要 6 分钟。

Prechage:需要precharge的原因,关闭当前行,打开新行时,要求新的bit line充电到VDD/2。具体原理参见:https://blog.csdn.net/tbzj_2000/article/details/88042986 DDR3基本概念1 - 存储单元结构和原理

Refresh:存储单元的电容,最大保持电平时间为64ms(温度小于85度),或32ms(温度大于85度)。完成一次刷新的时间,为110ns到 70200ns之间。参考DDR3 规范的命令真值表,分成refresh和self-refresh两种命令。

refrech用于在正常的读写命令间插入刷新命令。而self-refrech用于DDR空闲时,用于自刷新。两种命令执行时,DDR都不再可读写,直至命令完成或模式终止。DDR3规范规定,DDR memory 有一个深度为8的refresh queue,可接收最多8个refresh命令。

Lattice DDR3控制器应用实战

I)refresh

在Lattice IP core的DDR3 SDRAM controller v3.1的配置窗口的setting页面有一个Auto Refresh Control栏,有两项配置。

  1)配置1:Auto Refresh Burst Count
    1~8可配置。
    说明:
    a)参照DDR3 的JESD79-3F-DDR3 标准文档的“4.15 refresh command”一节,提到“A maximum of 8 Refresh commands can be postponed during operation of the DDR3 SDRAM”。为了满足标准中的该规定,所有的DDR3内存颗粒,最多可接收8个连续的Refresh命令。
    b)注意此中的“Auto”和DDR3 的“Self Refresh”命令的区别。Lattice 的DDR控制器使用了一个“Precharge all banks”命令({CS#, RAS#, CAS#,WE#}=4'b0010;A10=1),加上几个refresh命令({CS#, RAS#, CAS#,WE#}=4'b0001)来构建一个Auto Refresh Burst命令。busrt个数就是用“Auto Refresh Burst Count”来设定的。

  2)配置2:External Auto Refresh Port

   若使能了该选项,则Auto refresh需要通过DDR 控制器的ext_auto_ref端口来使能。使能后,在完成一次auto refresh之后,DDR控制器返回给用户一个ext_auto_ref_ack信号。
   若未使能,则DDR控制器会自动发起auto refresh命令。对于用户来说:
   - 通过侦测cmd_rdy信号是否被拉低多个系统时钟sclk周期以上来判断是否暂停对DDR的读或写
   - 由于auto refresh时无法执行DDR的读和写,要求外部有足够的FIFO可缓存对DDR的读和写数据、命令等

未使能external auto refresh port做refresh时,会出现各种问题,例如:

   用户发起一次burst写后,还未结束前DDR控制器就启动了auto refresh。由于该操作是自动启动的,用户只有在检测到cmd_rdy信号为低多个周期以上时才知道auto refresh已启动,此时burst写已执行了一部分,若撤销,涉及fifo读使能、读指针以及已读出数据的保存等诸多问题。而且判断cmd_rdy多个周期以上为低作为auto refresh是否已启动会误判,因为其他的操作忙时也会拉低cmd_rdy信号,因此不使用“External Auto Refresh Port”的方法没有太大的实用意义。

    故需使能External Auto Refresh Port,从而可由用户来控制启动auto refresh, 而且可根据ack反馈信号来重新启动DDR读写操作,有效避免了已启动读写命令被中断的情况发生。

    另外在产生auto refresh时间的前后一段时间,设定一个期间,使得在实际发出auto refresh前,已发出的DDR读写操作已完成。

II)precharge

  相对来说precharge较容易处理。不需要复杂的逻辑控制、缓存资源。
  1)在Auto refresh burst命令执行时,发起了“precharge all banks”命令,建议采用每访问完一个bank的一行,则切换至下一个bank的另一行。通过这种方式就不需要在每行结束时,发起一次read or write with precharge命令。
  2)采取1)中存储策略后,可以看到每次的行切换(其实也是bank切换),只需要发起一次ACT命令(即更新bank地址和行地址),不需要precharge命令。

你可能感兴趣的文章
Android中ViewPager自动加手动轮播
查看>>
Android中Fragment点击切换与添加ViewPager滑动切换
查看>>
Java多线程-阻塞队列BlockingQueue
查看>>
Windows:Apache与Tomcat集群调优
查看>>
Apache+2Tomcat 集群及调优
查看>>
通向架构师的道路(第三天)之apache性能调优
查看>>
Tomcat性能调优
查看>>
Tomcat集群
查看>>
quartz在集群环境下的最终解决方案
查看>>
ERwin Data Modeler 建模实践
查看>>
网站架构收集(I)(转)
查看>>
JFreeChart教程 -- 入门
查看>>
JFreeChart各种图形的制作
查看>>
JFreeChart 应用全过程
查看>>
Spring 架构
查看>>
给你感情保鲜
查看>>
ORCALE 优化常青树
查看>>
Java获得CPU序列号和网卡Mac地址
查看>>
Visual Studio 2005的JIT Debugger在Vista上面无法正常工作
查看>>
我的MSDN Blog正式开张,欢迎大家访问 [ http://blogs.msdn.com/yizhang/ ]
查看>>