SDRAM的 预充电(Precharge)和 刷新(Refresh)

预充电(Precharge)

由于SDRAM的寻址具体独占性,所以在进行完读写操作后,如果要对同一L-Bank的另一行进行寻址,就要将原来有效(工作)的行关闭,重新发送行/列地址。L-Bank关闭现有工作行,准备打开新行的操作就是预充电(Precharge)。

预充电可以通过命令控制,也可以通过辅助设定让芯片在每次读写操作之后自动进行预充电。实际上,预充电是一种对工作行中所有存储体进行数据重写,并对行地址进行复位,同时释放S-AMP(重新加入比较电压,一般是电容电压的1/2,以帮助判断读取数据的逻辑电平,因为S-AMP是通过一个参考电压与存储体位线电压的比较来判断逻辑值的),以准备新行的工作。具体而言,就是将S-AMP中的数据回写,存储电容会受到干扰,所以也需要S-AMP进行读后重写。此时,电容的电量(或者说其产生的电压)将是判断逻辑状态的依据(读取时也需要),为此要设定一个临界值,一般为电容电量的1/2,超过它的为逻辑1,进行重写,否则为逻辑0,不进行重写(等于放电)。为此,现在基本都将电容的另一端接入一个指定的电压(即1/2电容电压),而不是接地,以帮助重写时的比较与判断。

1、关闭所有行(rowline)

2、所有的列(bitline)接 1/2Vcc 源,被充(放)电至 1/2Vcc 。这个动作称为 precharge。

3、经过足够长的时间后,所有的 bitline 和 1/2Vcc 源断开。Precharge 结束。此时每一个的 bitline 都可看作一个电容,电容的电压为 1/2Vcc。

4、打开某一行。假设打开的是第 1 行,则第 1、3、5…所有奇数列和第 1 行的所有位电容相连接,位电容对奇数列的电容充电或放电,使得奇数列的电压偏离 1/2Vcc(或高或低,根据存储的数据是 1 或 0 来决定),这个电压再和偶数列的 1/2Vcc 去比较。

5.这个时候,sense amp 起作用,通过控制 NLAT 和 ACT,sense amp 会把“奇数列”和“偶数列”中电压较高的上拉至 Vcc,电压较低的下拉至 0V,就是让高的更高,低的更低。

6、经过 sense amp 的“锦上添花”和“落井下石”后,数据出现在奇数列。

7、读:把相应 bitline 的数据送至 I/O 口。

8、写:强制性地把对应地 bitline 拉高或拉低

9、读写完毕后,位电容已被充电至 Vcc 或放电至 0V

现在我们再回过头看看读写操作时的命令时序图,从中可以发现地址线A10控制着是否进行在读写之后当前L-Bank自动进行预充电,这就是上文所说的“辅助设定”。而在单独的预充电命令中,A10则控制着是对指定的L-Bank还是所有的L-Bank(当有多个L-Bank处于有效/活动状态时)进行预充电,前者需要提供L-Bank的地址,后者只需将A10信号置于高电平。

在发出预充电命令之后,要经过一段时间才能允许发送RAS行有效命令打开新的南京桁架搭建工作行,这个间隔被称为tRP(Precharge command Period,预充电有效周期)。和tRCD、CL一样,tRP的单位也是时钟周期数,具体值视时钟频率而定。

读取时预充电时序图(上图可点击放大):图中设定:CL=2、BL=4、tRP=2。自动预充电时的开始时间与此图一样,只是没有了单独的预充电命令,并在发出读取命令时,A10地址线要设为高电平(允许自动预充电)。可见控制好预充电启动时间很重要,它可以在读取操作结束后立刻进入新行的寻址,保证运行效率。

误区:读写情况下都要考虑写回延迟

有些文章强调由于写回操作而使读/写操作后都有一定的延迟,但从本文的介绍中写可以看出,即使是读后立即重写的设计,由于是与数据输出同步进行,并不存在延迟。只有在写操作后进行其他的操作时,才会有这方面的影响。写操作虽然是0延迟进行,但每笔数据的真正写入则需要一个足够的周期来保证,这段时间就是写回周期(tWR)。所以预充电不能与写操作同时进行,必须要在tWR之后才能发出预充电命令,以确保数据的可靠写入,否则重写的数据可能是错的,这就造成了写回延迟。

数据写入时预充电操作时序图(可点击放大):注意其中的tWR参数,由于它的存在,使预充电操作延后,从而造成写回延迟

刷新(Refresh)

之所以称为DRAM(Dynamic Random Access Memory,即动态随机存取存储器),就是因为它要不断进行刷新(Refresh)才能保留住数据,因此它是DRAM最重要的操作。

