前言:内存是PC配件中结构最简单的,但在BIOS中却是最难调的,很多玩家超频都卡在内存上。并且,内存的原理、结构与时序多年不会改变,无论将来内存技术如何进步,相信这篇文章的存在价值都不会打折扣。本文亦希望能通过对DRAM基本原理以及时序的介绍,在内存设置以及XMP的制作上有所帮助。

一,DRAM基本组成

内存是由DRAM(动态随机存储器)芯片组成的。DRAM的内部结构可以说是PC芯片中最简单的,是由许多重复的“单元”——cell组成,每一个cell由一个电容和一个晶体管(一般是N沟道MOSFET)构成,电容可储存1bit数据量,充放电后电荷的多少(电势高低)分别对应二进制数据0和1。由于电容会有漏电现象,因此过一段时间之后电荷会丢失,导致电势不足而丢失数据,因此必须经常进行充电保持电势,这个充电的动作叫做刷新,因此动态存储器具有刷新特性,这个刷新的操作一直要持续到数据改变或者断电。而MOSFET则是控制电容充放电的开关。DRAM由于结构简单,可以做到面积很小,存储容量很大。

二,内存地址

内存中的cell按矩阵形排列,每一行和每一列都会有一个对应的行地址线路(正规叫法叫做word line)和列地址线路(正规叫法是bit line),每个具体的cell就挂接在这样的行地址线路和列地址线路上,对应一个唯一的行号和列号,把行号和列号组合在一起,就是内存的地址。

上图是Thaiphoon Burner的一个SPD dump,每个地址是一个字节。不过我们可以把这些数据假设成只有一个bit,当成是一个简单的内存地址表,左边竖着的是行地址,上方横着的是列地址。例如我们要找第七行、倒数第二列(地址为7E)的数据,它就只有一个对应的值:FD。当然了,在内存的cell中,它只能是0或者1。

(1)寻址
数据要写入内存的一个cell,或者从内存中的一个cell读取数据,首先要完成对这个cell的寻址。寻址的过程,首先是将需要操作的cell的对应行地址信号和列地址信号输入行/列地址缓冲器,然后先通过行解码器(Row Decoder)选择特定的行地址线路,以激活特定的行地址。每一条行地址线路会与多条列地址线路和cell相连接,为了侦测列地址线路上微弱的激活信号,还需要一个额外的感应放大器(Sense Amplifier)放大这个信号。当行激活之后,列地址缓冲器中的列地址信号通过列解码器(Column Decoder)确定列地址,并被对应的感应放大器通过连接IO线路,这样cell就被激活,并可供读写操作,寻址完成。从行地址激活,到找到列地址这段时间,就是tRCD。

(2)内存cell的基本操作

内存中的cell可以分为3个基本操作,数据的储存、写入与读取。为了便于理解,我不打算直接从电路控制上对cell操作进行说明,而是希望通过模型类比来达到说明问题的目的,如有不严谨之处,高手勿怪。要对内存cell进行读写操作,首先要完成上述寻址过程,并且电容的充电状态信号要被感应放大器感应到,并且放大,然后MOSFET打开,电容放电,产生电势变化,把电荷输送到IO线路,导致线路的电势也变化。当然,这只是个简单的描述,以下我们先来了解硅晶体中“电容”的结构和MOSFET的控制原理。
(3)硅晶体中的“电容”

这里之所以“电容”两个字被打上引号,是因为硅晶体中并没有真正意义上的电容。硅晶体中的电容是由两个对置的触发器组成的等效电容。例如两个非门(Nor Gate)用如下图的方式对接。它可以通过周期性施加特定的输入信号,以把电荷保留在电路中,充当电容的作用。如下图,两个非门的输入端R和S互相交替做0和1输入,就可以把电荷储存在电路中。整个动态过程就是这样:

而R和S的波形就是如下图所示,刚好互为反相,差半个周期:

要让电容放电,我们只需要把R和S同时输入1或者0即可。因此这种电容的逻辑关系很简单:在同一时刻R和S输入状态不同(即存在电势差)时,电容为充电状态;在同一时刻R和S输入状态相同(即电势差为0)时,电容为放电状态。

三,MOSFET的控制原理——水库模型

要说明这个MOSFET的控制原理,我们借助一个水库的模型来说明。MOSFET有三个极,分别是源极(Source)、漏极(Drain)和栅极(Gate)。下图左边就是一个MOSFET的电路图,右边是我们画出的一个水库模型。


