计算机组成原理3——存储器1

40 阅读13分钟

本系列文章是学习了网课《哈尔滨工业大学--计算机组成原理》之后,用以梳理思路而整理的听课笔记及相关思维拓展。本文涉及到的观点均为个人观点,如有不同意见,欢迎在评论区讨论。

存储器的分类

存储器是计算机中的重要设备,用来存放程序和数据。随着计算机的发展,CPU的速度变得越来越快,远超存储器的存取速度,存储器和CPU速度的不匹配是计算机运行速度受限的主要因素,但是CPU又需要和主存交换数据,因此也发展出各种各样的存储设备。可以从以下几个方面对存储器进行分类:

按照存储介质分类(存储介质是指能够寄存0、1并能够区别两种状态的物质或元器件) 1、半导体存储器,由半导体器件组成,易于集成,而且因为半导体器件的特点,速度较快。 2、磁表面存储器,在金属或者塑料基体的表面涂上一层磁性材料作为记录介质,工作时磁层随载体高速运转,用磁头在磁层上进行读写操作,利用剩磁状态的不同区分0和1,不会轻易丢失数据,但需要磁头、磁载体。 3、磁芯存储器,磁芯是由硬磁材料(不容易退磁,磁性保持时间长)做成环形元件,在磁芯中穿有驱动线和读出线,以进行读写操作。体积大、工艺复杂、功耗太大。 4、光盘存储器,采用激光在记录介质(磁光材料)上进行读写,有非易失性。

按照存取方式 1、随机存储器(Random Access Memory, RAM),可读写,存储器的任何一个存储单元的内容都可以随机存取,存取时间与存储单元的物理位置无关。根据存储信息的原理不同,又可分为静态RAM(触发器一直维持数据)和动态RAM(需要不停刷新电容以维持信号) 2、只读存储器(Read Only Memory,ROM),在程序执行时,只能将内部信息读出,不能轻易的写入以改变原始数据。

掩膜型只读存储器(Masked ROM,MROM),厂家一旦制成就无法更改。 可编程只读寄存器(Programmable ROM,PROM) 电擦除可编程只读存储器(Electrically - Erasable Programmable ROM,EEPROM) 闪存存储器(Flash Memory)

3、串行访问存储器,对存储单元进行读写操作时,按照物理顺序进行寻址,例如磁带存储器。

按照在计算机中的作用 主存:直接和CPU进行数据交换 辅存:主存的后援存储器,用来存放暂时不用的程序和数据,不能和CPU直接进行数据交换 缓存:一般用于两个存取速度不同的部件之间,起缓冲作用

在这里插入图片描述

为什么要这么多种类的存储器

因为我们想要存储器可以跟得上CPU的速度,即要求速度快; 但是这样价格贵,而价格自然是便宜更好; 而且还需要内存又大占的尺寸还小; 所以我们的要求是:存取速度和CPU的速度一样快、价格便宜、体积小、而且容量大 但是没有一种存储器可以满足:速度快、容量大、价格低还需要体积小 因此用多层次的存储器系统(结合多类存储器),以满足上述需求

存储系统的层次结构

存储器有三个主要的性能指标:速度、容量和每位价格,三者之间可以由下图体现,越往上的速度越快:

寄存器:直接在CPU内部参与运算,速度最快、价位最高、容量最小; 主存:存放将要参与运行的程序和数据;其速度与CPU速度差距较大,在主存和CPU之间加入了比主存速度更快、容量更小的高速缓冲存储器Cache; 磁盘和磁带属于辅助存储器,其容量远大于主存,大都用来存放暂时未用到的程序和数据文件; CPU不能直接访问辅存,辅存只能与主存交换信息,辅存的速度比主存慢得多; 在这里插入图片描述

缓存-主存体系主要解决CPU和主存速度不匹配的问题,缓存的速度比主存的速度高,只要CPU将近期要用的信息调入缓存,CPU便可以直接从缓存中获取信息,从而提高访存速度。但是由于缓存的容量小,需要不断的把主存的内容调入缓存,使缓存中原来的数据被调换。 主存-辅存层次主要解决存储系统的容量问题,辅存的速度比内存的速度低,不能和CPU直接交换信息,但是其容量远大于主存,可以存放信息,当CPU需要用到这些信息时,可以将辅存的内容调入主存,供CPU访问。 在这里插入图片描述

主寄存器

主存和CPU的联系

