存储器阵列(上)

小孩子4919 我们都是小青蛙 2018-06-16

点击蓝字,关注我们


关注


本系列主要是一些书籍和文章的读书笔记,并没有专门为读者的阅读体验认真做设计,敬请谅解(时间不多)。参考的文章和书籍有:《数字设计和计算机体系结构》、《逻辑与计算机设计基础》、《Intel微处理器》、《计算机组成原理 唐朔飞版》。


大规模存储数据的需求

我们前边唠叨过触发器可以用来存储数据(多个触发器可以组成寄存器),可是需要20来个晶体管(至于为啥需要这么多就不唠叨了,你可以去百度百度)才能做一个触发器(一个触发器用来存储一位二进制数据),而且特占地方,也就是说集成度不高,虽然这玩意儿非常快,但是成本过高。但是我们又经常有大量存储数据的情况(现代PC上的内存经常4GB起步),科学家们发明了一些新玩意儿。本篇就是要详细唠叨这些存储器是个啥,怎么用。

ROM和RAM的区别

我们现在要唠叨的是和CPU交互的大规模存储器,至于硬盘、光盘啥玩意儿的不在讨论范围内。这类大规模存储数据的存储器分为两大类,一类是所谓的ROM(Read-Only Memory),另一类是RAM(Random Access Memory)。

首先ROM从名称上说是只读存储器,这玩意儿只是一个总称,其实有好多具体的实现,比方说下边这几种:

  • PROM: 可编程程序只读存储器(Programmable ROM,PROM)。这种存储器内部有一些熔丝,根据我们要存储的数据可以烧断里边的某些熔丝,就可以把数据永久存储在这玩意儿里边儿了(先别管内部细节是咋实现的,听个乐呵先)。也就是说:PROM这种存储器只能在出厂的时候写入数据,之后我们就改不了了,只能读它里边存储的数据

  • EPROM:可擦除可编程只读存储器(Erasable Programmable Read Only Memory,EPROM)。从名字上就能听出来,这玩意儿写入的数据不是一次性的,如果我们心情好还可以把里边儿的数据给重写一边。我们只要把它放在紫外线上照一会儿,这个存储器上的数据就都被擦除了,然后利用高电压就可以向存储器里写入数据。可见,这种存储器不仅仅只能读,还能写,不过我们通常只用来读,所以也算是一种ROM。

  • EEPROM:电子式可擦除可编程只读存储器(Electrically Erasable Programmable Read Only Memory,EEPROM)。顾名思义,这玩意儿跟上一个挺像的,只不过它不用放在紫外线下烤一会,而是只需要使用高电压就可以实现数据的擦除。我们平时也只用它来读数据,一般不随便写数据,所以也可以被称为一种ROM。

  • … 吧啦吧啦,还有很多种不同的类型,就不唠叨了。

从上边可以看出来,其实ROM也不一定是只读的,有的ROM有时候也能往里写数据,但是ROM中存储的数据一定是不易失的,也就是即使我们断电之后它的数据也不会丢掉的,这个是它和RAM的本质区别。

然后再来看RAM,全称是随机访问存储器。我们知道不论是啥存储器,它里边都存放着二进制数据。这些二进制数据是怎么放的,如果你要从里边读数据的时候,你怎么知道你读的是张三的文件还是李四的电影呢?这是因为存储器中的二进制数据其实都是编着号的,我们把这个编号称为地址,我们可以根据地址去存储器里访问具体的数据,这样的话,如果你通过一个地址去访问硬盘(这里以机械硬盘为例,它也是一种存储器,硬盘里头有个小磁头,真正的数据存储在磁片中,可以想象一下光盘,硬盘不在我们今天讨论的范围之内)中的数据的话,通过地址访问的话,磁头会移动到地址所在的地方,这样才能把数据取出来。如果恰巧你硬盘磁头就在你需要访问的数据地址处,磁盘就不用花时间让磁头对准所需要访问的地址了,这样的话通过一个地址访问数据所花费的时间是取决于磁头的位置的,而我们接下来要介绍的RAM,对于任意地址的访问时间都是相同的,所以被起名为随机访问存储器