图中S为源极,D为漏极,G为栅极。S极连接着电容,D级连接列地址线路,并接到数据IO,G则是控制电荷流出的阀门,连接行地址线路。电容在充电后电势会改变,这样S极的电势就会跟着改变,与D极形成电势差,而G极的电势,就决定了S极有多少电荷可以流入D极。由于电子是带负电荷,因此电子越多电势就越低。为了不至于混淆概念,我们把水池顶部电势定为0V,水池底部电势定为5V(仅举例说明,DRAM中的电容实际电压未必是5V)。当电子数量越多时,电势越低,接近0V,电子数量越少时,电势越高,接近5V。

用水库模型说明,就是左边的水池水量升高(电容充电后),当阀门关闭时,左边的水是不会往右边流的。然后阀门打开(降低,电势升高),左边的水就可以往右边流,阀门的高度就决定了有多少水能流去右边的水道(但是在数字电路中,MOSFET只有开和关两种状态,因此下文提到的打开MOSFET就是全开);同样道理如果右边水多,阀门打开之后也可以向左边流。因此在水库模型中,电容就充当了左边的水池,而MOSFET的栅极就充当了阀门,列地址线路和IO则充当了右边的水道。

四,储存数据

MOSFET栅极电势为0V时,电容的电荷不会流出,因此数据就可以保存我们可以用2.5V为参考分界线,电容电势低于2.5V时,表示数据0,电势高于2.5V时,表示数据1。例如上一楼水库模型的左图,电容中储存的电子数高于一半的高度,电势低于2.5V,因此可以表示数据0。但以上只是理论情况,实际上电容会自然漏电,电子数量会逐渐减少,电势就会逐渐升高,当电势升高到2.5V以上时,数据就会出错,因此每隔一段时间必须打开MOSFET往电容中充电,以保持电势,这就是刷新。因此,数据的储存主要就是对电容中电势的保持操作。

(1)写入数据

数据写入的操作分为写入0和写入1两种情况。写入前,电容原有的情况可能是高电势与低电势的状态,我们不用管它。写入0和写入1对cell的操作不尽相同,我们分别来看。

先来看写入0的操作。写入开始时,IO线路上电势为0(水道处于水位最高点),MOSFET栅极电势升高到5V(水库阀门降到最低),阀门打开,电容中的电势就跟着降低(水位升高),直到接近0V(水池被灌满),写入0完成,栅极电势降回0V,阀门关闭。

(2)读取数据

读取的时候,对漏极的电压操作跟写入有些不同。因为水道中的水比水池中的多,或者说水道的容量比水池要大得多。如果水道(漏极)的水为满或者空,在阀门打开的时候很容易出现水道的水倒灌进水池的现象,或是水池的水全部流去水道,这样就有可能导致电容中的电势状态改变,电容对应储存的0或者1也会改变。所以读取数据的时候,IO线路的电压应为1/2的满电势,即2.5V。

读取也同样分读取0和1两种情况。在读取之前,电容中的电势应该是大于或者小于2.5V的,分别代表存储了1和0。由于刷新机制的存在,应该不会允许出现等于2.5V的情况。

首先看读取0操作。电容中为低电势(假设为0V,水池为高水位),IO线路上电势升高至2.5V(这时水道水位比水池低),MOSFET栅极电势升高到5V(水库阀门降到最低),阀门打开,电容中电势升高(水位降低),但由于水道容量较大,因此水位不会升高太多,但是总归也会有个电势的变低,最终电容与IO线路上的电势都变成0-2.5V的一个中间值,并且接近2.5V(假设为2.3V)。这时候感应放大器检测到IO线路上电势低于2.5V,因此识别出0读出。

再看读取1操作。电容中为高电势(假设为5V,水池空),IO线路上电势升高至2.5V(这时候水道水位比水池高),MOSFET栅极电势升高到5V(水库阀门降到最低),阀门打开,电容中电势降低(水位升高),但由于水道容量较大,水位不会降低太多,不过多少也会降低一点(电势会升高),假设升高到2.7V。这时候感应放大器检测到IO线路的电势高于2.5V,识别出1读出。

以上讲述的只是从cell到内存IO线路的读写操作,至于CPU-IMC-内存的读写操作,不在本文讨论范围。