CPU从主存读取数据:当需要从存储器读出信息字时,由CPU将该字的地址发送到MAR,经地址总线送至主存,然后发出读命令,主存接收到读命令之后,将指定地址单元的内容读出,完成读操作,将该地址单元的数据送至MDR,至于信息由MDR送到什么位置,主存不管。 CPU向主存存数据:首先CPU将该字的地址通过MAR送到地址总线,并将信息字送入MDR,然后向主存发出写命令,主存接到写命令后,将数据线上的信息写入对应地址线指出的主存单元中。 在这里插入图片描述

静态RAM

基本电路

在这里插入图片描述

T1、T2:存储数据 T3、T4:提供电源给T1、T2 T5、T6:行开关,受行地址选择控制信号 T7、T8:列开关,受列地址选择控制信号

写信号: 行选中和列选中,导致T5、6、7、8全部选通 比如写入Data是1,A点被置1,A'被置0 A和A'的电位导致T1导通、T2断开 T1导通,导致A‘继续为0,T2继续断开,导致A继续为1,形成互锁 行列选择信号撤除以后,T3和T4继续提供电压,以此维持A和A’,A的1就是写入的信号 比如写入Data是0,A点置0,A‘被置1 A和A’的电位导致T1断开、T2导通 T2导通导致A继续为0,T1继续断开,A‘继续为1,形成互锁 行列选择信号撤除以后,T3和T4继续提供电压,以此维持A和A’,A的0就是写入的信号

读信号: 行选中和列选中后,直接将A的电平信号放大后输出即可

芯片举例

以Intel 2114芯片为例 A0A9是地址输入端 I/O1I/O_1I/O4I/O_4是数据输入输出端 CS\overline{CS}是片选信号 WE\overline{WE}是写允许信号

在这里插入图片描述

2114存储矩阵由64 × 64个基本单元组成,A8A_8~A3A_3是行地址,A9A_9A2A_2A1A_1A0A_0是列地址 2114有64行,由6个行地址控制(262^6 = 64) 64列看起来不能由4个列地址控制,是因为64列被拆分成四组,一个列地址进来会同时选中四组中的数据,也就是当提供行列信号后,同时输出四个数据(四个IO) 64列共包含64对T7T_7T8T_8管,64列分成四组,每组包含16列,由四个列控制信号控制(242^4 = 16)

举例 A8A_8A3A_3:000 000,A9A_9A2A_2A1A_1A0A_0:0 0 0 0 第0行被选中,64列中的四组,每组中的第一列被选中,即0,16,32,48这四列被选中 I/O1I/O_1I/O4I/O_4分别输出第0行的第0,16,32,48列,这四个存储单元存储的信息,或者IO先写入存储单元

在这里插入图片描述

动态RAM

基本电路

动态RAM采用电容存储电荷来寄存信息,电容上的电荷一般只维持1~2ms,即使电源不掉电,信息也会慢慢消失,必须定时对存储单元进行刷新,所以掉电后,信息会消失。

下面是三管动态RAM的基本单元电路: 在这里插入图片描述

读数据 先对预充电管T4T_4置预充信号,此时读数据线先处于高位 读选择线打开T2T_2CgC_g处于高电平,则使得T1T_1导通;T1T_1T2T_2导通导致读数据降为低电平 若CgC_g处于低电平,则T1T_1不导通;读数据为高电平 输出信号和CgC_g反向

写数据 写选择打开T3T_3,写数据线向CgC_g写入数据(充放电)

下面是单管RAM的基本电路: 在这里插入图片描述

读数据 字线上的高电平使T导通 若CgC_g有电荷,在数据线上产生电流,视为“1” 若CgC_g无电荷,数据线上无电流,视为“0” 读操作有破坏性,必须对电容进行再生

写数据 字线为高电平使T导通 若数据线上为高电平,经T管对CgC_g进行充电,使其存“1” 若数据线上为低电平,则CgC_g经T放电,使其无电荷存“0”

芯片举例

下面是三管动态RAM芯片的结构举例

这是一个1K × 1位的存储芯片,每一个小方块代表一个动态RAM基本电路(存储单元),因为是1K × 1位,所以地址位需要10位(2102^{10} = 1K),其排列成32 × 32的矩阵。行列译码器将地址转换,从而找到需要进行操作的存储单元。 在这里插入图片描述 下面是单管动态RAM芯片的结构举例

这是一个16K × 1的存储芯片,按理说有14(2142^{14} = 16K)根地址线,但是为了减少地址线的数量方便封装,地址信号分成两次传送,第一次传送7位行地址信号,第二次传送7位列地址信号。 在这里插入图片描述 上述单管芯片的具体读写操作

