SDRAM的深入理解

 

引用自:http://blog.ednchina.com/liuhanfeng/44699/message.aspx

 

我了解事物喜欢从底层根本去了解,而不是你说什么我照做就行了,我会形成一些探寻究竟的念头,也会产生很多疑问。

讨论之前当然要先看过某厂的datasheet,我看的是Micron。

按上面说,terminate和precharge都能掐断burst读或写。我也是第一次用Sdram,根据我做的项目数据流特点,我一上来就只 选用了full-page模式。因为full-page读写不带auto-precharge,而且要用户自己来终止,比较了一下,对于full- page而言,用terminate显得直接方便(时序清晰明了),而precharge和时间有关(不单单是时钟周期的个数关系),datasheet 的时序图中有一张是full-page write,用的也是terminate,所以就选用了terminate。

结果实验下来,写入的数据一个也没读出来,全是FF。心理没谱了。揣摸了几天,猜想问题在precharge上,尝试在terminate后面加上 precharge,实验就成功了!原来尽管terminate和precharge都能终止页爆发,但terminate只是单纯的终止,不能完全代替 precharge,用了terminate后还要跟上precharge才行。资料上时序图恰好在页模式时只画了terminate,没跟上 precharge,在文字讲解页模式写的时候光说都能终止,也没强调还要precharge。

导致误会的根本原因是这份datasheet只是应用方面的说教,而不是sdram原理的详细描述。但SDRAM原理的详细讲解到现在也没找着,看 到的资料都是外文翻译过来后互相抄的!千篇一律!比如precharge,从字面看是“预充电”,可资料上的解释都是“Deactivate row in bank or banks”及其中文翻译。后来在论坛上也看到新手们在问:precharge和refresh到底都作了什么,有什么区别?

我根据存动态内存存储单元的基本原理

某些电路相当于“口线供能电容”,此电容容量远比数据存储电容大,用于给口线的读写驱动提供能量,器件数据位宽是几位就只需要几乘以4个(4来源于有4个banks)。下面就来自圆其说:


初始化按照要求就先precharge了,以后每次读写之前都要active。active做两件事,既选通了相关行,又将驱动的能源准备 好。当具体读写时,就选通列,给数据电容充电或放电。1个爆发读写完成后,就拨回precharge,给“供能电容”补足电能。因为“供能电容”在 active时要被消耗能量并且也存在自漏电问题,所以有了资料上的(active to precharge command)tRAS<120微秒的要求。而拨回precharge时,“供能电容”是一直接着电源的,所以资料上就没有(precharge to active command)的要求了。因为“供能电容”比较大,从硬件设计角度出发充电电流不能做太大,所以tWR和tRP就相对要长。真正的顺序是 precharge-〉active-〉读写-〉终止,因为tRP较长,所以初始化时先precharge,并且每次读写完后马上precharge,以 便下次读写时只需active以提高响应速度,反正放在那precharge又不影响什么。这就是precharge(预充电)的真正含义所在!至于何必 这么麻烦要“供能电容”倒一手,可能是因为数据单元太脆弱,经不起电源直接冲击或干扰,呵呵。而且根据动态内存原理,数据线复用,反正必须先active 选通行,顺便再附加个供能功能;而爆发需要终止,特别是页模式更不会自动终止,那么就将“终止”和“预充电”合并到“precharge”,设计人员真会 动脑筋。而资料只管说终止功能,没提预充电的作用,反正时序是通的。

 

想出所谓“供能电容”的还有个原因是:有两个和时钟无关的长时间参数,刷新周期64ms,tRAS 120微秒,不都是电容漏电的体现吗。所以内存可以降频使用,但不能太低,以至于64ms内你只能完成4096次刷新,别的什么都没时间干;或者tRAS 期间你连1次读写或写都完不成。

 

至于refresh,就是1次先读后写的过程,用于保持数据电容的电位。如果在自己的系统中,特别是数据采集系统,1组数据流在64ms内完成了先 写入sdram暂存后读入主机,并且sdram中的数据就不再需要了,整个过程不需要插入任何刷新命令。延伸开来,可以做出很适合你的最简单的sdram 控制器。做个基本的SDRAM控制器很简单,关键是要根据你的系统特点合理安排好读、写、刷新等操作。

 

以上是我这几天的心得,希望没有误导大家
继续推测:在“auto refresh”命令执行的末端隐含了“precharge”,所以资料上要求“auto refresh”前要保证已经“precharge”,而“auto refresh”却可以放在一起连续发出,“auto refresh”之后却直接可以“active”而不再需要“precharge”。还可能在“auto refresh”命令执行的前端隐含了“active”,行地址由刷新寄存器自动计数并加1。“auto refresh”就是对某行所有列同时 “active”“read”“write”“precharge”,正好7个周期。器件共有4096行,所以要求在64ms内刷新4096次,4个 banks是并行同时操作的,所以资料显示耗电高峰发生在自动刷新期间。
实际上read已经隐含了write,就是一次完整的读或自动刷新操作的第5个周期,时序正好吻合。不同的是自动刷新的第5个周期不需对外在DQ上输出。

充电放在前面叫charge,放在后面是为下一次操作提前做好准备就叫precharge,以前面分析prechage能提高断续操作的响应速度,所以最终设计就采用了“precharge”
如果对我说的都很清楚,那么操作内存应该是游刃有余了

打电话问了Micron的技术人员,模式寄存器的内容在掉电前始终有效,中途更改无需再等待120us,但建议稍等一下,具体多少没说。这些内容如果是试验出来的也不敢肯定就一定正确,必须打电话问。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值