基于AT89S51的存储器地址空间分配
扫描二维码
随时随地手机看文章
在实际的单片机应用系统设计中,往往既需要扩展程序存储器,又需要扩展数据存储器(I/O接口芯片中的寄存器也作为数据存储器的一部分),如何把片外的两个64KB地址空间分配给各个程序存储器、数据存储器芯片,并且使程序存储器和数据存储器的各芯片之间,一个存储器单元只对应一个地址,避免单片机发出一个地址时同时访问两个单元,而发生数据冲突。这就是存储器的地址空间的分配问题。
AT89S51单片机发出的地址码用于选择某个存储器单元,在外扩的多片存储器芯片中,AT89S51单片机要完成这种功能,必须进行两种选择:一是必须选中该存储器芯片,称为片选。只有被选中的存储器芯片才能被AT89S51单片机访问,未被选中的芯片不能被访问。二是在片选的基础上再根据单片机发出的地址码来对选中的芯片的某一单元进行访问,称为单元选择。为了实现片选,每个存储器芯片都有片选信号引脚。同时每个存储器芯片也都有多个地址线引脚,以便对其进行单元的选择。需要注意的是,片选和单元选择都是单片机通过地址线一次发出的地址信号来完成选择的。
通常把单片机系统的地址线笼统地分为低位地址线和高位地址线,片选都是使用高位地址线。实际上,在16条地址线中,高、低位地址线的数目并不是固定的,我们只是习惯上把用于存储器单元选择的地址线称为低位地址线,其余的称为高位地址线。
常用的存储器地址空间分配方法有两种:线性选择法(简称线选法)和地址译码法(简称译码法),下面分别介绍。
1.线选法
线选法是直接利用系统的某一高位地址线作为存储器芯片(或I/O接口芯片)的片选控制信号。为此,只需要把用到的高位地址线与存储器芯片的片选端直接连接即可。
线选法的优点是电路简单,不需要另外增加地址译码器硬件电路,体积小,成本低。缺点是可寻址的芯片数目受到限制。另外,地址空间不连续,每个存储单元的地址不唯一,这会给程序设计带来一些不便,只适用于外扩芯片数目不多的单片机系统的存储器扩展。
2.译码法
译码法就是使用译码器对AT89S51单片机的高位地址进行译码,将译码器的译码输出作为存储器芯片的片选信号。这种方法能够有效地利用存储器空间,适用于多芯片的存储器扩展。
常用的译码器芯片有74LS138(3线-8线译码器)、74LS139(双2线-4线译码器)和74LS154(4线-16线译码器)。若全部高位地址线都参加译码,称为全译码;若仅部分高位地址线参加译码,称为部分译码。部分译码存在着部分存储器地址空间相重叠的情况。
下面介绍两种常用的译码器芯片。
(1) 74LS138 是一种3线-8线译码器,有3个数据输入端,经译码产生8种状态。其引脚如右图所示,真值表见下表。由下表可见,当译码器的输入为某一固定编码时,其输出仅有一个固定的引脚输出为低电平,其余的引脚输出为高电平。而输出为低电平的引脚就作为某一存储器芯片的片选端的控制信号。
表 74LS138真值表
(2) 74LS139 是一种双2线-4线译码器。这两个译码器完全独立,分别有各自的数据输入端、译码状态输出端以及数据输入允许端,其引脚如左图所示,真值表见下表(只给出其中的一组)。
表 74LS139真值表
下面以74LS138为例介绍如何进行地址分配。例如,要扩展8片8KB的RAM 6264,如何通过74LS138把64KB空间分配给各个芯片?由上表可知,把Gl接+5V,G2A、G2B(的反)接地,P2.7、P2.6、P2.5(高3位地址线)分别接到74LS138的C、B、A端,由于对高3位地址译码,这样译码器有8个输出YO~Y7,分别接到8片6264的各个片选端,实现8选1的片选。而低1 3位地址( P2.4~P2.0,PO.7~PO.0)完成对选中的6264芯片中的各个存储单元的单元选择。这样就把64KB存储器空间分成8个8KB空间了。64KB地址空间的分配如下图所示。
这里采用的是全地址译码方式。因此,AT89S51单片机发出16位地址码时,每次只能选中某一芯片以及该芯片的一个存储单元。
如何用74LS138把64KB空间全部划分为4KB的块呢?由于4KB空间需要12条地址线进行单元选择,而译码器的输入只有3条地址线(P2.6~P2.4),P2.7没有参加译码,P2.7发出的O或1决定了选择64KB存储器空间的前32KB还是后32KB,由于P2.7没有参加译码,就不是全译码方式,这样前后两个32KB空间就重叠了。那么,这32KB空间利用74LS138译码器可划分为8个4KB空间。如果把P2.7通过一个非门与74LS138译码器的Gl端连接起来,如下图所示,就不会发生两个32KB空间重叠的问题了。这时,选中的是64KB空间的前32KB空间,地址范围为OOOOH~7FFFH。如果去掉上图中的非门,地址范围为8000H~FFFFH。把译码器的输出连到各个4KB存储器的片选端,这样就把32KB的空间划分为8个4KB空间。P2.3~P2.0,P0.7~PO.O实现对单元的选择,P2.6~P2.4通过74LS138译码器的译码实现对各存储器芯片的片选。
采用译码器划分的地址空间块都是相等的,如果将地址空间块划分为不等的块,可采用可编程逻辑器件FPGA对其编程来代替译码器进行非线性译码。