其实ROM也是随机访问的,所以这个ROM和RAM的起名就有点儿怪怪的了,也就是说ROM其实也可以写,并且也是随机访问的。所以我们忽视掉它们的命名吧,ROM和RAM的本质区别其实是:ROM是不易失的,而RAM是易失的,也就是断电后ROM里的数据还在,而RAM里的数据就会消失掉。下边我们重点介绍一下RAM的原理和使用。

SRAM和DRAM

RAM其实也是一个统称,它可以分为两种:

  • SRAM:静态随机访问存储器(Static Random Access Memory)

  • DRAM:动态随机访问存储器(Dynamic Random Access Memory)

这两种类型的RAM在具体的实现上非常不同,也导致了非常不同的特性,下边我们慢慢来看。

SRAM

SRAM存储一位二进制数的电路图如下:

可以看到这玩意儿里头有6个晶体管组成,如果你还记得前边说过的晶体管知识,其实M2和M4是一个非门,M1和M3也是一个非门,所以这个电路图就等价于这个电路图:

另外的两个晶体管M5和M6是nMOS晶体管,nMOS晶体管的特性就是在栅极是高电平时导通,低电压是不导通。所以当我们想使用这个装置存储一位数据时,就可以这样操作:

  • 位线表示我们希望存储的数据,位线与位线中的数据是相反的。

  • 将字线置为高电平,然后M5和M6就处于导通状态,n1和n2的值随之改变,不过n1和n2的值始终相反,我们以n1处的电平状态作为这个装置存储的数据。

这样一位数据就可以被存储到这个装置中,断开字线后数据也不会丢失。当我们想读取这个装置中存储的数据时,可以这样做:

  • 将字线置为高电平,将M5和M6导通。

  • n1处存储的数据就会传播到位线,这样我们通过读取位线的值就可以知道这个装置中存储的数据是什么了。

以上就是SRAM的存储一个二进制位的基本原理。原理不是很复杂,本质上就是一个锁存器而已。

DRAM

DRAM中的D指的是Dynamic,翻译过来就是动态的意思,来瞅瞅它存储一个二进制位的电路图,看看这玩意儿哪动态:

一眼瞅上去真是简单,就一个nMOS晶体管和一个电容器,它是怎么工作的呢?先看一下如何写入一位数据:

  • 位线上存储着即将写入的数据

  • 将字线置为高电平,然后M1导通,给电容器充电,电容器上有电就代表着存储二进制位1,没电了就代表二进制位0

哈,原理也so easy。看一下如何读:

  • 将字线置为高电平,M1导通。

  • 如果电容器中有电,它会通过M1放电到位线,然后位线就是高电平,如果电容器中没电,位线自然就是低电平。

读的原理也很easy。那Dynamic动态)是个啥意思呢?是因为电容器不老实,会偷偷摸摸的漏电,没多少毫秒上边的电就会被它泄漏完,这样的话,我们需要每个很短的时间给这个电容器重新充电(如果电容器中没电就不用充了)才能让它一直保持正确的数据,这也就是Dynamic的由来。而SRAM是清一色的晶体管构成的,不存在这个电容器漏电的问题,所以称为Static静态)RAM。

寻址

不论是SRAM还是DRAM,我们是用它们来大规模存储数据的,只存储一位数据显然是没有任何卵用的。我们现在先忽略掉SRAM和DRAM它们存储一位数据的不同实现,来抽象出一个RAM单个位的存储电路:

如果我们想让RAM可以存储多个二进制位的话,只需要把它们的位线连在一起就好了,比如这样:

如图我们展示了如何存储4个二进制位,我们可以这样写某个二进制位:

  • 位线上存储着即将写入的数据

  • 将该二进制位对应的字线置为高电平,然后就可以把位线上的数据写入到该二进制位的存储电路中。

读一个二进制位的数据的原理也很简单:

  • 将该二进制位对应的字线置为高电平。

  • 该二进制位就会从存储电路传播至位线上,我们通过读取位线的数据就可以知道该二进制位存储电路中的数据了。

