计算机组成原理4——存储器2

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

存储容量的拓展

位拓展

位拓展:增加存储字长。

4位拓展到8位,两片1K ×4位的芯片位拓展组成1K × 8位的芯片, A 0 A_0 A0~ A 9 A_9 A9是地址线,共有十根用于选择总共1K( 2 10 2^{10} 210)大小的地址。
当输入地址时,两片芯片同时选中,比如第一片的四位用于低四位,第二片的四位用于高四位,这样就可以通过访问一个地址,同时访问到8位的数据。以此实现位拓展。
在这里插入图片描述

字拓展

字拓展:增加存储器字的数量。

用2片1K × 8位的存储芯片组成一个2K × 8位的存储器,存储器字增加了一倍。所以需要对地址线进行拓展,从10根( 2 10 2^{10} 210 = 1K)拓展到了11根( 2 11 2^{11} 211 = 2K)。 A 10 A_{10} A10用于选择芯片,比如 A 10 A_{10} A10为1的时候只选中第一个芯片输出8位,当 A 10 A_{10} A10为0的时候只选中第二个芯片输出8位。以此实现字拓展。
在这里插入图片描述

字、位拓展

既增加存储字的数量,又增加存储字长,比如由8片1K × 4位存储器组成4K × 8 位的存储器。

当输入一个地址时,同时选中两个1K × 4位的芯片,高四位低四位组成8位输出,实现位拓展。

两片两个1K × 4位的芯片称为一组,这一组实现1K × 8位。

为了从1K × 8位拓展到4K × 8位,需要四组1K × 8位,通过两根地址线,来选择四组芯片,实现字拓展。
在这里插入图片描述
拓展举例
例1

设CPU有16根地址线,8根数据线,使用 M R E Q ‾ \overline{MREQ} MREQ作为访存控制信号, W R ‾ \overline{WR} WR作为读写控制信号。

下面有存储芯片:1K × 4位RAM、4K × 8位RAM、8K × 8位RAM、2K × 8位ROM、4K × 8位ROM、8K × 8位ROM及74138译码器和各种门电路,画出CPU与存储器之间的连接图
要求如下:
1、6000H到67FFH为系统程序区
2、6800H到6BFFH为用户程序区。

6000H:0110 0000 0000 0000
67FFH:0110 0111 1111 1111
可以看到系统程序区需要用到11位的地址去索引,需要2K的ROM,8根数据线;最终选择2K × 8位ROM
6800H:0110 1000 0000 0000
6BFFH:0110 1011 1111 1111
用户程序区需要用到10位的地址去索引,所以用1K的RAM,8根数据线;但是没有1K × 8位RAM,只能采用两片1K × 4位RAM
剩下的就是片选信号和使能信号的处理了,A0到A10要用来寻址
分析上面地址的二进制可以看到,A13、A12、A11可以用来选择芯片,RAM的A13、A12、A11分别是101;ROM的A13、A12、A11分别是100
A15、A14和 M R E Q ‾ \overline{MREQ} MREQ就随便当个使能信号算了
A13、A12、A11是101时,经过38译码器,输出 Y 5 ‾ \overline{Y_5} Y5,选中RAM
A13、A12、A11是100时,经过38译码器,输出 Y 4 ‾ \overline{Y_4} Y4,选中ROM
在这里插入图片描述

例2

与例1相同,要求做如下修改:主存的地址空间满足以下条件,最小8K地址为系统程序区,与其相邻的16K地址为用户程序区,最大4K地址空间为系统程序工作区。

最小8K地址
0000 0000 0000 0000
0001 1111 1111 1111
13位地址线,采用A0到A12作为地址线,选择8K * 8位ROM
A15、A14、A13为000,可以用来片选ROM

相邻16K地址
0010 0000 0000 0000
0101 1111 1111 1111
乍一看,因为最小8K地址被占用,用户程序区需要16KB空间,导致有15根地址线被占用
但是因为没有16KB的RAM,这里只能选择2片8K * 8位的RAM
重新拆分一下地址,分析地址和RAM的对应关系,其余的高三位信号保留了RAM的地址信息,可以用来片选RAM,剩下的13位是地址的变化,需要用到地址线
0010 0000 0000 0000
0011 1111 1111 1111
0100 0000 0000 0000
0101 1111 1111 1111

