一、引子
这一小节,
我们首先学习使用半导体元器存储0和1的基本原理。
然后通过半导体元器件组合,可以构成存储芯片。因为存储芯片里面存储了很多个字的数据,所以存储芯片必须提供一个寻址的功能。
最后再探讨不同的寻址方式。
二、半导体元件
现在来看一下组成主存储器的基本半导体元件及它的基本原理。
1.基本半导体元件
在第一章,我们学习过,一个存储器,可以分为存储体、MAR(地址寄存器)、MDR(数据寄存器)。
这三个部分,会在“时序控制逻辑”的控制下,相互配合着工作。如下:
存储体就是用来存放实际的二进制数0和1的,一个存储体由多个存储单元构成,每个存储单元又由多个存储元构成,也就是存储元件。
用存储元件,就可以存放二进制数0或1。
这里涉及到两个半导体元器件,下面的部分是电容,上面是MOS管。
(1)MOS管
==MOS管可以理解为一种用电控制的开关。==
①如果在左端加上一个高电压,比如达到了5V阈值,那么这个MOS管就可以导电。
②如果不给左端加电压,或者电压达不到阈值的要求,那么这个MOS管就是一个绝缘体,不导电。(可以看见图中虚线)
MOS管是 半导体 ,既不是导体也不是绝缘体。在给了一定电压条件之后,这个绝缘体可以变为导体;但如果给的电压条件不满足,它又不是导体。
(2)电容
电容在高中就学过了。
==一个电容由两个金属板还有中间的绝缘体构成。==
可以看见,下方的金属板是接地的,那么这里的电压就是0V
。
如果现在给上面的金属板加一个大于0V的电压,比如加一个5V
的高电压。
由于上下的金属板产生了电压差,所以电容里面的电荷就会开始移动。就是给电容充电。
当输入5V电压之后,电容里面就会保存一定的电荷。
如果在上面金属板输入的是低电平信号,比如0V
或者1V
,下方还是接地(0V)。由于上下金属板的电压差非常小,所以这种情况下,电容不会充电。
所以,可以根据电容是否保存了电荷两种状态的信息来对应二进制的0和1。
给电容充电就是写数据的过程;给电容放电就是读数据的过程。
2.读写二进制数
(1)读出二进制
①二进制1
假设现在电容上保存了一些电荷,规定,当它保存了一些电荷,就对应二进制的1。
那么该如何读取二进制的比特位呢?
只要给MOS管左端加上高电平信号,比如5V。也可以理解为输入了二进制的1。
当MOS管左端的电压达到一定阈值之后,这个MOS管就可以接通。
由于MOS管现在接通了,所以电容里面保存的电荷就可以顺着导线往外流。
当我们在右端检测到有输出电流的时候(如下图),
就意味着它输出了二进制的1。
②二进制0
如果此时电容里面没有保存电荷,比如下面的状态,表示二进制的0。
当MOS管接通的时候,在右端并不能检测到电荷的流出。
因此,就可以判断,电容里面保存的是二进制的0。
(2)写入二进制
假设现在想让电容保存二进制1,那么可以在右端加入一个5V的高电平电压。如下:
同样在MOS管也加一个5V的高电平(假设5V是阈值),让MOS管接通。
那么电容上面的金属板电压就是5V。又由于下方接地,所以下方金属板电压是0V。
只要电容金属板两端有电压差,就会导致电容里面的电荷开始移动。
所以电容就会存储一些电荷。
也就是存储了二进制的1。
再让MOS管断开,这样电容里面的电荷就跑不出去了。
3.存储体
如果将多个存储元进行科学合理地连接,那么就可以一次性读出或者写入多个二进制数据。
比如上边的一排二进制存储元,存储的二进制信息分别是:10100011
上面的红线,连接了每个存储元的MOS管(如下图)。
如果给红色的线
加一个5V的高电平,就意味着所有存储元的MOS管都接通了。
当MOS管接通之后,电容里面存储的电荷就可以顺着灰色的线
,然后从绿线
导出。
那我们只需要检测绿色的线有没有产生电流,来判断每条线对应的是二进制的0还是1。
如果有电流,就是二进制的1;如果没有电流,就是二进制的0。(如下图)
所以,根据这样的方式,就可以读出一整行的存储元(存储单元)所存储的二进制比特信息。也就是存储字。
多个存储单元就构成了存储体,也叫存储矩阵。
一次可以读出的二进制位就是一个存储字,这个例子的存储字长就应该是8bit(一行有8个存储元)。
如果现在有16个存储元构成一行,这就意味着存储字长变成了16bit。
那么现在就能理解,在第一章说过的,存储器每次读或者写的单位都是读或者写一个存储字。
因为同属于同一个存储字的存储元件,它们的MOS管的左端都是接着同一根线(图中红线)。如果接通了这根线,那么一行所有的存储元都同时接通。也就能同时读出或写入啦。
三、存储芯片的基本原理
刚才的存储体只包含了两个存储单元。
那么接下来我们要探讨,如何根据地址来决定要读或者写的是哪个存储字。
1.译码器
这就涉及到译码器的使用。
我们给出n位二进制地址之后,这n
位二进制地址会对应2^n
个存储单元。
所以译码器会根据地址寄存器MAR给出的这n位地址,把它转换成某一条选通线的高电平信号。
比如此时CPU给MAR送过来的地址是:000
000翻译成十进制是000。
所以译码器会给第0根字选线一个高电平输出。这样的话,第一个存储字对应的存储元件都会被选通。就可以读出每一位二进制数据了。
每一位地址,会对应译码器的一条输出线。
这个例子,总共有2^3=8
个地址。因此译码器的输出端总共会有8条线。
经过译码器的处理,一个地址信号会被转换成译码器的某一条输出线的高电平信号。
当红色的自选线
被接通之后,我们就可以通过数据线(图中绿线)把每一位的二进制信息传送到MDR中。
然后CPU会通过数据总线从MDR中取走一整个数据。数组总线的宽度和存储字长是相同的。
2.控制电路
接下来,我们继续完善存储芯片的构成。
需要增加一个控制电路。用于控制译码器、MAR、MDR。
比如,CPU通过地址总线把地址送到MAR中。由于我们使用的是电信号来传送这些二进制数据,而电信号难免会有不稳定的情况。
所以,在MAR中的电信号稳定之前,MAR中的地址信息是不能送到译码器当中的。
(这就是控制电路的一个作用,只有当MAR稳定之后,控制电路才会打开译码器的开关,然后让译码器翻译地址,给出相应的输出信号)
输出也是一样,只有当输出的电信号稳定之后,控制电路才会认为此时的输出是正确的。所以,控制电路也会控制MDR在什么时候给数据总线送出数据。
3.对外线路
存储芯片还需要对外提供一些线路。
①片选线
片选线又叫CS
(Chip Select)芯片选择信号或CE
(Chip Enable)芯片使能信号
如果给出的芯片选择信号是一个低电平的时候,就说明这个芯片的总开关是被我们接通的。
②读控制线
当我们需要读出数据的时候,就要给读控制线OE
一个低电平信号,表示此时要进行读操作。
③写控制线
当写控制线WE
的信号是低电平的时候,表示此时芯片正在进行写操作。(就是将MDR里面保存的数据输入到各个电容当中)
读控制线和写控制线可以分为两根,还可以将它们合二为一。用一根线
WE
来表示究竟是写还是读。(低电平写,高电平读)
:red_car:注意
==头上划线表示该信号低电平有效。==
需要注意题目中是两根读写线,还是一根读写线。这两种方式对外暴露的引脚数目是不一样的!
4.整合
那么,现在我们就可以给出存储芯片的完整构造。(如下图)
将内部细节去掉,再将其封装之后,就是之前学到的图,看一下对比图:
整体来看,存储芯片由这样的三个部件构成。
①存储矩阵就是一个一个的存储元。
②译码驱动电路实际上是译码器(上面介绍过)和驱动器(将电信号进行放大)
驱动器:译码器会输出某一条线路的高电平信号,这一条线会连接很多存储元,需要控制这些存储元的开和关。为了让译码器输出的高电平信号稳定有效,所以通常会在译码器后面接上一个驱动器,用来保证译码器输出的电信号是稳定可靠的。
③读写电路包括说的红线和绿线还有控制电路。
另外,存储芯片需要接收来自外界的地址信息,这个地址信息,通常是CPU通过地址总线传过来的。
还需要数据线进行数据的传输。
还要通过片选线的电信号来确定此时这块芯片是否可用。
读写控制线可能有一条,也可能有两条。
:question: 大家可能还会疑惑片选线有什么作用。
来看一个实际的内存条,中间一块一块的黑色的芯片就是存储芯片。
比如这一块内存条上的存储芯片的存储容量都是1GB,它总共有8块存储芯片,那么就可以存储8GB的数据。
如果你要读取的数据,刚好存放在这一块存储芯片当中:
当我们提供了一个读写的地址之后,只能让这一块存储芯片工作,其他的存储芯片不能工作。
这就是片选线的作用。如果只想读取这一块存储芯片指定地址的内容,那么就需要让这块存储芯片的片选线信号有效。(也就是CS信号给一个低电平)
当然,其他芯片的片选线信号都是高电平信号。
这样就可以保证,此次读取的就是指定芯片的数据。
补充一个知识,这里的每一块存储芯片都会对外暴露出一个一个的金属针脚(或者叫金属引脚)。如下:(每根线都会对应一个金属引脚)
这些金属引脚就是用来接收地址信号、数据信号或者片选线信号、读写信号的。
所以,会经常遇见这样的题目:告诉你一块存储芯片的某一些参数信息,让你判断这一块存储芯片的引脚数目至少应该是多少。
这种类型的题目,就是让你判断地址线(或数据线)有多少根,每根地址线(或数据线)会对应一个金属引脚。片选线也会对应一个金属引脚。还有读写控制线(用来表示此时进行的是读操作还是写操作),至少对应一个金属引脚(读写控制线分为两根就是两个金属引脚)。
另外,还有供电引脚、接地引脚等。
:books:补充
如果告诉你一个存储芯片有n位地址,那么就意味着地址线需要有n条。n位地址又会对应2^n
个存储单元。
知道了存储单元的数量,再乘以每个存储字长,就可以得出芯片的总容量。
之前,我们都是用多少个字节,或者多少个bit来描述一个芯片的容量。
还有一种描述方式,比如一块存储芯片是一块8*8位的,第一个8表示有8个存储单元,第二个8表示每个存储单元包含8位信息(也就是存储字长是8位)。
8K*8位
:有8K(2^13)个存储单元,存储字长是8位。所以这个芯片有13位地址,每一位地址对应一个存储元,一行有8个存储元。
5.寻址
接下来,我们进一步探讨关于寻址的问题。
图示里面,一个小方格表示一个字节(8bit)的信息,一行表示一个存储字。
那么这块存储芯片的存储字长是4个字节,假设容量是1k(2^10)个字节,所以有256个字(1024/4=256)。(也就是有256行)
现代计算机中,通常是按照字节编址的(每个字节对应一个地址)。
这个存储矩阵中一共有1k个字节,就对应1k个地址。(每一个字节对应一个地址)
但是现代存储器,通常也支持按字寻址、按半字寻址、按双字寻址。如下:
①还是来看一下==按字节编址==。
1K个单元,对应地址线就是10根(2^10=1K)。
那么地址就是10个0到10个1:(就是0~1023的范围)
现在将地址画在图里面:
②==按字寻址==
如果现在想要按字寻址,由于一个字占4个字节。因此会把连续的字节地址合并,看作一整个字
。
当我们指明要读的是第几个字的时候,只需要把字地址进行算数左移两位,如下:
这样就可以把字地址转化成与之对应的字节地址。(比如字地址是1,对应字节地址是4)如下:
比如,现在要读的是1号字。(第二行的字)如下:
那么将1进行算数左移两位,001变成了100,转化为十进制就是4。
这样就得到了这个字(1)起始字节的地址(4)。
字
是一行,字节
是一小块。
四、总结回顾
:bookmark: 往期精彩文章:
订阅专栏:计算机组成原理