从这个过程中我们可以看出,我们想访问某个二进制位的话,首先要把该二进制位对应的字线置为高电平。这一点很重要,大家需要牢记。这些二进制位就可以组成一个存储器,这个存储器可以对外界提供一些线路来存储该存储器里边的数据,我们把上边可以存储4个二进制位的电路封装成一个RAM,并且向外部提供一些访问的线路:

噫,等会等会~ 这个RAM不是可以存储4个二进制位么,那我们怎么指定要访问哪个二进制位呢?一根线只能有0或1两个状态,两根线就可以有00、01、10、11四个状态了,所以我们需要提供2根线来作为所谓的地址线,所以这个RAM的黑盒子可以画成这样:

我们可以制定一个规则,当地址线中的数据不同时,访问的RAM中的二进制位也不同,比如这个规则制定如下:

  • 当A0=0,A0=0时,访问第0个二进制位。

  • 当A0=0,A1=0时,访问第1个二进制位。

  • 当A1=0,A0=0时,访问第2个二进制位。

  • 当A1=0,A1=0时,访问第3个二进制位。

看着眼熟吧,这玩意儿就是我们之前说过的译码器嘛(不知道啥是译码器可以去前边文章里看看)~ 废话不多说,整一个2-4译码器就可以了:

这样我们就知道了这个RAM黑框框里到底是怎么实现的了。知道了如何制作存储4个二进制位的RAM,那存储8个二进制位的RAM的原理还不简单么,再加一根地址线就好了,23=8嘛!16个呢?32个呢?吧啦吧啦,就不多唠叨了,原理都是一样的。所以到现在为止我们就可以通过地址线和数据线去访问某个二进制位了。

一次存取多个位

我们上边说的每次只能访问一个二进制位,很浪费呀,我们想一次读出两个二进制位咋办,so easy,只要多加几条数据线就可以了:

看,只要某条地址线导通,就可以一次访问两个位的数据,那这个存储器一共可以存储多少个二进制位呢?计算公式就是:字线的数量 × 位线的数量。所以这个存储器的容量就是:4×2bit。那我们想一次做一个4×4bit的存储器咋办?直接ctrl+c,ctrl+v嘛:

4×8bit4×16bit8×8bit16×8bit的存储器的结构都会画了么?哈哈,ctrl+c,ctrl+v嘛。

READ/WRITE信号

每当我们把存储器的地址导通之后,存储器怎么知道我们是要读该地址的数据还是要写该地址的数据呢?起码需要在读该地址的数据时输入无效吧,所以需要新引进一个信号,用该信号来判断我们是要读该存储器,还是要写该存储器,我们就把这个信号命名为R/W,制定规则如下:

  • 当R/W=1时,准备读存储器。

  • 当R/W=0时,准备写存储器。

在读该存储器时数据输入Din是无效的,所以我们可以这样画电路图(以4×1bit的存储器为例):

简图

又到了抽象的时候了,画了这么多电路图,我们其实想要的就是一个黑框框,这个黑框框提供一些线路,可以让我们访问它里边存储的数据,如下:

如图,这个RAM有m个地址线输入,n个数据线输入和输出,所以它的容量就是m × n个二进制位。


    本站仅按申请收录文章,版权归原作者所有
    如若侵权,请联系本站删除
    觉得不错,分享给更多人看到
    我们都是小青蛙 热门文章:

    java并发编程之原子性操作    阅读/点赞 : 0/0

    我们都是小青蛙,呱呱呱呱呱    阅读/点赞 : 0/0

    活跃性(死锁、饥饿、活锁)    阅读/点赞 : 0/0

    InnoDB空间文件布局的基础知识    阅读/点赞 : 0/0

    指令重排序    阅读/点赞 : 0/0

    InnoDB的Buffer Pool简介    阅读/点赞 : 0/0

    一些比较重要的数字电路模块    阅读/点赞 : 0/0

    《UNIX环境高级编程》书籍推荐    阅读/点赞 : 0/0

    InnoDB中的B+树索引结构    阅读/点赞 : 0/0

    InnoDB索引页面的物理结构    阅读/点赞 : 0/0

    我们都是小青蛙 微信二维码

    我们都是小青蛙 微信二维码