最大4K地址
1111 0000 0000 0000
1111 1111 1111 1111
选择1片4K * 8位的RAM,4K需要12根地址线,采用A0到A11作为地址线

接下来处理片选信号和使能信号
A15、A14、A13为000时,选择8K * 8位ROM;
A15、A14、A13为001时,选择第一片8K * 8位的RAM;
A15、A14、A13为010时,选择第二片8K * 8位的RAM;
A15、A14、A13、A13为1111时,选择4K * 8位的RAM;

在这里插入图片描述

例3

设CPU有20根地址线和16根数据线,采用 I O / M ‾ IO/\overline{M} IO/M作为访存控制信号, R D ‾ \overline{RD} RD为读命令, W R ‾ \overline{WR} WR为读命令。CPU通过BHE和 A 0 A_0 A0来控制按字节或字两种形式访存。

BHE和 A 0 A_0 A0控制内存访问的关系如下

BHEA0访问形式
00
01奇字节
10偶字节
11不访问

1、CPU按字节访问和按字访问的地址范围是多少?
2 20 2^{20} 220 = 1K * 1K = 1M字节,按字(16位地址线)访问1M / (16位/8位) = 512K

2、CPU按照自己访问需要区分奇偶体,最大64KB为系统程序区,相邻的64KB为用户程序区。写出每片存储器芯片对应的二进制地址码?
64K * 8位的ROM:1111 1111 1111 1111 1111到1111 0000 0000 0000 0000
64K * 8位的RAM:1110 1111 1111 1111 1111到1110 0000 0000 0000 0000
可以看到, A 0 A_0 A0 A 15 A_{15} A15用于RAM和ROM的寻址
因为需要按照字或字节两种方式访存,所以必须8位;同时又要奇偶访存,所以将64K拆成两个32以实现奇偶访存

A1到A15:用于地址的索引
A0:需要参与奇偶寻址,A0需要放到译码器中当为0时索引到偶数芯片,为1时索引到奇数芯片
A16:用于索引ROM还是RAM,当为1时,索引到ROM;为0时,索引到RAM

BHE、 A 0 A_0 A0 A 16 A_{16} A16控制内存访问的关系如下

A16BHEA0访问形式
000RAM_字
001RAM_奇字节
010RAM_偶字节
011RAM_不访问
100ROM_字
101ROM_奇字节
110ROM_偶字节
111ROM_不访问

A16、BHE和A0用作38译码器的输入C、B、A,上述表格在 Y 0 ‾ \overline{Y_0} Y0 Y 1 ‾ \overline{Y_1} Y1 Y 2 ‾ \overline{Y_2} Y2 Y 4 ‾ \overline{Y_4} Y4 Y 5 ‾ \overline{Y_5} Y5 Y 6 ‾ \overline{Y_6} Y6产生输出以进行控制
输出 Y 0 ‾ \overline{Y_0} Y0:CPU按字访问RAM1和RAM2
输出 Y 1 ‾ \overline{Y_1} Y1:CPU按字节访问RAM1
输出 Y 2 ‾ \overline{Y_2} Y2:CPU按字节访问RAM2
输出 Y 4 ‾ \overline{Y_4} Y4:CPU按字访问ROM1和ROM2
输出 Y 5 ‾ \overline{Y_5} Y5:CPU按字节访问ROM1
输出 Y 6 ‾ \overline{Y_6} Y6:CPU按字节访问ROM2

在这里插入图片描述

存储器的校验

在计算机的运行过程中,由于种种原因致使数据在存储过程中可能出现差错,为了及时发现并纠正错误,可以将原数据配成汉明编码。

你用计算机传输一串数字给另外一台计算机,但是这个数据在传输过程中,可能受到干扰,一串数字中的某一个数字可能高低电平不稳定导致从0变成了1,怎么办,你需要加入一种校验方式来确认你传输的数据是不是正确的。

汉明码是这么做的,它将校验结果和校验位置做了比较巧妙的绑定
一个包含7个二进制的数字串,1100101,检测位置放在其中 2 k − 1 2^{k-1} 2k1的位置
你要添加检测信息,检测信息肯定要放在数据中,但是为什么要放在这个位置,见下面

