第三章要解决的问题如下:
程序的局部性指的是什么?
存储器的层次结构是什么?
存储器的技术指标是什么?
什么是哈佛结构?
什么是大小端模式?
什么是边界对齐?
什么是SRAM?
什么是DRAM?
什么是存储器扩展?
如何根据芯片参数判断地址线和数据线数目?
如何计算芯片的地址空间?
什么是译码器?
存储系统
1.程序的局部性原理
在某一段时间内频繁访问某一局部的存储器地址空间,而对此范围之外的地址空间则很少访问的现象称为程序的局部性原理。
而局部性原理又可以分为两部分:
1.时间局部性:最近被访问的信息很可能还要被访问。
时间局部性体现了一种程序结构:循环结构
2.空间局部性:最近被访问的信息邻近地址的信息也有可能被访问。
空间局部性体现了一种程序结构:顺序结构
2.存储器的层次结构
存储器的大致结构如上图所示,需要注意的是速度越靠上越快,容量越靠下越大,价格越靠上越高。
其中辅存
的作用是:解决了主存容量不够和高成本的问题。
Cache
的作用是:解决了主存与CPU之间速度不匹配的问题。
两级存储系统
:内存储器和外存储器。
三级存储系统
:Cache
、主存和外存储器。即将内存储器又分为Cache
和主存两部分。
注意:CPU
不能直接访问外存储器,外存储器的信息必须调入内存储器后才能由CPU
处理。
3.存储器的技术指标
存储器的性能指标主要是存储容量
和存取速度
。而存取速度
通常可以用存取时间、存储周期和存储器带宽
来描述。
存储容量:
存储容量是指一个存储器中可存储的信息比特数,可以表示为存储字数(存储单元数)
×
\times
×存储字长(每单元的比特数)
。
存取时间:
从存储器接受到读/写命令开始到信息被读出或写入完成所需的时间,取决于存储介质的物理特性和寻址部件的结构。
存储周期:
存储器连续读写过程中一次完整的存取操作所需的时间,即CPU连续两次访问存储器的最小时间间隔。
存储器带宽(数据传输速率,频宽):
单位时间里存储器所存取的信息量,带宽=总线宽度/存储周期
。
下图是对存取时间和存储周期的细致划分:
由图可知,存储周期=存取时间+恢复时间
,因此一般情况下,存储周期略大于存取时间。
4.哈佛结构
哈佛结构是一种将指令储存和数据储存分开的存储器结构,可支持:数据和指令并行储存、指令预取,提高处理器的执行效率;另外,指令和数据可有不同的数据宽度。
5.大小端模式
如上图所示,对于一个int
数据
(
01234567
)
H
(01234567)_H
(01234567)H,我们将其转换为
(
00000001001000110100010101100111
)
B
(00000001001000110100010101100111)_B
(00000001001000110100010101100111)B,因为多字节数据在内存里是占连续的几个字节,而int
数据又占据连续的4个字节,所以应该将该数据划分为以每4个字节为一个地址的方式,但是怎么对应着内存里面的存储呢?这里就涉及了两个方法。
大端模式(Big-endian):
是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。即数据从左往右
存储。
小端模式(Little-endian):
是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。即数据从右往左
存储。
举个例子:
0x12345678
按大端模式存放时,其所在存储单元最低字节单元存放的数据是0x12
,最高字节单元存放的数据是78
。
0x12345678
按小端模式存放时,其所在存储单元最高字节单元存放的数据是0x12
,最高字节单元存放的数据是78
。
6.边界对齐
存放一个机器字的存储单元,通常称为字存储单元,相应的单元地址称为字地址。而存放一字节的单元,称为字节存储单元,相应的地址称为字节地址。
首先来说明一下什么是存储字长:主存的一个存储单元所包含的二进制位数。而目前大多数计算机的主存按字节编址,即一个字节对应一个地址。
边界不对齐:
编址的时候不考虑整齐性,有空就补。
边界对齐:
编址的时候考虑整齐性,如果不能一次就访问完,有空也不补,而是留出空位,以空间换时间。
一句话:K字节大小的数据必须要存储在K的整数倍的地址上。
7.SRAM
SRAM
用锁存器(触发器)作为存储元。只要直流供电电源一直加在这个记忆电路上,它就无限期地保持记忆的1
状态或0
状态。如果电源断点,则存储的数据(1
或0
)就会丢失。
如上图所示:左边是一个MOS管
,右边是两个MOS管
串联,T1
始终连接一个高电压,为导通状态。T2
若导通,因为T1
的导通电阻是T2
的100倍,这时电压全在T1
侧,故输出电压小,为截止状态;T2
若截止,则相当于T2
导通电阻无限大,此时电压全在T2
侧,输出电压大,为导通状态。
任何一个SRAM
,都有三组信号线与外部打交道:
1.地址线:
它指定了存储器的容量,设地址线为
n
n
n条,则存储器的容量是
2
n
2^n
2n个存储单元。
2.数据线:
它指定了存储器的字长,设数据线有
n
n
n条,则存储器的字长是
n
n
n位。
3.控制线:
它指定了对存储器进行读还是写操作。注意:读写操作不会同时发生。
若字长为16
位,则1字长=16/8=2字节
,按字寻址就为:
存
储
容
量
字
长
=
存
储
容
量
2
字
节
=
2
24
2
=
2
23
=
8
M
\frac{存储容量}{字长}=\frac{存储容量}{2字节}=\frac{2^{24}}{2}=2^{23}=8M
字长存储容量=2字节存储容量=2224=223=8M
若字长为32
位,则1字长=16/8=4字节
,按字寻址就为:
存
储
容
量
字
长
=
存
储
容
量
4
字
节
=
2
24
4
=
2
23
=
4
M
\frac{存储容量}{字长}=\frac{存储容量}{4字节}=\frac{2^{24}}{4}=2^{23}=4M
字长存储容量=4字节存储容量=4224=223=4M
为了方便组织更大的存储容量,目前的SRAM
芯片采用双译码模式。
对于单译码结构
,
n
n
n位地址需要
n
n
n条地址线,存储单元为
2
n
2^n
2n,译码输入线为
n
n
n条,译码输出线为
2
n
2^n
2n条;
对于双译码结构
,
n
n
n位地址需要
n
n
n条地址线,存储单元为
2
n
2^n
2n,而译码分为两部分,一部分给
X
X
X地址译码,一部分给
Y
Y
Y地址译码,故译码输入线为
n
2
+
n
2
=
n
\frac{n}{2}+\frac{n}{2}=n
2n+2n=n条,所需译码线为
2
n
2
+
2
n
2
=
2
n
2
+
1
2^\frac{n}{2}+2^\frac{n}{2}=2^{\frac{n}{2}+1}
22n+22n=22n+1条。
8.DRAM
DRAM
存储位元是基于电容器上的电荷量存储信息的,DRAM
的读操作是破坏性的,读操作会使电容器上的电荷流失,因而读出后必须刷新。而未读写的存储元也要定期刷新,因为电荷量会逐渐泄露而减少。
由于DRAM
容量很大,地址线的数目相当多,为减少芯片引脚的数量,将地址分为行、列两部分分时传送。存储容量为
1
M
1M
1M字,共需
20
20
20位地址线。此芯片地址引脚的数量为
10
10
10位。
为什么要进行刷新:
存储单元被访问是随机的,有些存储单元可能长时间的不被访问,不进行存储器的读写操作,其存储单元内的原信息就可能会丢失。
刷新的实质:
先将原信息读出,再由刷新放大器形成原信息重新写入的再生成的过程。
刷新周期:
两次刷新之间的时间间隔,又称刷新间隔。
刷新地址:
由刷新地址计数器给出。刷新地址计数器的宽度等于行地址锁存器的宽度。且自动刷新不需要给出列地址。即刷新按行进行。
刷新时间:
规定的一个周期内刷新的总时间。
注意区分刷新周期跟刷新时间。
集中刷新:
在一个刷新周期内,利用一段固定的时间,依次对存储器的所有行进行逐一再生,期间停止对存储器的读写操作,这段时间称为死区
。
优点:读写操作时不受刷新工作的影响,系统的存取速度较快。
缺点:在集中刷新期间(死区)不能访问存储器。
由
2
m
s
2ms
2ms的刷新周期,可以算出存取次数为
2
m
s
0.5
μ
s
=
4000
\frac{2ms}{0.5\mu s}=4000
0.5μs2ms=4000个,又因为DRAM
内部有
128
128
128行,故刷新次数为
128
128
128个,刷新时间为
128
×
0.5
μ
s
=
64
μ
s
128\times0.5\mu s=64\mu s
128×0.5μs=64μs,读写次数为
4000
−
128
=
3872
4000-128=3872
4000−128=3872个,读写时间为
2
m
s
−
64
μ
s
=
1936
μ
s
2ms-64\mu s=1936\mu s
2ms−64μs=1936μs。
分散刷新:
指对每行存储单元的刷新分散到每个存储周期内完成(对某一行某芯片进行读写操作后,紧接着刷新,包含在了读写周期内)。
优点:无死区
缺点:存取周期长,整个系统的速度降低了。
刷新周期为
2
m
s
2ms
2ms,又因为读写操作与刷新交替进行,故存取次数为
2
m
s
0.5
μ
s
+
0.5
μ
s
=
2000
\frac{2ms}{0.5\mu s+0.5\mu s}=2000
0.5μs+0.5μs2ms=2000个,刷新时间为
128
×
1
μ
s
=
128
μ
s
128\times1\mu s=128\mu s
128×1μs=128μs。
异步刷新:
前两种方式的结合,缩短了死时间,充分利用了最大刷新间隔为2ms
的特点(只要在2ms
内对这一行刷新一遍就行)。且把刷新安排在指令译码阶段,不会出现死区
。
这种方案克服了分散刷新许独占
0.5
μ
s
0.5μs
0.5μs用于刷新,使存取周期加长且降低系统速度的缺点,又不会出现集中刷新的访问死区
问题,从根本上提高了工作效率。
刷新时间为
2000
m
s
128
≈
15.6
μ
s
\frac{2000ms}{128}\approx15.6\mu s
1282000ms≈15.6μs。
9.存储扩展
1.位扩展
位扩展:
是指增加存储字长。例如,2
片1K
×
\times
×4
位的芯片,可以组成1K
×
\times
×8
位的存储器。
题外话:怎么根据给出的芯片判断地址线和数据线数目
2.字扩展
字扩展:
这种方式仅仅增加了存储单元数,各单元位数不变。
3.字位扩展
字位扩展:
即加长存储单元的数量又增加各单元的位数,字位同时扩展的时候,先进行为扩展,在进行字扩展。
所需芯片数量:
128
K
×
32
16
K
×
8
=
32
\frac{128K\times 32}{16K\times 8}=32
16K×8128K×32=32。
10.根据芯片参数判断地址线和数据线数目
一般题目中会给出芯片的参数值,如16K
×
\times
×8
的芯片,16K
代表存储器的容量,故为地址线的数目,16K=
2
14
2^{14}
214,故地址线就为14
条,8
代表存储器的字长,故为数据线的数目,8=
2
3
2^3
23,故数据线就为3
条;128K
×
\times
×32
的芯片,128K=
2
16
2^{16}
216,32=
2
5
2^5
25,其地址线为16
条,数据线为5
条。
11.计算芯片的地址空间
如上图所示,地址空间的编码是根据地址线的个数来确定的,即地址线有
n
n
n条,则二进制位有
n
n
n位,对于16K
×
\times
×8
的芯片,地址线有14
条,故编码地址从
A
0
−
A
13
A_0-A_{13}
A0−A13,进行扩展后,地址线有17
条,故编码地址扩展3
位,从
A
14
−
A
16
A_{14}-A_{16}
A14−A16,而地址的编码又是以16
进制的形式存储,故每四个二进制位表示一个地址,不足四位的,高位补0
。例如00000000000000000=00000H
,00011111111111111=03FFFH
,11100000000000000=1C000H
。
12.译码器
在编码时,每一组代码都被赋予了特定的含义,即表示一个确定的信息,而译码则是编码的逆过程,是把每一组代码的含义翻译
出来的过程。完成译码功能的逻辑电路称为译码器。
二进制译码器
将具有特定含义的一组二进制代码,按其原意翻译
成对应的输出信号的逻辑电路,叫做二进制译码器。由于
n
n
n位二进制代码可以对应
2
n
2^n
2n个特定含义,所以二进制译码器是一个具有
n
n
n根输入线和
2
n
2^n
2n根输出线的逻辑电路,如下图所示。
对于每一组可能的输入代码,译码器仅有一个输出信号为有效电平。因此,我们可以将二进制译码器当做一个最小项发生器,即每个输出正好对应于一个最小项。
译码器和其他功能模块都经常含有一个或几个使能输入端,利用使能端控制输入,既能允许电路正常工作,也能使电路处于禁止工作状态。