SDR,DDR的刷新操作
“刷新操作与预充电中重写的操作一样,都是用S-AMP先读再写。但为什么有预充电操作还要进行刷新呢?因为预充电是对一个或所有 L-Bank 中的工作行操作,并且是不定期的,而刷新则是有固定的周期,依次对所有行进行操作,以保留那些久久没经历重写的存储 体中的数据。但与所有L-Bank预充电不同的是,这里的行是指所有L-Bank中地址相同的行,而预充电中各L-Bank中的 工作行地址并不是一定是相同的。”----这是我从论坛里共享的资料上看到的一段话。刷新操作一次对一行有效。按照上面的说法,假设一块SDRAM里有4个bank,每个bank有4096行,那么刷新周期的计算公式是64Ms/4096,而不是64Ms/(4096*4)罗?
跪求有这方面设计经验的大虾解答
一个sdram有4个bank,4个bank水平放置的话他们相同的row地址是连成一行的。也就是说一次auto_refresh可以同时刷新4个bank中一个row。
比如说4个bank里面都有row0~row4095,一次刷新就会同时刷新4个bank的row0或者rowx。
那么计算公式应该是64ms/row_num。row_num就是指这个sdram的row的数量,你用的是row0~row4095的,所以row_num应该为4096,也就是说64ms内应该刷新4096次。
预充电可以一次对一个bank操作,也可以一次对所有bank操作,无法对大于1个小与bank总数的bank同时进行操作,也就是说要么1个要么所有。
auto_refresh是对所有bank进行操作的。并且spec上已经说过了,在auto_refresh前应该对所有bank进行precharge。
反正很烦啦,仔细看文档吧。
预充电之前,该ROW数据并没有真正写入DDR里面,充电后才写入,而刷新是对已写入DDR的数据,电容进行充电。两者功能有区别吧
刷新操作与预充电中重写的操作一样,都是用S-AMP先读再写。但为什么有预充电操作还要进行刷新呢?因为预充电是对一个或所有 L-Bank 中的工作行操作,并且是不定期的,而刷新则是有固定的周期,依次对所有行进行操作,以保留那些久久没经历重写的存储 体中的数据。
感谢大虾。 大虾说得对,预充电与刷新操作在SDRAM里做的是一样的工作,既然预充电都可以4个bank一起回写数据,那么刷新也应该是可以的,只是预充电是认为设定对一个还是对所有bank的某一行进行操作,而刷新应该固定队所有bank的同一行进行操作。技术资料里没写明白,“刷新操作一次对一行有效”会让人产生歧义。
随便问下大虾,我先在做的设计采用的是对所有bank进行时分复用操作,以提高读写速度,不知道是否已经有一些SDR SDRAM的IP可以支持这样的操作?
请问外部怎么判断SDR正在刷新中呢,SDR好像没有提供标志位。难道是通过计数器,每过64ms/row_num时间则判定正在刷新吗?哪有详细的资料,谢谢
你上ISSI、镁光、现代他们的官网就有datasheet下载。你也可以上论坛搜索SDRAM的工作原理,还是讲得蛮仔细的。 SDR的刷新操作一次对所有bank的某一行有效,刷新操作一般占用系统时间9~10clk,这期间所有bank停止工作,你可以计数这9~10clk的时间,时间过了就可以进行其他操作,但是64MS后又必须对这一行进行刷新,不然他就会丢失数据,但是bank又不止一行,比如一个bank有4096行,那你64ms里面就要至少进行4096次的刷新,每次刷新都占用系统时间9~10clk 。多多交流。
不好意思。我说错了一点,刷新次数跟row 大小无关。row为2048的也是刷新4096次,我确认过etron的2048 row。
另外,我对sdram的工作原理不是很了解,现在也只是在学习阶段。实际上sdram的lmr、self_refresh、auto_refresh都是需要先对所有bank进行precharge才能进行的。有些公司进入power down模式也需要对所有bank进行precharge,但是有些就不需要。所以对于这些特殊模式,最好方法就是先precharge所有bank在进入就没问题了。
时分复用应该跟应用有关。我不知道你是用什么协议的,以及是怎么使用sdram的。但是如果你把每种应用放在不同bank,然后来回切换的话是很快的,因为你不用active n-read n-precharge n-active m-read m-precharge m....其中m和n属于同一个bank的不同row,active-to-precharge以及precharge-to-other command的时间大约为90ns,也就说说尽量不要在一个bank的2个row之间来回切换,否则效率极低。
另外你说的每次刷新时间占用9~10个clk是不准确的。因为你必须要先precharge所有bank,而如果你这个row才刚刚active的话你要precharge要等60ns,然后precharge要20ns,最后auto refresh要70ns,也就是说最快是70ns,最慢可能要150ns左右。所以如果你经常auto refresh的话这个延迟可能过大了。auto refresh规定的是相同row的2次刷新时间间隔最多为64ms。所以只能有2种方式,64ms/4096的时间刷新一次,或者每隔64ms对所有row刷新一遍。当然还有其他方法,不过比较复杂,并且极容易出错。
一般的ip都没有吧,不过我觉得这个实现起来比较简单,以前写过一个,大概2K代码左右。
厂家的ip只是在平均效率比较高而已,对于特殊的应用条件,还是自己写调度器,用厂家的phy比较好一些。
我的设计是对四个bank进行时分复用的,可以提高速度,特别是在换行操作比较多的情况下。至于你说的刷新占用时间,怪我没说清楚,我指的是刷新命令发出后占用的时间,多谢纠正,当然,如果读写操作是自带预充电的话,预充电就基本不会占用到多少时间了。还有我有一个不明白的地方,你说刷新次数不关row数,是不是指datasheet上写4096row/64ms,你就必须在64ms内至少刷4096次,而不用理会一个bank会有多少row,是这样理解吗?
嗯,虽然只是SDR,但是也要跑到166MHz的工作频率,低端的FPGA不知道跑到这种频率,对设计的要求是否会比较高。逻辑设计总体框架已经规划好了,各模块的功能设计也基本完成,担心的还是无法跑到166MHz的工作频率,这个不能太依赖综合。我认为比较容易出问题的应该控制SDR的状态机,现阶段我我把初始化部分和平常操作部分分割为两个状态机,这个平常操作部分只出现9个状态,打算用独热编码写状态机。但是后期的板级调试好像也会消耗很多时间。不知是否一个月内能否完成这个接口设计,望赐教,多多指点。
简单的当然容易,如果只是简单读、写那很简单。关键是要兼顾高性能和高可靠性啊,另外还要看是跟什么协议通信有关。
是的,我现在看到的所有2Mbit~512Mbit的sdram无论多少row,都是要求64ms内刷新4096,我不知道这个是不是标准。
读写操作自带precharge的话是个很糟糕的行为。首先,auto precharge等效于你read/write完自动发送precharge指令(虽然还是有差别),precharge自身要20ns,如果下一次读还是读当前row的话你还要重新active,active-to-read or write又要时间,这个时间大概又要50ns左右,你认为这个划算么?其次,micron的data sheet上说不要对一个row不停的active-precharge-active,这样会减少sdram的寿命。
你说的很有道理,SDR的接口设计简单与否,还是要看你的接口协议。SDR的寿命方面我倒是没有考虑过。由于设计需求,我使用写操作带预充电,是用于频繁的换行,但不涉及对同一个row进行连续的ACT-PRE-ACT。
频繁换row么?那你不如把地址映射改一下变成频繁换bank吧。另外一个row有256以上的column,一个column有8~32bit,你什么应用要频繁切换这么多BYTE?
用于图像的90度翻转。写时序基本就是这样:ACT0,ACT1,ACT2,ACT3,WRA0,WRA1,WRA2,WRA3, , ,ACT。读写的反向是互相垂直的,我使写操作是垂直方向,隔bank同行分别一个像素,一个如上面的写操作周期写入了四个数据;读操作周期选择fullpage操作。不知你所说的映射是否指这样的效果?
学习一下!
看了一下没看懂,不过地址映射意思就是怎么样速度快,acitve次数和precharge次数最少就好了。没啥特别意思。
嗯,那个顺序是错的。前面的行激活命令至少相差两个时钟周期。所以应该是这样:ACT0,NOP,ACT1,NOP,ACT2,NOP,ACT3.```见笑了。
有点感觉。
为什么在进行刷新过程中一定要先预充电呢