二进制序号1234567891011
汉明码 C 1 C_1 C1 C 2 C_2 C21 C 4 C_4 C4100 C 8 C_8 C8101

第1个检测位 C 1 C_1 C1检测二进制位置满足XXX1位置处的数据,也就是只要二进制序号中满足第0位是1的数据,都会被第一个汉明码检测到,那就有这样几个位置:0001、0011、0101、0111、1001、1011(这里只有11位数)
第2个检测位 C 2 C_2 C2检测二进制位置满足XX1X位置处的数据,也就是只要二进制序号中满足第1位是1的数据,都会被第二个检测位检测到,那就有这样几个位置:0011、0110、0111、1010、1011
第3个和第4个检测位分别检测二进制位置满足X1XX1XXX的数据
如果第1个和第3个检测位检测到错误,其它的检测位没有检测到错误,那就说明错误数据在二进制位置0101处,因为位置0101处的数据错误会造成检测XXX1的第1个检测位检测错误和检测X1XX的第3个检测位检测错误,其它检测位置检测不到它,所以可以通过检测位定位到数据错误的位置

以第1位检测位为例,如果XXX1位置处的数据有奇数个1,那么检测位置1;如果XXX1位置处的数据有偶数数个1,那么检测位置0,保证始终是偶数个1。
现在第4、3、2、1位检测位是0、1、0、1。说明二进制序号第五个位置的数据传错了。为什么呢?
第一位校验位出错说明3、5、7、9、11,有一个位置出错
第三位校验位出错说明5、6、7有一个位置出错
第二个校验位没有出错,说明3、6、7、10、11没有问题
综上就可以看出第五个位置存在问题

看一下第1位校验位和第3校验位,校验位置的交集是5,说明只有5这个位置的数据错了,才会造成这两个校验位和数字的奇偶数量对不上,这样就能把错误的那位数据检测出来了。
这个5可以直接通过校验位得到,第1位校验位校验XXX1位置的数据,第3位校验位校验X1XX位置的数据,其它校验位正常,那么错误的位置必然满足0101,也就是位置5的数据错误

汉明码中新增的检测位数满足:
2 ^ k >= n(数据位数)+ k(校验位也需要校验) + 1(需要一种全部正确的情况)

纠错理论
L -1 = D + C
D是检测错误的位数,C是纠正错误的位数且纠错能力小于或等于检错能力,编码最小距离L(在一种编码系统中,任意两组合法代码之间的最少二进制位数的差异)

编码最小距离等于1时:如果一组编码的码长为n,那么这组编码共可以表示 2 n 2^n 2n种数据,如果认为这 2 n 2^n 2n都是合法数据,当有1位发生改变,就会编程另外一种合法数据,而且无法知道有无错误。

编码最小距离等于2时:比如奇偶校验,除去奇偶校验位,当有1位发生改变,就会奇偶校验出来肯定不对,但是只能知道有一位数据不对;比如0 1111和 1 1111,最高位是就校验位,那么0 1111是合法数据,1 1111是非法数据。如果两位同时出错,那么奇偶校验不发生改变,但是实际上数据已经发生了变化,所以说只有一位的检测错误能力,但是也只能知道数据有问题,而没有纠错能力。

编码最小距离等于3时:当有1位发生改变,相较于原来的合法数据,距离变成了1,而与其它合法数据的距离变成了2,所以可以检测并纠正;但是如果发生了两位改变,那就无法区分究竟是一个合法数据变化了两位,还是一个合法数据变化了一位,可以检测到错误,不能纠正错误。所以它的纠错能力是一位,检测错误的能力是两位。

编码最小距离参考:https://blog.csdn.net/weixin_45783996/article/details/116203267
编码最小距离参考:https://blog.csdn.net/weixin_45783996/article/details/116203267
编码最小距离参考:https://blog.csdn.net/weixin_45783996/article/details/116203267

