更新于 

存储器与CPU连接

主存储器与CPU的连接原理

  • 主存储器通过数据总线、地址总线和控制总线(读/写)和CPU相连
  • 数据总线的位数与工作频率的乘积正比于数据传输率
  • 地址总线的位数决定了可寻址的最大内存空间
  • 控制总线指出总线周期的类型和本次输入/输出操作完成的时间

主存容量的扩展

单个存储芯片的容量肯定是有限的,他在字数或者字长方面与实际存储器的要求都有一定的差距,因此我们需要在字和位两方面进行扩展来满足实际存储器的要求。通常的方法有位扩展法,字扩展法和字位同时扩展法来扩展主存容量。

在学习这些内容前,我们先来了解一下为何要进行字、位扩展以及扩展的特点。我们前面学习了存储器的容量表示是XB×Y位。也就是说寻址范围是0~2^X,每一次输出的数据位数是Y位。但是在实际应用中,可能会出现需要4KB×16位的存储器,然而我们只有1KB×8位的存储器,那么寻址范围太小不够4KB,且一次性输出的数据位数是8位少于16位,那么此时地址线和数据线与存储芯片的型号就有矛盾了,所以我们需要将这有限个存储芯片以一定的方式组合扩展成4KB×16位。其中数据线位数应该总是等于一次输出的数据位数也就是等于扩展后的存储芯片位数。地址线至少能够表示组合扩展后存储芯片的寻址范围,但是可能会大于这个范围,因为部分地址线会成为片选信号线。

位扩展法

那么我们首先来学习以下位扩展,顾名思义,仅仅是需要扩展位数。CPU的数据线数与存储芯片的数据位数不相等,此时必须对存储芯片进行位扩展,方法很简单,就是用多个存储器件组合对数据字长进行扩充,增加存储字长即可,使得一次输出的数据尾位数等于数据线数。比如,现在我们要使用8个8K×1位的存储芯片组合进行位扩展成一个8K×8位的存储器件。如下图组合:

首先我们讲解一下上图,A0~A12表示的是地址线(Address),D0~D7是数据线(Data)。那么很明显一个存储芯片一次性只能输出一位数据,并且寻址范围仅是8K,而现在我们要求寻址范围不变仍是8K,但是一次性输出的数据必须是8位(和数据线数相等)。那么很容易想到,我们只需要每次输出数据的时候,每一个存储芯片都贡献一位,这样组合出来就是一个8位数据了,所以每一个RAM芯片都连接一个不同的数据线,而这8个RAM芯片肯定是同时工作的,即要输出必定同时输出各贡献一位数据。所以8片RAM芯片的地址线A12~A0,非CS,非WE都连在一起,即他们同时控制着这8片芯片的工作方式。

所以我们可以总结出在采用位扩展时,各芯片连接地址线的方式相同(每一个芯片都同时连接着A12~A0来表示4K的寻址范围),但是连接数据线的方式不同(各连接一个不同的数据线,输出数据时各贡献1位数据)。

字扩展法

字扩展是指增加存储器字的数量,而位数不变,即仅增大寻址范围。比如现在我们要用4个16K×8位的存储芯片组成一个64K×8位存储器件。此时已经满足了每一个存储芯片即可输出与数据总线位数相同的数据了。但是要用这4个芯片(寻址范围都是0~2^14-1)组合扩展成一个寻址范围为0~2^16-1的存储器件。组合方式如下:

此时芯片的地址线,控制线,读写控制线相应并联,而不再是串联统一由一个信号管理了。我们可以看出每一个芯片还是都连接着A13~A0地址线来表示自己的16K寻址范围,但是此时A15A14却和译码器相连接用来传送片选信号(顾名思义,就是选择哪一个存储芯片工作的信号)。那么此时我们就可以用一下方式来实现寻址范围(字)扩展:

  • 第一片芯片工作时满足A15A14=00,所以寻址范围是0000000000000000-0011111111111111
  • 第二片芯片工作时满足A15A14=01,所以寻址范围是0100000000000000-0111111111111111
  • 第三片芯片工作时满足A15A14=10,所以寻址范围是1000000000000000-1011111111111111
  • 第四片芯片工作时满足A15A14=11,所以寻址范围是1100000000000000-1111111111111111

所以我们可以看出译码器可以用A1514来控制片选信号从而选择每次工作时由哪一个芯片工作,并且最终的地址拼接着A15A14也就变成了16位即寻址范围扩大了,但是从每一个芯片的视角来看,他们的寻址范围并没有变化只是起始地址不再都从0开始了而已。每一个芯片都同时连接着D7~D08个数据线,所以每一次只有一个芯片工作,他一次性就输出了满足数据线位数的8位数据。

