使用373、138拓展单片机存储空间

githubpage:blog.alshub.xyz

在学习使用单片机的过程中了解到单片机受到其地址总线数量的限制会使得其能够外扩的存储空间有限,后来在学习过程中了解到使用373芯片可以暂时锁存数据,那么应该可以使用373来做到拓展地址总线的作用。

需要了解的几个知识点

地址和数据

地址:在单片机的数据是一个个的存储单元,这些单元都有自己的名字,这个名字就是地址,这个地址是用一连串的二进制码表示的。也就是说知道了这一串地址就能够找到存储在这个地址单元所对应的存储空间中的数据。
数据就是指的一个个存储单元中所储存的二进制数值。

什么是总线

总线简单来说就是一根或一组线,这些线在不同的时刻会出现不同的状态以此来传递信息,需要注意有的时候会有不同的器件挂载到同一组总线上,如果不是同时接受信息的话,就要对其中的一个器件进行使能、其余的不使能。就像是在楼下大喊一声所有的人都能听见,但是如果只想让某一个人听见就把其他人的窗户都关上,而把那个人的窗户打开。

知道了数据、地址和总线紧接着就是地址总线和数据总线:如果单片机想要读取外部的某个数据就需要输出地址读回数据。这就需要地址总线输出地址,数据总线读回数据。而总线上往往挂载了不只一个外设则需要对想要操作的外设进行片选,这样提供片选信号的总线有的地方称之为控制总线。

时序

单片机何时提供地址,何时读回数据都需要和存储芯片配合好,否则会出现地址还没建立好就芯片就开始取数和数据还没建立好单片机就开始读数的情况。为此给出了一个标准就是单片机的时序,而且根据这个时序可以设计外设和单片机的接口。
想要学习看单片机的时序可以去****上搜索相关的博客。

373芯片

373可以认为是一组D触发器组成的器件,它输入除了使能端之外还有一组(8个)数据输入和一个锁存信号输入。输出端为一组(8个输出)。它实现的功能也非常的简单。在锁存信号为高电平时其输出随着输入变化而变化,而在锁存信号为低电平时其输出不在变化保持原态。
换句话说在锁存信号变为低电平的一瞬间的输出就不再变化直到下一个高电平锁存信号的到来。

138译码器

这个网上的资料非常多,基本上每一个数电课本上都有介绍

思想简介

在知道了数据需要地址才能读取,而地址是以地址总线为载体进行输出的,那么对于地址总线的位数有限(n位)的单片机他也就只能访问2n2^n个数据单元。如果想访问更多就只有想尽办法去拓展这些数据总线,在讲这一部分时我们没有考虑单片机与外部存储器件的控制总线连接,也没有考虑外部存储器件与373共用总线的
使用373、138拓展单片机存储空间
方法:

1.引入新的地址位即将其他资源用于寻址

2.利用像373这样的时序电路来拓展地址总线

第一种方法

通过引入新的地址位来拓展这种方法非常的常见,只需要在单片机的IO资源中引出一根线接在外设的地址线上。这样原本的地址总线(n位)加上后来引入的(k位),地址空间则一共有2k+n2^{k+n},由此就实现了数据的拓展。这种方法受到单片机IO资源多少的控制,即K有上限,其拓展的数据位数也是有限的。
使用373、138拓展单片机存储空间

第二种方法

前面讲过对于单片机写数据操作来说,可以分为以下两个过程
1.通过地址总线送出地址(n位)
2.通过数据总线送出数据(d位)

那么我们把这个这个过程复杂化以实现拓展(实际上是将两个周期合并成了一个周期)

1’.通过地址总线送出一个片选信号选中373(即使373芯片使能)

2’.通过数据总线上的数据锁存在373的输出端,需要注意这里的输出的数据是实际上我们要的实际地址的高几位

3’.通过地址总线送出实际地址的低n-1位,这样我们就可以将地址空间拓展到了n+7位

4’.此时将真正的数据从地址总线上读回来。

