动态随机存储器的刷新

以下内容来自于哔哩哔哩视频网站的王道论坛的计算机组成原理视频教程,如有侵权,请联系我删除掉

遇到的问题

前面提到了动态随机存取器DRAM的电荷只能维持2ms,那么该以怎么样的方式使其保持状态稳定呢

需要解决的问题是

要想在2ms内,存储器上面的所有的存储单元都被刷新到,需要思考下面几个问题

  • 多久刷新一次
  • 每次刷新多少个存储单元
  • 如何刷新
  • 在什么时刻刷新

模型图

在这里插入图片描述

为什么要采用行地址和列地址的组合模式

通过前面的分析可以知道,如果输入到译码器的地址线有n根,那么存储体内就有2n根选通线来对应存储单元,采用了行列地址模式之后,需要的是2n/2+2n/2根线。大大减少了布线的复杂性和选通线的数量,以8个地址线为例,如果采用简单模型,则需要256根线,而采用了行列地址模式,则只需要32根选通线。
关于刷新,是有硬件支持为基础的,就是读取一行的信息然后重新写入,这个过程占用的是一个读/写周期。
接下来看如果行列地址的时候,可用的三个刷新策略
以下是一个行列为128*128的地址,读写周期为0.5微秒的存储器的例子,先换算以下时间单位
1ms=1000us1ms=1000us1ms=1000us,2ms=2000us2ms=2000us2ms=2000us

  • 每次读写完,都刷新一行

存在的问题是有的行可能会被刷新多次

此时每次读写完占用了0.5us,然后又利用了0.5us进行刷新,也就是说一个存储周期用了1us,那么2ms内就有2000个周期,也就是是说每行都被刷新了2000次,这显然对性能是一种浪费

  • 2ms内集中安排时间全部刷新

存在的问题是存在一个较长的死区,这段时间无法访问存储器

此时前面的一段时间时间专门用来读写操作,后面一定要留下充足的时间来对所有的行进行集中刷新,因为一共有128行,那么集中刷新的时间就是128*0.5us,也就是64us来刷新,这64us是死区,无法访问存储器,这个死区可能用无法忍受的

  • 2ms每行刷新一次即可

目前存储器采用的就是这种策略

如果在2ms内128行只需要刷新一次,那么就把2ms分割成128个周期,每个周期分别刷新一次就可以了,2ms/128=15.6us,那么在每个15.6us的末端只要留下0.5us进行刷新,前面的时间都用来读写操作即可
特别说明: 不论是哪一种刷新策略,在死区都是无法访问存储器的

在这里插入图片描述

### MOS动态随机存储器 (DRAM) 和 SRAM 的工作原理及区别 #### 工作原理 MOS 动态随机存储器(DRAM)的工作原理基于电容器的充电状态来表示二进制数据。具体来说,当电容器充满电荷时代表逻辑“1”,未充电时表示逻辑“0”。由于电容器存在漏电流现象,因此 DRAM 中的数据需要定期刷新以维持其状态[^3]。 相比之下,SRAM 使用由多个晶体管组成的触发器电路来存储每一位数据。这种设计使得 SRAM 能够在不断电的情况下持续保持数据稳定性,无需像 DRAM 那样进行周期性的刷新操作[^2]。 #### 结构差异 从物理结构上看,DRAM 单元通常仅需一个晶体管和一个电容器即可实现一位数据的存储,这使其能够在相同面积上提供更高的密度,从而降低单位成本。然而,这样的简单结构也带来了较高的访问延迟和功耗需求[^4]。 另一方面,SRAM 的每个存储单元至少需要六个晶体管才能构建完整的触发器功能。尽管如此,这种方法却赋予了 SRAM 更快的速度、更低的操作电压以及更好的抗干扰能力[^1]。 #### 应用场景对比 鉴于上述特性,在实际应用中往往依据具体的性能指标选择合适的 RAM 类型: - **高性能计算环境**:对于那些对速度极为敏感的应用场合,比如 CPU 缓存或者网络交换设备中的快速缓冲区,则倾向于选用 SRAM; - **大容量低成本解决方案**:而在追求更大存储空间且可以接受稍慢响应时间的地方,例如主内存条里填充的就是 DRAM[^5]。 #### 技术发展趋势 随着技术的进步,出现了融合两者优势的新产品形态——带有缓存机制的 CDRAM 就是一个典型例子。通过集成一小部分高速度低延时特性的 SRAM 来提升整体效率的同时保留大部分经济实惠的大规模 DRAM 容量作为基础架构的一部分[^4]。 ```python # 示例代码展示如何模拟简单的读写过程 class MemorySimulator: def __init__(self, type='DRAM'): self.type = type def read(self, address): if self.type == 'SRAM': return f"Fast reading from {address} using SRAM" elif self.type == 'DRAM': return f"Reading after refresh cycle at {address}" def write(self, address, data): if self.type == 'SRAM': return f"Wrote {data} to {address}, no need for refreshing." elif self.type == 'DRAM': return f"After writing {data} to {address}, initiated a refresh." memory_dram = MemorySimulator('DRAM') print(memory_dram.read(0x1A)) # 输出关于DRAM读取的信息 ``` 问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

micro_cloud_fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值