上述文章说的很清楚,我直接引用其中的总结:我们可以在2^n个可用的码字中间选择一些码字来对信源符号进行编码,把这些码字称为合法码字,而其他没有使用的码字称为非法码字。这样合法码字之间的汉明距离就会拉开,有些合法码字发生错误后有可能变成非法码字,接收端收到这些非法码字后就可以判断出传输过程中出现了错误。码字之间的最小汉明距离越大,编码的抗干扰能力就越强。
可以看出,检验位的长度越长,合法码字所占的比例就越小,如果这些码字能够尽可能地在所有的码字中均匀分布的话,合法码字之间的最小汉明码距就越大,编码的抗干扰能力也就越强,因此设计编码方法的最重要的任务就是使合法码字尽可能地均匀分布。

提高访存速度

随着计算机的发展,CPU功能增强,处理的数据、设备越来越多,其对存储器的工作速度和容量要求越来越高,主存的存取速度已经称为计算机系统的瓶颈。提高访存速度的方式有很多种,以下为例:

单体多字系统

在一个存取周期内,CPU直接取出4条指令,然后逐条将指令送至CPU执行,以此增大存储器的带宽,提高单体存储器的工作速度。
但是必须需要指令和数据在内存中是连续存放的,如果遇到转移指令、或者操作数不能连续存放,该方法的效果就不明显。
比如,CPU想取16位的数据,直接一次读取64位的数据;但是写入的话,想写入16位的数据,一次会覆盖64位长的范围,也就是会有48位长的数据被覆盖,需要特殊的硬件结构去处理。
在这里插入图片描述

多体并行系统

采用多体模块组成存储器,每个模块有相同的容量和存取速度,每个模块有自己的地址驱动器、数据寄存器、地址译码、驱动电路和读写电路,模块可以并行工作。主要是因为存储体在一段时间内不能反复访问,所以就分成多个模块

首先是高位交叉编址的多体存储器,其程序按照顺序存放,所以会造成CPU在一段时间内主要与一个模块进行数据交互,其它模块围观的情况。存储器的读取周期是一定的(在一段时间内不能再次访问该模块),所以如果需要频繁读取数据的话,会造成等待,存储器的读取速度依然很慢。
在这里插入图片描述
另外一种结构的多体存储器可以解决这个问题,其程序连续存放在相邻模块中,而不是一个模块用完再用下一个模块。叫做低位交叉编址的多体存储器
在这里插入图片描述
下面是多体存储器提高访存速度的例子,在一个访存周期内,CPU交叉访存了四个模块的数据,虽然每个模块的访存周期没有改变,但是在CPU的一个访存周期内,访存的带宽增加了四倍。
在这里插入图片描述

高性能存储芯片

SDRAM
Synchronous DRAM,同步DRAM。
比如系统时钟周期为10ns,对异步工作(不需要时钟同步信号)的DRAM来说,存储器接到数据后需要50ns才能读出数据,那么CPU需要等待50ns才能获取数据;但是对同步工作的SDRAM来说,CPU只需将地址放入锁存器,在存储器进行读期间可以去完成其它操作,当CPU计时到5个时钟周期后,便可以获取存储器读出的数据。
而且这是一个周期访问一次数据,双数据速率的SDRAM(Double Data Rate SDRAM,DDR-SDRAM)在每个周期可以向处理器发送两次数据。

RDRAM
RamBus DRAM

CDRAM
CDRAM:带Cache的RAM,在通常的DRAM芯片内又集成了一个小的SRAM。
下图是1M × 4位的CDRAM,其中SRAM为512 × 4位,DRAM排列成2048 × 512 × 4位的阵列。
地址线只有11根,行列信号分时传输进来,首先是11位(2048)的行信号,行信号保存到行地址锁存器中,且该行地址下的所有数据(512 × 4位)保存到512 × 4位的SRAM中;
然后是9位(512)的列地址信号,保存到列地址锁存器中,然后行列地址一起作用选出指定的数据。
此时,SRAM开始显现它的作用了,当出现下一次读取的时候,首先比较输入进来的行地址和行锁存器中的地址是否相同,如果相同,那么数据就在SRAM中,直接输入列地址进来检索即可;如果不相同,那么就刷新行锁存器中的行地址和SRAM中的数据。
这种方式在读取块数据的时候非常迅速方便(因为都放在一起,而你把这一块的数据都放在SRAM中了)。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值