读信号 行地址经过译码之后,选中其中一行,该行上的MOS导通,并将其电容CsC_s上的电荷反映到128个读放大器的某一侧(0到63行反映到读放大器的左侧,64到127行反映到读放大器的右侧),因为放大器是一个跷跷板电路,其左右两侧电平相反,所以0到63行上CsC_s的电平和读出来的电平反向,64到127行上CsC_s的电平和读出来的电平同相。

写信号 行列信号经过译码之后,选中其中一个存储单元 如果该存储单元是0到63行,那么存储单元存储的信息和输入信号反向,即当输入信号是1时,该输入信号经过读放大器(跷跷板电路),CsC_s上的电平会被放电成0 如果该存储单元是64到127行,那么存储单元存储的信息和输入信号同向,因为输入信号是1时,它没有经过放大器(跷跷板电路),CsC_s上的电平会被充电成1 所以说,因为写的时候,0到63行是反向的,读的时候又是反向的,所以最终结果是对的

在这里插入图片描述

动态RAM的刷新

刷新实质是先将原存信息读出,再由刷新放大器形成原信息并重新写入的再生过程。通常有三种刷新方式:集中刷新、分散刷新和异步刷新。

集中刷新:在规定的时间内,对全部存储单元集中一段时间逐行进行刷新,此刻必须停止读写操作。 比如对128 × 128的矩阵的存储芯片进行刷新,如果数据的存取周期是0.5us,刷新周期是2ms,那么对128行集中刷新需要占用64us(读取再写入),也就是说每2ms中有64us需要用来刷新数据,这64us中不能进行读写操作,称为“死区”时间。

分散刷新:对每行存储单元的刷新分散到每个存取周期内完成,如果存取周期是0.5us,那么将存取周期延长到1us,前0.5us还是用于读写数据,后面0.5us用于刷新数据,这样存储单元的刷新周期变短,相当于每存取一次就刷新一次(会不会有一行一直不用,不会,128us内必然刷新所有行,如果有一行有数据读写,就放在数据读写后面;没有数据读写,那也要刷新),但是整个系统的速度降低。

异步刷新:还是2ms刷新所有行,但是不会一次性刷新,在2ms内将所有行刷新完成即可,即2000us / 128 = 15.6us,每隔15.6us刷新一行,刷新一行只停止一个存取周期(刷新的时候不能存取,刷新周期0.5us和存取周期一样)。这个0.5us可以安排在CPU不访问存储器的译码阶段,就是CPU不用访问内存的时候安排上刷新,集中刷新占用的时间实在太长,很难保证CPU不用内存。

动态RAM和静态RAM的比较

动态RAM静态RAM
存储原理采用电容存储电荷采用触发器存储电荷
集成度单管只需要一个MOS,三管需要四个4~6个MOS管
引脚数量顺序传送地址,可以减少引脚数量需要一次性传输,发挥速度优势
功耗只需要对电容进行充放电有四个管子一直处于工作状态
速度需要电容充放电,速度较慢反应较快

只读存储器

厂家已经写好了内容,不能修改(MROM)

MROM(掩模ROM),可以看到,行列地址线有行列译码器对地址进行翻译,但是并不是所有位置都有MOS管。当查询地址没有MOS管时,会输出0;当查询位置有MOS管,会输出。以此得知存储器储存的信息。但是很显然,MOS管的位置都已经被放置好了,根本无法修改原始信息在这里插入图片描述

用户可以自己写,只能一次(PROM)

PROM(一次性,熔丝),用户使用时,如果想存入“0”,则将耦合元件置大电流,将熔丝烧断,这样读取的时候就是0;如果想存取“1”,则将耦合元件置小电流,这样熔丝就不会熔断,这样读取的时候就是1。当然往往只能编程一次(如果你牛逼可以在以前的代码上再烧断新的熔丝,也行),不得再次修改在这里插入图片描述

可以多次写

EPROM

采用浮动栅雪崩注入型MOS管构成。当在漏端D加上正电压,会形成浮动栅以阻止源S和漏D之间的导通,此时MOS管处于0状态;若不在D端加正电压,则不能形成浮动栅,此时MOS管便能正常导通,此时MOS管处于1状态。

用户可以对不同位置的MOS管的D端编程施加或者不施加正电压以形成用户所需的ROM。如果想要重新编程,需要采用紫外线照射以驱散浮动栅,再次进行编程。 在这里插入图片描述

EEPROM、Flash