如此一来按照上面的思想,单片机的接线也需要专门的去配置。结合图像就可以更好地理解我们复杂化的流程图。
使用373、138拓展单片机存储空间

进一步的理解(思想二)

使用138译码器而进一步拓展

刚才我们直接使用了地址总线中的一位来作为373的片选信号,现在我们在地址总线与373的片选端增加一个组合逻辑电路来使得可以片选多个373进一步拓展外部空间。

我们来看一下,地址总线中的一位来做拓展的话,我们还剩(n-1)条地址总线与新拓展的8条(373有8位)如此一来我们拥有了2n+72^{n+7}个地址空间。比起最开始的2n2^n扩展了足足 272^7 倍。

而如果我们再采用138译码器来进行译码的话,事情又会变成什么样子呢?
首先我们需要一位地址来片选138,之后我们需要3条地址线来作为138的输入,这样我们就可以用138的8条输出作为8片373芯片的片选信号。由此我们的地址总线变成了813+888-1-3+8*8一共68根,其对应的地址空间为2682^{68}个。

付出的代价

上面描述的地址空间的拓展非常的诱人,但是也付出了十分巨大的代价,抛开芯片成本,系统稳定性不谈。单片机读一次数据所需要的时间也是成倍的增加了。

假如我们本来读一次数据需要一秒钟(实际上远没有这么长),这个过程包括了送出地址,等待存储芯片响应,读回数据。

现在我们读回一个数据呢?我们从流程来看。需要给这68跟地址线都赋值。即需要对8个373都赋值。这本身就需要8个周期,再加上最后真正的一次读操作,这样的拓展将一次读操作的的时间延长了9倍。所以这本质上是在牺牲时间成本而拓展了存储空间。因此这种方法可能更适用于需要大的数据量而不经常读写的情况,更或者这种方法根本就没有人在用 /滑稽。

关于控制总线

在讲基本思想的时候我们提到了没有涉及控制总线和373、外部存储芯片共用数据总线的问题。这是因为控制总线对于不同的单片机而言有不一样的接线方法,需要自己去研究单片机读写外部数据的时序图来设计接线方式,网上教程很多可以去搜一搜看一看,推荐不要使用51单片机来入门这一部分,因为51单片机使用了地址和数据的复用相对较复杂。

而外部存储芯片共用数据总线的问题更是简单,只要在选中373(138)的时候不选中存储芯片。选中存储芯片的同时不要选中373(138)就可以了。回忆之前讲过用地址总线来作为373(138)的片选信号,则只要将这个片选信号取反之后接到存储芯片的使能端就能解决这个问题

一些细节

在这些介绍中我默认了数据的输出为8位与373的位数正好相同,但实际上可能有16位、32位这种时候就可以用两个、四个373接到数据口上,这两个、四个373只要使用同一个片选信号就ok了。

总结

实际意义

单纯的拓展存储空间意义不大,但是实际上在使用单片机控制外设的时候是可以把外设当作存储芯片来用的,对于单片机来讲,它并不知道外面接的是什么,它只是在按照程序、事先规定好的时序来在不同的线上输出高、低电平,由此我们可以按照自己的意愿来接线,把原本针对读写外部数据的时序用来控制外设。那么在有限的IO端口的情况下来实现控制更多的外设时,上面所讲的方法就有意义了。

总线结构,这种不同的外设挂载在同一组总线上的情况非常的常见,相当于在许多人共用一个自习室。一组数据用广播的方式在总线上面传播,所有人都能听到,如果不行影响其他人而只对一个人说话。那么就要其他人捂上耳朵只有被明确点到人才能听到,而因为它捂上了耳朵就不能通过广播来获得这种片选信号,只有通过另外的方式来让它打开耳朵,就是我们所说的专门的片选信号。需要特别注意如果两个芯片的输出对接非常容易烧毁芯片。

在通信系统里有很多共用信道的例子有利于理解,可以去了解一下,非常有意思。