采用字扩展时,各芯片连接地址的方式相同(都是同时连接着A0~15,一次性接受16位地址),连接数据线的方式也是相同的(都连接着D7~D0,一次性输出8位数据)。但在某一个时刻只需选中一个芯片,所以通过片选信号非CS或采用译码器设计连接到相应的芯片)。

字位同时扩展法

既然有字扩展和位扩展,那么就肯定还有更加复杂的组合扩展方法即字位同时扩展。这种方法既增加存储字的数量,又增加存储字长。比如用8片16K×4位的RAM芯片组合扩展成一个64K×8位的存储器。那么组合方式如下:

即8个芯片每两个芯片采用位扩展组合成4个16K×8位的芯片,这4个组合芯片再采用字扩展扩展成64K×8位的芯片。所以A15A14仍然是片选信号,4个16K×8位组合芯片每次只只有一个工作,但是这个组合芯片的两个16K×4位存储芯片总是要同时工作的,一个输出数据的前4位,一个输出数据的后4位从而拼接组合成一个8位的数据。

所以采用字位同时扩展时,各芯片连接地址线的方式相同(都是连接着A15~A0),但是连接数据线的方式不同(每一个存储芯片都只连接4个数据线),而且需要通过片选信好非CS或采用译码器设计连接到相应的芯片。

总结

扩展方式 目的 方法
位扩展 增长存储字长 各芯片串联地址线,并联数据线
字扩展 扩大寻址范围 各芯片并联地址线,串联数据线
字位同时扩展 既增长存储字长,又扩大寻址范围 各芯片并联地址线,并联数据线

存储芯片的地址分配和片选

前面我们学习了片选信号可以控制不同的存储芯片工作,下面我们就来细分以下不同的片选信号产生方式。首先我们要知道CPU要想实现对存储芯片的访问,首先要选择存储芯片,即进行片选,然后为选中的芯片依地址码选择相对应的存储单元,以进行数据的存取,即进行字选。片内的字选通常是由CPU传出的N条地址线完成的,地址线直接接到所有存储芯片的地址输入端(N由片内存储量2^N决定)。所以我们不关注由地址直接决定的片内字选,而是学习一下片选信号的产生方法。

线选法

线选法用除片内寻址的高位地址线(或经反相器)分别接至各个存储芯片的片选端,当某地址线信息为“0”位时,就选中与之对应的存储芯片。这些片选地址每次寻址时只能有一位有效,不允许多位有效,这样就能保证每次只选中一个芯片(或芯片组)。假设4片2K×8位存储芯片用线选法构成8K×8位存储器,各芯片的片选信号如下表

芯片 A14~A11
0# 1110
1# 1101
2# 1011
3# 0111

4个芯片,所以需要额外的四个高位地址线来表示片选信号,一般都是1表示不工作,当第i位为0时就表示选中第i个芯片工作,比如上表中A11这个最低位为0就表示0号芯片工作,1101就是2号芯片。而片内字选的地址码就是A10~A0用于寻址。

很明显这种方法优点是线路简单,不需要地址译码器。但是缺点却也很大,首先地址空间不连续了,1110是1号芯片地址的高位部分,但是3号芯片高位地址部分反而是小的0111,这不好表示地址连续。并且选片的地址线必须分时为低电平(否则不能工作,即每位表示一个芯片的编号,每次只能有一位为0来表示选中一个芯片0)。这种方法不能充分利用系统的存储空间,造成地址资源的浪费。比如现在有4位高位地址,明明可以有2^4=16中组合方案,但是却只能用来控制4个芯片即只能使用其中的4中组合方案来表示片选信号。当芯片很多时,这种方法弊端太大。

译码片选法

译码片选法就是解决上面线选法的局限性的,他可以充分利用剩余的高位地址线。比如8片8K×8位的存储芯片组成64K×8位存储器(地址线16位,数据线8位),需要8个片选信号,若采用线选法,除去用于片内寻址的13位地址线,还额外需要8个地址线来表示8个片选信号。但是现在仅余下3个地址线了即只有3位可以表示片选信号了。此时使用译码片选法,即用一片74LS138作为地址译码器,则A15A14A13=000时选中第一片,A15A14A13=001时选中第二片,以此类推,3位8种组合刚好可以表示8个芯片的片选信好,充分利用了系统的存储空间。

总结

片选信号产生方法 特点 片选信号数量 优缺点
线选法 n个位中只有一个为0 n位n个片选信号 线路简单,但是利用率低,寻址空间不连续
译码片选法 n个位中不同的组合都是一种片选信号 n位2^n个片选信号 虽然复杂,但是存储空间利用率高,寻址空间连续

存储器与CPU的连接

合理选择存储芯片