刷新操作与预充电中重写的操作一样,都是用S-AMP先读再写。但为什么有预充电操作还要进行刷新呢?因为预充电是对一个或所有L-Bank中的工作行操作,并且是不定期的,而刷新则是有固定的周期,依次对所有行进行操作,以保留那些久久没经历重写的存储体中的数据。但与所有L-Bank预充电不同的是,这里的行是指所有L-Bank中地址相同的行,而预充电中各L-Bank中的工作行地址并不是一定是相同的。

那么要隔多长时间重复一次刷新呢?目前公认的标准是,存储体中电容的数据有效保存期上限是64ms(毫秒,1/1000秒),也就是说每一行刷新的循环周期是64ms。这样刷新速度就是:行数量/64ms。我们在看内存规格时,经常会看到4096 Refresh Cycles/64ms或8192 Refresh Cycles/64ms的标识,这里的4096与8192就代表这个芯片中每个L-Bank的行数。刷新命令一次对一行有效,发送间隔也是随总行数而变化,4096行时为15.625μs(微秒,1/1000毫秒),8192行时就为7.8125μs。

刷新操作分为两种:自动刷新(Auto Refresh,简称AR)与自刷新(Self Refresh,简称SR)。不论是何种刷新方式,都不需要外部提供行自吸式射流曝气机地址信息,因为这是一个内部的自动操作。对于AR, SDRAM内部有一个行地址生成器(也称刷新计数器)用来自动的依次生成行地址。由于刷新是针对一行中的所有存储体进行,所以无需列寻址,或者说CAS在RAS之前有效。所以,AR又称CBR(CAS Before RAS,列提前于行定位)式刷新。由于刷新涉及到所有L-Bank,因此在刷新过程中,所有L-Bank都停止工作,而每次刷新所占用的时间为9个时钟周期(PC133标准),之后就可进入正常的工作状态,也就是说在这9 个时钟期间内,所有工作指令只能等待而无法执行。64ms之后则再次对同一行进行刷新,如此周而复始进行循环刷新。显然,刷新操作肯定会对SDRAM的性能造成影响,但这是没办法的事情,也是DRAM相对于SRAM(静态内存,无需刷新仍能保留数据)取得成本优势的同时所付出的代价。

SR则主要用于休眠模式低功耗状态下的数据保存,这方面最著名的应用就是STR(Suspend to RAM,休眠挂起于内存)。在发出AR命令时,将CKE置于无效状态,就进入了SR模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在SR期间除了CKE之外的所有外部信号都是无效的(无需外部提供刷新指令),只有重新使CKE有效才能退出自刷新模式并进入正常操作状态。

### DDR内存中的预充电机制 DDR(Double Data Rate)内存通过其复杂的架构实现了高速数据传输能力。其中,预充电Precharge)是一个至关重要的操作阶段。预充电是指在访问新的存储行之前,将当前已打开的存储行关闭的过程[^1]。 具体来说,在DRAM结构中,每一行的数据被激活后会保持开放状态以便快速读取或写入。然而,当需要切换到另一行时,必须先执行预充电命令来关闭当前行并准备下一次行地址的选择。这一过程涉及将位线(Bit Line)上的电压恢复至初始水平,从而确保新行可以被可靠地选通访问。 ### 电荷泄漏现象及其影响 关于电荷泄漏(Charge Leakage),这是所有基于电容器设计的动态随机存取存储器(DRAM)都会面临的一个基本物理问题。由于DRAM单元本质上是由晶体管控制的小型电容器组成,这些电容器用来保存二进制信息——即高/低电压表示逻辑态0或者1。随着时间推移,即使没有任何外部干扰,存储于电容内的电量也会逐渐减少,这就是所谓的电荷泄漏效应。 为了对抗这种不可避免的现象,定期刷新(refreshing)每一个存储单元成为必要措施之一。通常情况下,系统会在特定时间间隔内自动触发刷新周期,重新填充那些因自然衰减而损失掉的部分电荷量,以此维持数据完整性。 ```python def simulate_precharge_cycle(current_row, next_row): """ Simulates a basic precharge cycle between two rows in DDR memory. Args: current_row (int): The currently active row index. next_row (int): The desired new row index. Returns: str: A message indicating the completion of the operation. """ if current_row != next_row: close_current = f"Closing Row {current_row}..." prepare_next = f"Preparing to open Row {next_row}." return "\n".join([close_current, prepare_next]) else: return "No need for precharging as same row is targeted." print(simulate_precharge_cycle(5, 8)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值