缓存的功率大于主存,速度高于主存,缓存和主存之间,通过硬件技术进行连接,为了解决CPU和主存速度的不匹配问题,使用硬件技术 提升速度。主存辅存之间通过软硬件结合进行连接,辅存用于解决主存容量问题。
存储体由若跟个存储单元组成,存储单元由多个存储元件组成
存储体----存储单元(存储一串二进制串)----存储元件(存储一个0/1)
存储单元:存放一串二进制代码。
存储字:存储单元中的二进制代码
存储字长:存储单元中二进制代码位数。
存储单元按照地址进行寻址
MAR:存储器地址寄存器,反应存储单元个数。保存了存储体的地址(存储单元的编号),反应了存储单元的个数。所以MAR的位数和存储单元的个数有关。
MDR:存储器数据寄存器,反应存储字长(存储单元长度)。保存了要送入CPU中的数据或要保存到存储体中的数据或者刚刚从存储体中取出来来的数据。这个寄存器的长度和存储单元的长度相同。
如12345678 H 在主存储器中如何进行存储?
寻址方式及寻址范围计算:
地址线24根,按字节寻址,地址个数 = 2^24 * 1B = 16MB
如果字长16位,按字寻址,地址个数 = 8MW
如果字长32位,按字寻址,地址个数 = 4MW
地址线(单向) | 数据线 (双向) | 芯片容量 |
---|---|---|
10 | 4 | 2^10 * 4 = 1K * 4 |
14 | 1 | 2^14 * 1 = 16K * 1 |
13 | 8 | 2^13 * 1 = 8K * 8 |
片选线作用
让某一组芯片同时进行工作。如下图所示,使用32片 16K * 1位的存储器组成 64K * 8 位的存储器。16 K * 1说明每个存储器的数据线为1根,要组成64K * 8 位的存储器,只需使得每次读数据是从8个16 K * 1存储器中各读取一位即可,这时候就可以使用片选线同时选中8个 16K * 1的存储器。
1、线选法
从上图可以看出,地址总线为4,数据总线为8,按照字节进行寻址,内存大小为16 * 8 b。通过地址线判断从那个字节进行数据的读取,换句话说,如果地址输入为0000,在只有字线0有效,其他字线无效。
线选法存在的问题:
如果容量稍大,比如为1M * 1 ,则此时有20根地址线,相应的有2^20 = 100万根字线,这样导致芯片字线非常密集,并且很难把芯片的密集程度做的很高。
2、重合法
对于重合法,同样如果有1M * 1的容量,此时X(行)、Y(列)各有十根地址线,对应的字线各有1024条,则公有2048跟字线。
1、静态RAM保存0和1的原理是什么?
静态RAM使用的是触发器进行存储数据,触发器由四根晶体管构成,属于双稳态触发器,具有源端和非端用于存储数据,一方为0另一方为1,一方为1,另一方为0。
2、静态RAM基本单元电路的构成是什么?
图中是保存一个0位或者1位的电路。
行地址线选择:相当于重合法图中的Xn,每行有多个基本单元电路,行地址选中一行中所有的基本单元电路。
列地址选择:相当于重合法图中的Yn,每列有多个基本单元电路,列地址选中一列中所有的基本单元电路。
每次读取数据,需要行和列同时被选中。
T1 ~ T4为触发器,T1和T4用于存储0和1,T5和T6用于控制读取哪一端数据。
在实际的芯片中,会将虚框中的内容(T1 ~ T 4, T5和T6)进行列分布而非单独一个,T7和T8属于列开关,行列交叉点会有多个基本单元电路,能读出多位数据。
3、静态RAM对单元电路如何进行读出和写入?
(1)读操作:
读数据时,虽然T5开,T7开,但是非端数据到写放大器就终止了。
(2)写操作
写数据时,左边的写放大器把右边的写放大器的值取非后进行输出,保证A和非A端的值相反。
4、Intel 2114静态RAM芯片的结构及读写操作?
以Intel 2114芯片举例,Intel 2114 外特性如下图:
Intel 2114 芯片是由64 * 64位矩阵构成。由图中可知,芯片地址线9根,数据线4根,那芯片内部是如何进行布局的呢?具体布局如下图:
如图所示,地址线共10位,其中行地址线6位,列地址线4位,行字线2^ 6 = 64,列字线 2^ 4 = 16。读取数据时如下所示:
将64列数据分为四组,每组16列。数据读取的时候,如,行地址为000000,列地址为0000,此时,行位线选中第一行中所有的元件,列地址选中每组中的第一列,这样就从每组中读取一位,共读取四位数据。写数据和读数据同理。
1、动态RAM保存0和1的原理是什么?
动态RAM使用电容,电容中保存了电荷为1,电容没有被充电为0。
2、动态RAM基本单元电路的构成是什么?
动态RAM基本电路有两种,如上图左(三管动态RAM)、右(单管动态RAM)。
3、动态RAM对单元电路如何进行读出和写入?
(1)左侧电路读写操作
读操作: T4为预充电信号,如果预充电信号有效,T4会被打开,Vdd通过T4对读数据线进行充电,使得读数据线成为高电平,如果是进行读操作,则读选择信号有效,T2打开,如果此时CG中保存的数据是0,也就是CG没有充电,则T1不会导通,则读数据线就会保持高电平,所以,如果保存的数据是0,则在读数据时候,读出的数据是1。如果CG电容中保存的数据是1,T1导通,此时读数据线上的电平通过T2,T1线路进行放电,读数据线低电平,读出的数据为0。所以电容读出的信息和原存的信号是相反的。
写操作: 写入和输入信息相同。如果是写操作,写选择线有效,T3导通 写数据线会通过T3向CG充电,或者CG通过T3进行放电,如果写入的数据是1高电平,写数据线会通过T3向CG充电,CG写入1.如果写入是0,则CG通过T3进行放电,CG放电为0。
(2)右侧电路读写操作
读操作: 如果相应的行被选中,字线连接的T被打开,电容就会通过T进行充电或者放电,如果CG中有电位1,此时放电,则数据线有电流,如果CS中没有充电,则数据线无电流,通过数据数据线有无电流判断CS中保存的是1还是0。
写操作: 写入时,写入1,数据线有电流,进行充电为1。写入0,数据线无电流,放电为0。
4、动态RAM芯片的结构及读写操作?
(1) 三管动态RAM(Intel 1103)
三管动态RAM读写操作:
单管动态RAM外特性:
上图中,大小为16k X 1,所以有14根地址线,图中地址线只有A0 – A6共7根线,此时行地址和列地址分为两次传输,将行地址和列地址分别保存早缓存器中。
单管动态RAM读写操作:
图中的读放大器的工作原理像一个撬撬板电路,一端为0,另一端就是1,一端为1,另一端就是0。
读操作: 如果选中63行,0列。则63行中所有的开关都被打开,如果电容中有电,则读放大器左端为1,则右端为0,此时读出的数据为0。如果电容中没有电,读放大器左端为0,则右端为1,此时读出数据为1。
写操作: 如果如果选中63行,0列。写入1,读放大器右端为1,左端为0,写入0。如果写入0,读放大器右端为0,左端为1,写入1。
以上电容中实际数据和写入读出数据相反,但是读出和写入的数据相同。
三管动态RAM和单管动态RAM电路比静态RAM电路多出放大器,放大器所用:电容存在漏掉,需要刷新放大器没过一段时间对每一列上的电容进行刷新重现。
5、动态RAM为什么要进行刷新,刷新方法是什么?
由于动态RAM使用电容存储信息,电容容易漏电,经过一段时间,电容漏电,会导致数据有1变为0,。动态RAM刷新只和行地址有关,和列地址无关,每次刷新的是一行中的所有基本电容电路。给出行地址,某一行被全部选中,这个行上所有电容中的信息都会被送到读电路,如果在读数据线和写数据线之间增加一个刷新放大器(每一列都加),就会完成对一行数据的刷新。
(1) 集中刷新:以128 * 128矩阵为例
首先主存储器的存储周期 为0.5us。
上图中的集中式刷新:每隔2ms对128行进行全部刷新,存取周期为0.5us,所以刷新每行也需要0.5us,2ms内,刷新需要64us。在这段死区内,CPU无法对动态RAM进行读写操作。
(2)分散刷新:以128 * 128矩阵为例
上图的分散式刷新:延长存取周期为正常存取周期的两倍(0.5us * 2 = 1us)。每1us对其中的一行进行刷新,128us刷新全部的128行。虽然没有死区,但是刷新过于频繁,并且延长了CPU的读写周期。
这种方式存取周期为0.5us,在集中式刷新中,每隔2ms对128行进行全部刷新,2ums= 2000us,即如果平均分到每行,则每15.6um刷新一行。若将刷新安排在指令译码阶段,就不会出现死区。
DRAM用于做主存,SRAM用于主存和CPU之间的缓存。这样就可以降低成本同时加快访问速度。
1、掩模 ROM ( MROM )
行列选择线交叉处有 MOS 管为“1”
行列选择线交叉处无 MOS 管为“0”
熔丝断为 “0”
熔丝未断为 “1”
3、EPROM (多次性编程 )
G:栅极 S:源 D:漏
使用紫外线进行擦洗
D 端加正电压形成浮动栅,S 与 D 不导通为 “0”。
D 端不加正电压不形成浮动栅,S 与 D 导通为 “1”。
4、EEPROM (多次性编程 )
使用电擦写,可局部擦写,也可全部擦写。
5、Flash Memory (闪速型存储器)
第三种EPROM价格便宜,集成度高。
第四种EEPROM,电可擦洗重写。
Flash Memory比 EEPROM快,具备 RAM 功能。
1、位扩展(增加存储字长)
上图为用两个 1k * 4 位存储芯片组成一个1K * 8位的存储芯片。在读取数据的时候,通过cs片选线同时选中两个芯片,将每个芯片中的四位组成8位传送到数据线上。
图中是将连个1k * 8的存储芯片组成一个2k * 8的存储芯片。共需要11根地址线 ,8根数据线,其中10根地址线选中具体的一个地址,第十根地址线用作片选线,当第十根为0时候,使用芯片1,当第十根为1时候,使用芯片2。
用8片 1K * 4位的芯片组成4K * 8位的芯片。其中有12根地址线,8根数据线,其中两根地址线作为片选线,一个片选地址选中两片芯片。
集合 | 检错位数与纠错位数 |
---|---|
{000,001,010,011,100,101,110,111} | 检0位错、纠0位错 |
{000, 011,101,110} | 检1位错,纠0位错 |
{000,111} | 检1位错,纠1位错 |
{0000,1111} | 检2位错,纠1位错 |
{00000,11111} | 检2位错,纠2位错 |
下面一次解释一下上表中的含义:
第一行: 列举出来的8个编码都是合法编码,只要改变其中任何一个编码中的任意某几位,就能够将其转变成集合中的另一个合法编码,这种情况下,即使发生了错误,结果依然是合法代码,所以不能检错也不能纠错。
第二行: 列举出四个编码为合法编码,其他的为不合法编码。需要改变任意一个编码中的两位,才能使其变成其中的另一个合法代码,如果只是改变一个合法编码中的一位,生成的为不合法编码。如果检测都集合中有一个为不合法编码,则其实通过那个合法编码发生的错误无法得知,如000,101,110都可以发生一位错而变成100。所以这种这种情况能检测一位错误而无法纠正错误。
第三行: 列举出两个编码为合法编码,其他的为不合法编码。这样,需要一个合法编码同时改变三位,才能变成另一个合法编码。此时如果检测到这个集合中有一个不合法编码,如果是100,则他可能是通过000改变一位到的,也可能是通过111改变两位得到的,通过概率,一位发生错误的概率更大,所以这种情况都认定是000改变一位得到的,所以可以将100纠正为000。如果这个不合法编码是101,则判定是通过111改变一位得到的,则纠正其为111。
第四行: 列举出两个编码为合法编码,其他的为不合法编码。这样,需要一个合法编码同时改变四位,才能变成另一个合法编码。此时如果检测到这个集合中有一个不合法编码,如果是1000,则判定为通过0000改变一位得到的,纠正其为0000;如果是1100,则判断是两位发生错误的不合法代码,无法判断是0000还是1111发生了错误;如果是1110,则判断是通过1111改变一位得到的,纠正其为1111。所以这种情况下能检测两位错误,纠正一位错误。
第五行: 列举出两个编码为合法编码,其他的为不合法编码。这样,需要一个合法编码同时改变五位,才能变成另一个合法编码。此时如果检测到这个集合中有一个不合法编码,如果是10000,则判定为通过00000改变一位得到的,纠正其为00000;如果是11000,则判断通过00000改变两位得到的,纠正其为00000;如果是11100,则判断是通过11111改变两位得到的,纠正其为11111;如果是11110,则判断是通过11111改变一位得到的,纠正其为11111。所以这种情况下能检测两位错误,纠正两位错误。
编码最小距离是任意两组合法代码之间 二进制位数 的 最少差异, 既一个合法编码改变n位能够变成另一个合法编码,则这个n就是最小距离。
由前面的举例可知,编码的纠错 、检错能力与编码的最小距离有关。最小距离越大,纠错 、检错能力越强。
汉明码采用奇偶检验和分组校验
奇偶检验和分组校验: 将一个二进制编码划分为不同的组,通过添加检验位,使得每组中包含奇数个或者偶数个1。这里采用偶数校验进行举例,即添加校验位使得每组中包含偶数个1。
那如何进行添加校验位,如何进行分组呢?
添加校验位:
校验位添加的位置:将校验位添加在编码的0,2,4,8…位置。
校验位取值:与该位所在的检测“小组” 中承担的奇偶校验任务有关,如,如果是偶校验,则添加校验位后要使得小组中1的个数为偶数个即可。
意思就是将位置 XXXX1分为一组,XXX1X分为一组…,位置从1开始。分组之前,是先放置好校验位,放置好之后再进行分组,分组是将校验位和原数据一起进行分组划分。
上面的解释不太好理解,下面举例进行说明。
如,如果有一个编码为0101,对其进行添加校验码,并分组结果如下:
首先,计算需要添加的校验位个数 K = 3;所以添加到的位置为1, 2, 4,所以将四位编码一次放在3,5,6,7位置。得到结果如下:
此时将数据分为三组如下:
第一组 | 位置编码 | 0001 | 0011 | 0101 | 0111 | 将位置为0001的数分为一组 |
代表位置 | 1 | 3 | 5 | 7 | 即将1,3,5,7分为一组 | |
实际编码 | 0 | 0 | 1 | 1 | ||
第二组 | 位置编码 | 0010 | 0011 | 0110 | 0111 | 将位置为0010的数分为一组 |
代表位置 | 2 | 3 | 6 | 7 | ||
实际编码 | 1 | 0 | 0 | 1 | ||
第三组 | 位置编码 | 0110 | 0101 | 0110 | 0111 | 将位置为0100的数分为一组 |
代表位置 | 4 | 5 | 6 | 7 | ||
实际编码 | 0 | 1 | 0 | 1 |
上面分组中,在位置1放置0,二位置放置1,4位置放置 0,使得每组中1的个数为偶数个。最终结果如下:
即得到0101的汉明码结果如下:0100101。
添加检测位之后,形成新的检测位 Pi ,其位数与增添的检测位有关,如增添 3 位 (k = 3),
得到新的检测位为 P4 P2 P1 。
以 k = 3 为例,Pi 的取值为:
校验结果如下:
P4 P2 P1 | 检测结果 |
---|---|
0 0 0 | 无差错 |
0 0 1 | 位置1发生错误 |
1 0 1 | 位置5发生错误 |
1 1 0 | 位置6发生错误 |
1 1 1 | 位置7发生错误 |
即P4 P2 P1是多少,那就是哪位发生错误。
所以,P4 P2 P1 = 110。所以是第6位发生了错误,即正确的汉明码为01001 0 1。即原正确的数据为0101。
如果发生错误的位置为校验码所在的位置,则不用纠错。
对于这种单体多字系统,把存储器的存储字长加长,如CPU字长为16位,存储器字长设为64位,CPU每次访问存储字,都可以取出四个存储字,这四个机器字,每个都可以是一条机器指令,或者是长度为16的数据,CPU一次把这四个值从内存中取出,放到数据寄存器中,下次再用的时候,直接从数据寄存器中取出相应的数据或者指令,这样可以增加存储器的带宽。
缺点:
1、 现在CPU要往存储器中某一个存储单元写一个长度为16的字,需要先把这个字写入到单字长寄存器中,再写入到数据寄存器中,之后在写入到存储器中,存在问题是,我们可能是需要写入16为,但是数据寄存器中的其余48位也会被写入到存储器中,会造成48位被修改,这个修改可能是错误的修改。
2、 如果我们要取的数据和指令不是连续存放在相邻的地址当中,比如我们一次取出四个指令,而第一个指令为跳转指令,跳转范围很大,超出了其他三个指令的内存地址范围,那取出的四个指令只有一个是有用的,其他的三个都是没有用的。
**1、高位交叉:**顺序编址
各个体并行工作:
上图为多体并行,使用高两位区分访问的是那个存储体,第四位表示访问某个存储体的具体地址,当一个存储体正与CPU交换信息时,另一个体可同时与外部设备进行直接存储器访问,实现两个体并行工作,提升效率。各个体分别响应不同请求源的请求,实现多体并行。
缺点:这种存储体存放信息时顺序存储,上一个存储体存满后才存储下一个存储题,由于程序运行过程一般是顺序存储访问,就会导致程序运行过程中,一个存储体会被频繁访问,而其他的存储体闲置。而上图的方式也是存储题容量的扩展方式,所以这种方式更适合存储体容量的扩展,而不适合用于提升存储体的带宽和访问速度。
**2、低位交叉:**各个体轮流编址
上面这种方式进行低位交叉,高四位确定具体某个存储体中的地址,低两位确定具体是哪个存储体,保存按照横向顺序进行编码存放指令。
当执行一个程序的时候,CPU给出地址(体内地址和体号),如果访问的是M0,M0把内部地址和读写命令进行锁存,然后M0自己去完成读操作,之后,在这个存取周期内,CPU还可以继续给M0,M1,M2发出命令, 如果M0准备好了数据,在一个存储周期要结束的时候,就可以想CPU进行数据传送,这种方式就是第三章中的分离式通信。这种方式各个体分别可以响应相同请求源的请求,实现多体并行。
低位交叉的特点:在不改变存取周期的前提下,增加存储器的带宽
设四体低位交叉存储器,存取周期为T,总线传输周期为τ,为实现流水线方式存取,应满足 T = 4τ。
所以,连续读取 4 个字所需的时间为 T+(4 -1)τ。