要组成一个主存系统,选择存储芯片是第一步,主要指存储芯片的类型(RAM或者ROM)和数量的选择。通常选用ROM存放系统程序,标准子程序和各类程序(因为不易修改且断电后不易丢失),RAM则是为用户编程而设置的。此外,在考虑芯片数量时,要尽量是连线简单,方便。

地址线的连接

存储芯片的容量不同,其地址线数也不同,CPU的地址线往往比存储芯片的地址线数要多,因为部分地址线需要和译码器组合来控制片选信号的产生。通常是将CPU的地址线的低位和存储芯片的地址线相连,以选择芯片的某一单元(字选),这部分的译码是由芯片的片内逻辑完成的。而CPU地址线的高位则在扩充存储芯片时使用,用来选择存储芯片(片选),这部分译码由外接译码器逻辑完成。

例如CPU地址线为16位,即A15~A0,1K×4位的存储芯片仅有10根地址线,那么此时CPU的低地址位A9~A0与存储芯片的地址线A9~A0相连。

数据线的连接

CPU的数据线往往与存储芯片的数据线不一定相等,在相等时直接连接即可,如果不相等必须使用存储芯片位扩展,使得其数据位数和CPU的数据线数相等。

读/写命令的连接

CPU读/写命令线一般可直接与存储芯片读/写控制端相连,通常高电平为读,低电平为写。有些CPU读写命令线是分开的(读为非RD,写为非WE,均为低电平有效),此时CPU的读命令线应与存储芯片的允许读控制端相连,而CPU的写命令线则应与存储芯片的允许写控制端相连。

片选线的连接

片选线的连接是CPU与存储芯片连接的关键。存储器由许多存储芯片叠加而成,哪一片被选中完全取决于该存储芯片的片选控制端非CS是否能接收到来自CPU的片选有效信号。

片选有效信号与CPU的访存控制信号非MREQ(低电平有效)有关,因为只有当CPU要求访存时,才要求选中存储芯片。若CPU访问I/O,则非MREQ为高,表示CPU不需要访存,不要求存储器工作。

例题

设CPU有16根地址线,8根数据线,并且用非MREQ作为访存控制信号(低电平有效),用非WR作为读/写控制信号(高电平为读,低电平为写)。现在有下列存储芯片:1K×4位RAM,4K×8位RAM,8K×8位RAM,2K×8位ROM,4K×8位ROM,8K×8位ROM以及74LS138译码器和各种门电路。画出CPU与存储器的连接图。要求主存地址空间分配的6000H~67FFH是系统程序区,6800H~6BFFH为用户程序区。

首先我们需要确定系统程序区使用ROM,用户程序区使用RAM,所以ROM和RAM芯片都要选择。然后我们确定存储器数据线尾数应扩展为8位。然后我们来查看所选芯片的寻址范围。

首先是6000H~67FFH之间的寻址空间范围是800H=2K。所以需要一片1K×8位的ROM。ROM地址线11根。然后是6800H~6BFFH之间的寻址空间范围是400H=1K,所以需要一片1K×8位的RAM。发现没有1K×8位的RAM芯片,所以使用两个1K×4位的RAM芯片进行位扩展。RAM地址线10根。然后我们发现CPU的总地址线是16根,不满足为每一个存储器都分配全部的地址线,所以ROM存储器和由两个RAM组成的存储器要并联组成字扩展,所以他们需要连接一个译码器。并且此时我们观察一下地址范围:

{6000H67FFH:011000000000000001110011111111116800H6BFFH:01101000000000000110101111111111\begin{cases} 6000H\sim67FFH:0110000000000000\sim0111001111111111\\ 6800H\sim6BFFH:0110100000000000\sim0110101111111111 \end{cases}

我们知道ROM存储器的地址码需要用到A0~A10,RAM存储器的地址码需要用到A0~A9。所以A11~A15可以用来当做片选信号线。所以地址的高5位是片选信号位,而对于ROM存储器,剩下的11位刚好全部用来表示字选的片内地址码即可。而对于RAM存储器低10位就已经可以用来表示字选的片内地址码了,第6位不会使用到,所以一直是0,如下:

所以当红框内的是100即十进制为4时就是ROM地址,如果红框内是101即十进制为5且第11位A10不会用到永为0那么就是RAM地址(两个条件需要同时成立,所以需要一个5&!0,所以使用的是与非门)。又因为高两位用不到因为都是01没有区分作用,所以片选信号只需要A13A12A11即可。所以连接图如下:

我们观察上图果然A0~A9作为了RAM的地址线,同时两个RAM芯片是位扩展的方式,同时A0~A10作为了ROM的地址线,又因为地址线有共享部分,所以两个存储器芯片组最终并联字扩展,一次只能有一个工作,A13A12A11连接着译码器的CBA三位片选信号位同时A15A14没用到。非MREQ控制线也连接上了,同时数据线数和存储器的线数也相等了。