0. 前言
译码方式:
- 线译码方式:仅用一个高位地址线作为片选信号。
- 部分译码方式:只用一部分高位地址线参与译码工作,因此未参与译码的地址线对译码结果没有任何影响,该方式应用较为广泛。
- 全译码方式:系统所有地址线全部参与译码工作,因此任何地址线的变化都会影响译码结果,由全译码得到的地址空间是唯一的。
地址译码的实现方法:
- 采用门电路
- 采用译码器
- 采用PLD(Programmable Array Logic 可编程逻辑阵列)
各种存储器芯片容量都是有限的,当实际操作系统需要更大存储容量时,就必须采用多片构成更大容量的存储器模块,这就是所谓的存储器扩展。主要有位扩展(字长的扩展)、字扩展(存储单元数的扩展)和字位全扩展三种方法,下面举例说明。
1. 位扩展
位扩展是让数据位数增加,但是存储单元的个数不变(地址线的条数不增加),如下图所示。
- 芯片的地址线全部并联且与地址总线相应的地址线相连接;
- 片选信号并联,接地址译码器的输出端(这里直接用了CPU的M/IO管脚);
- 芯片的数据线分高低部分,分别与数据总线相应位连接(这里由于是1位扩展到8位所以不用分高低位)。
2. 字扩展
字扩展是存储单元数的扩展,要增加地址线的条数,而与数据线无关,如下图所示。
- 由2K的芯片构成8K的模块,需要四块;相应的,需要多出两根地址线来选择这四块芯片。所以芯片固有地址线并联到地址总线的相应地址线上(A10-A0),扩展地址线(A11-A12)接译码器的输入端产生译码器的输出,用来作为四个芯片的片选信号。
- 芯片的读写控制信号连接总线上的存储器控制信号。
3. 字位全扩展
实际上就是前面两种扩展的组合,在确定所需要的芯片数后,先进行位扩展,然后将位扩展后的模块作为整体进行字扩展。举个例子:
例1:用1K×4位SRAM构成4K×8位的SRAM存储器模块,存储器空间为从08000H开始。
- 首先确定可寻址空间的范围。 内存空间大小为扩展后的模块大小:4K×8位=4KB;由于首地址是08000H,所以末地址是08000H + 4K - 1 = 08FFFH(默认按字节寻址)。这样我们就可以写出首地址和末地址了,如下图:
- 其次确定所需要的芯片数量。 位扩展要2块,字扩展需要4块,所以需要8块(应该不用解释为啥不是6块了吧QAQ)。原来1K的芯片固有10根地址线用来寻址,字扩展后存储单元增加,所以需要增加2根地址线;所以把地址分为三部分,第一部分是芯片本身的地址线,第二部分是扩展地址线,第三部分是由地址范围决定的固定不变的地址,一般用来做译码器的使能信号。
- 画出图来就是下面这样。 解释一下:左边的A9-A0就是上述的芯片本身的10根地址线;A11-A10是扩展地址线接译码器,译码结果作为片选信号;上图中第一部分的固定地址线作为译码器的使能信号;D7-D0八根线分别接一组位扩展芯片的高低位;WR就是平平无奇的写控制信号。
例2 用4K×8位SRAM构成16K×16位的SRAM存储器模块,存储器空间为从08000H开始。
这个题和例1本质区别在于位扩展由8位扩到了16位,在8086的场景下需要BHE(Byte High Enable)和A0配合控制信号进行高低字节的选中。
- 算地址空间。 08000H~0FFFFH。
- 算需要几个芯片。 需要8块芯片,进行字位全扩展。总共需要14根地址线(16K),固有地址线12根,所以扩展地址线2根,留下来A0做低位选通,所以剩余的A19-A15做译码器使能信号。
- 画个图。先借用一下百度文库。
例3 设计一个16位存储器模块,使用SRAM芯片,地址范围为200000H~21FFFFH
- 算需要多少芯片。 由地址范围得出存储空间大小为:21FFFFH - 200000H + 1 = 2 17 2^{17} 217B (一定搞清楚这里是字节数,而接下来算规格需要用位做单位);然后得出存储模块规格为:64K × \times × 16位,所以用两片62512(64K × \times × 8位)进行位扩展。
- 再研究一下怎么接线。 62512固有地址线有16根,不需要进行字扩展所以不用扩展地址线;拿出一位A0用来选中低八位;高位全拿来选通。具体连线如下图,很像8086/80286的16位存储器组织,特点是如果要一次读取一个字的信息,数据必须存于偶地址开始的两个单元,否则将增加一次总线操作(此时BHE为低电平有效,A0为0即偶地址)。
写完了哈哈哈哈哈哈哈哈哈哈哈快乐。