作为一个程序员,你居然不知道内存(DRAM)的工作原理,这样能跟上时代的进步吗?相关推荐

  1. 一个程序员的成长的六个阶段

    第一阶段 此阶段主要是能熟练地使用某种语言.这就相当于练武中的套路和架式这些表面的东西. 第二阶段 此阶段能精通基于某种平台的接口(例如我们现在常用的Win 32的API函数)以及所对应语言的自身的库 ...

  2. 转载:林锐:大学十年(一个程序员的路程)(全)

    大学十年(一个程序员的路程)(一) 林锐,1999年岁末 写此文使我很为难,一是担心读者误以为我轻浮得现在就开始写自传,二是担心朋友们误以为我得了绝症而早早留下遗作. 不论是落俗套还是不落俗套地评价, ...

  3. 如何看待“我有个绝妙的idea就差一个程序员来实现了”?

    原文链接 如何看待"我有个绝妙的idea就差一个程序员来实现了"? 发布时间:2017-07-03 10:56:34238人关注17人参与 我有一个想法,如果给我一个程序员,我觉得 ...

  4. 作为一个程序员,会使用一些电脑快捷键很有需要

    作为一个程序员,能够使用快捷键,对工作效率的提升也能帮助不少,也是一种无形的帅气 下面列举一些我经常用的快捷键,后续会有添加(并非开发软件中的快捷键) 先说一个我喜欢用的,打开QQ消息:ctrl+al ...

  5. 计算机 哈弗结构图,作为一个程序员,不知道什么是冯诺依曼体系结构?那肯定也不知道哈佛结构喽!...

    听说你还不知道什么是冯诺依曼体系?赶紧转行吧,这可是最基本的最基础的啊,要知道冯诺依曼可是计算机行业祖师爷般的存在啊,所以啊,无论你是学习java,Python,还是天下第一的PHP,只要你是个干编程 ...

  6. 对于一个程序员来说,电脑的内存需要多大?

    1. 程序员电脑内存有多大内存够用足够了,纯写代码的编程对电脑要求不高,尤其对显卡几乎没有要求,一般编程可能开的任务窗口比较多,所以只要cpu和内存大点就可以了一般来说,处理器确实比显卡来得重要一些, ...

  7. 这些价值上亿美元的网站,背后居然都只有一个程序员!

    一个程序员,能顶一个团队,你一定想不到 你一定用过Google吧?有没有觉得这个页面极其简单,仿佛一个程序员就可以做出来? 然而事实并非如此,这个页面背后有个名叫Google Web Servers的 ...

  8. repost 编程之路--一个程序员的艰辛经历

    如果对自身的发展迷茫,可以看看这篇文章,这里真实地记载了一个程序员走过的路. 这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能够为国内IT的发展尽自己一份微薄的力量.最近 ...

  9. 一个程序员的奋斗经历

    2006-07-18 09:28 PS: 说实话 我也很想有文章中主人公的那样的经历...非常佩服..希望与朋友们一起共勉!! 这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开, ...

  10. 一个程序员的奋斗路程

    首先声明我不是作者,这篇文章是我从我的QQ空间中专门拷过来的,因为我想用它来时刻提醒自己. 这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能够为国内IT的发展尽自己一份微 ...

最新文章

  1. 计算机能力操作系统试题,全国计算机一级考试操作系统论述题及答案
  2. 聊一聊 Redis 数据内部存储使用到的数据结构
  3. scheduledexecutorservice 的使用_使用J.U.C实现定时任务
  4. 百度App Objective-C/Swift 组件化混编之路(二)- 工程化
  5. 【Python数据挖掘课程】七.PCA降维操作及subplot子图绘制
  6. 用 Python 读写 Excel 表格,就是这么的简单粗暴且乏味
  7. 《Python爬虫开发与项目实战》——第3章 初识网络爬虫 3.1 网络爬虫概述
  8. 中移动飞信2010Beta1.0体验版
  9. 云场景实践研究第52期:畅游
  10. 95-40-150-java.util.concurrent-ExecutorCompletionService
  11. 数据说大数据分析师吴女士观点:大数据是回暖的计算机行业中绩增速最高的子行业...
  12. java8 optional使用_[Java8]如何正确使用Optional
  13. 小米笔记本显示器关闭后无法唤醒曲线解决办法
  14. 苏州市企业工程技术研究中心
  15. 名编辑电子杂志大师教程 | 名编辑电子杂志页面排版最佳尺寸,最佳字体,字号
  16. apicloud极光推送
  17. linux中etc目录的英文全称
  18. 29 | 无锁的原子操作:Redis如何应对并发访问?
  19. 移动端Web开发(一)移动端开发的基本概念
  20. 视频处理-按帧或者按秒截取图像

热门文章

  1. 震旦ad369s_震旦ad369s驱动
  2. 《疯狂java讲义》第17章 网络编程
  3. 计算机趣味知识竞赛策划,大学生趣味知识竞赛活动的策划书
  4. DayDayUp:计算机技术与软件专业技术资格证书之《系统集成项目管理工程师》课程讲解之十大知识领域之4辅助—项目采购管理
  5. 谈谈Java项目经验
  6. gtx780有html接口吗,史上最强显卡供电GTX780入手,纪念给了我人生一堂课的舅妈...
  7. 【胡学长 带你学 Global Mapper 】新手必看 入门指南
  8. 说说你对servlet 的理解或者 servlet 是什么?
  9. 使用 VLD 检测内存泄漏
  10. bochs运行xp_bochs xp镜像完整版