当前课程知识点:微机原理与接口技术 > 第11周 输入输出与中断技术 > 第43讲 基本I/O接口 > I/O系统概述_02
每一个接口里边都可能有一个端口
也可能有多个端口
那么在整个输入输出系统中
又有可能有多个接口
比如我们可以有网卡 我们有显卡
我们有各种接口卡
那么 每一个卡它都是一个接口电路
每一个接口电路里都有多个端口
所以 总而言之
端口就是接口中的寄存器
我们可以简单的这么说
那么寄存器的含义就是存储数据
暂存数据的
所以端口就是接口里
用来暂时存放数据的这样一些部件
从刚才那个图里我们也能看出来
所有的端口 不管它有多少个
它的端口的类型只有三种类型
就是数据的端口 状态端口 控制端口
数据端口它是用来传输或者存储数据的
所以它可以有IN 可以有OUT
所以有输入输出
两个是双向的
那么状态端口是用来将外部设备的
状态信息送进CPU的
所以它通常是输入端口
那么控制端口用来
将CPU发出的各种控制信息
传输出去并且负责控制外部设备
所以控制端口通常也是单向的
只是指向外边的
我们用这样的一个图来描述一下
帮助大家理解一下
假设左侧是CPU
右边这边是外部设备
那么中间就是接口
我们把其他的都忽略掉
我们示意出它的三种类型的端口
我们首先要完成这样一个数据的传输
我们通常首先要获得或者说要知道
外部设备目前到底它的状态
是不是能够接收数据
或者能够把数据
允许CPU来读取
所以这个状态信息通过状态端口
进入到系统中
状态信息它既不是地址
也不是控制信号 所以它一定是通过
数据总线 来把这个信息送进CPU的
那么如果这个状态信息允许
CPU会发出相应的控制信号
这些控制信号
在它的控制下
数据通过数据端口
实现数据的输入或者输出
这个就是我们三种类型的端口
那么在整个输入输出系统中
我们说有若干若干的接口电路
那么比如我们有显卡
我们可以有网卡 这每一个卡
等等其他各种卡
每一种卡它都是一组接口电路
每一个接口电路里都可能有一个端口
也可能有多个端口
所以在整个输入输出系统中间
它就可能有多个端口
我们用这样一张图来看一下
比如 这里头
每一个绿颜色的框框比如就是个接口电路
那么在整个I/O系统中
它可能就有多个这样的接口芯片
或者说接口电路
当然它物理形式上是芯片的形式
比如它就有多个芯片 每一个接口芯片上
它可能有一个端口 也可能有多个端口
那么我们CPU要想去读取某个端口的状态
或者是把数据写到某个端口里
由它再传送到外部设备去
我们第一件事就是要找到这个端口
因此把这个图 我们假设把它
每一个绿颜色的框框都想象成一个内存芯片的话
那么这个实际上
大家跟我们内存的这个编址方式就非常像了
一个绿颜色的框框表示一个内存的芯片
上面的每一个黄颜色的
我们假设就是一个内存单元
这不是就一样的了吗
所以在这个I/O端口这样子的一个系统中
接口系统中
它的这个端口的编址
跟内存的编址也是非常类似的
我们每一个端口地址首先也要包括
也要搞清楚这个端口到底在哪个芯片上
是在第一个接口芯片上 第二个接口芯片上
所以每一个端口地址
也是同样由2个部分来组成的
要先找到它在哪个芯片上
也就是它的片地址
或者说片选地址
然后再找到
它在这个芯片上
是第几个端口 因此呢
这里每一个端口地址
也包括片选地址
和片内寻址这样两个部分
如果这个接口芯片上只有一个端口 那好说
就是说找到这个接口也就找到了这个端口
也就是说它这个端口
不再具备片内地址这样一说了
但是如果一个接口上有多个端口
那么我们找到这个接口以后就
并不意味着找到了端口
我们接着还要再去找端口
所以每一个端口地址
它也和内存的单元地址一样
都是由片选地址加片内地址来组成的
无非有一些不同的在哪里呢
就是说我们每一个内存芯片上
肯定有多个单元
就算是我们现在讲的这么初级的芯片
比如我们的6264 它也好歹有8K个单元
像我们今天的存储器芯片
很可能多少G个单元
那么每一个单元
所以找到一个芯片以后
它这个芯片的片内地址是比较多的
比如我们前面讲的那些示例芯片
通常都是8K字节的
那么8K个单元它的片内地址至少要13根
但是对于接口芯片来讲
它的端口数量 一个芯片上的端口数量
相对这个达不到这样的级别 没有那么多的端口
通常都是几个几十个这样子的一个级别
在我们这门课里
我们能够看到的最多的 端口
就是一个芯片上就4个端口
所以这个就是造成
我们未来在译码电路设计的时候
我们会发现
对于在I/O接口的译码电路里头
高位地址信号是非常多的
而片内地址是非常少的
有可能它这个 刚才我们说
这个接口就内部就没有一个独立的端口
就这一个端口 可以这么说
所以它就没有片内地址
找到这个接口就找到了这个端口
那么这种情况下就所有的
地址信号都属于高位地址的范畴了
也就是说都可以作为译码器的输入了
这个是它的一个和存储器
接口电路里头一个不同的地方
形式上的不同也只能说
对于8088 8086CPU来讲
它寻址内存的能力是1M个字节
所以它可以同时产生20位地址码
它必须同时产生20位地址码
这样才能管理1M个单元
那么它寻址端口的能力是64K个
我们前边刚刚说过
为了要找到一个确定的端口
我们必须给每个端口都要编地址
刚才我们已经说了
对于每个端口的地址
都是由片选地址加片内地址合起来构成的
那么在整个和内存合起来
这样一个范畴内
我们看一下端口的编址方式
一共有两种
一种是它和内存的统一编址
还有一种就是和它自己独立编址
和内存统一编址的好处在哪里呢
内存统一编址的意思就是说
我们一共20位地址信号线
那么对内存来讲
这20位地址信号
一共能够产生1M个地址编码
那么我们现在如果又想用这20位地址码来
管理内存 又想用它管理端口
那么如果统一编的话
那么就 不可能了 对吧
一共它只有1M个地址码
如果统一编的话
我们必须有64K个地址码拿来管理端口
剩余的才是管理内存
这种统一编址的好处呢
就是简单
另外呢 理论上来讲
能够访问内存的所有的指令
都可以访问端口
这样的话接口它的控制能力就相当的强
但是这种方式有一个巨大的不好处
就是我们刚才说 一共是20位地址码
一共有1M个地址资源
我们好不容易通过分段管理的模式
我们用16位的体积结构
能够达到了管理1M个单元这样的目的
但是因为你64K个端口地址
必须要用到 要占用
所以 一下就给cut掉了那么多个64K个
内存一下就少了
这样而且我们也说过 内存资源是
我们系统中非常宝贵的资源
所以这种方式
我们从第三代CPU开始就不再使用了
所以在8088 8086这个时代
我们的端口的编址和内存之间
都是采用独立编址
也就是说端口是端口 内存是内存
这就是我们现在右侧这个图上
我们可以看出
虽然我们还是20位地址信号
但是我们20位地址信号
能够产生的1M个地址编码
全部用来管理内存
那你说这个端口的64K个地址从哪来呢?
还是那20位地址信号
因为它没有再有另外16位地址信号
还是这20位地址信号
这20位地址信号
但是我们现在想怎么样让它能够区分出来
这20位地址是访问内存的地址
还是访问端口的地址
这就是我们前面讲的IO/#M这个引脚了
这个引脚的状态为高电平的时候
就表示它访问的是端口
这个时候因为访问端口只需要16位地址
因为我们的能力只有64K个端口地址
只需要16位地址编码就可以了
所以IO/#M为高电平的时候
这个20位地址总线上
A16到A19就默认全部是0了
就是它是无效状态了
A0到A15这个时候
才是用来真正的指向一个具体的端口
这一点请大家务必要注意
所以在未来的IO接口系统中间
译码器的输入不可能出现
A16到A19这样的高4位地址
因为这个时候IO/#M为高电平
那四位已经变成无效地址状态了
所以当你寻址端口的时候
我们端口因为只需要16位地址
管理64K个端口
所以端口地址的范围就是0到FFFF
这样子的一个范围内
但是在用8088CPU作为
微处理器的这样一个时代
也就是它的计算机的型号叫IBMPC
这个机器中间
它管理的端口它只用了1K个端口
因为它实际上用不到那么多
所以端口地址资源
相对来讲就非常非常的丰富了
因为我们有64K个端口的寻址能力
但是你实际上只用了1K个端口
就像你能提100斤的东西
现在让你只提了一斤重的东西
你会感到非常的轻松
所以这个时候
它的端口地址就实际上
我们真正使用的端口地址是0到03FFH
那么也就是说这个时候所有的其他的地址
我们都是空闲的都是不需要用到的
我们下边来说一下I/O地址译码
我们刚才说了我们在上一章内容里头
我们讲存储器接口设计的时候
我们已经非常详细的讲了译码的概念
我们有全地址译码部分地址译码两大种方式
我们也用各种示例来介绍了帮助大家练习了
它的这种译码电路的设计
总而言之译码的目的就是为了在
当你地址总线上的地址
出现某一种状态的时候
正好选中一个你希望的芯片
那么在I/O地址译码里就是当你的
总线上出现某一种地址编码的时候
正好选中一个具体的端口
在I/O端口地址里头参加译码的信号
我们刚才说了
肯定是全部的A0到A15的这个地址
当然要看你接口里边有几个端口 对吧
如果是接口里只有一个端口
A0到A15就全部作为译码器的输入
如果你的接口芯片上有多个端口
那么它的低多少位就作为片内寻址
高多少位就作为片选译码
所以除了地址信号以外
还有就是有关对针对
接口的读和写控制信号
我们来看一下这个信号是叫#IOR和#IOW
它们前面有#也就意味着它们有上横杠
等于是低电平有效的
那么这两个信号跟我们的
Read和Write信号的关系是什么呢
这两个信号实际上
和我们存储器的读写是一样的
它也是在IO/#M跟Read和Write组合在一起的
我们在前边讲的MEMW MEMR
那两个有关存储器的读写信号
当IO/#M为低电平的时候
Read和Write组合产生了那个存储器的读写
那么现在IO/#M等于高电平
表示现在要访问的是端口
那么这个时候如果CPU的#vvRead信号为0
也就是它是低电平的话
那么就会产生#IOR信号有效
如果这个是Write信号为低电平
那么这个时候就会产生#IOW信号有效
所以这个是两组信号组合出来的
这个信号是埃萨总线控制器
它的输出端的一个信号
那么我们今天在讲16位体系
所以我们依然用这样一个信号
这种信号的产生实际上在
刚才这里说是由IO/#M
和Read或Write组合出来的
这是在物理层面上
但是实际上它的产生真正是由什么驱动的呢
实际上就是由IN指令跟OUT指令来产生的
IN指令我们知道在逻辑上
它实现了将端口里的数据
读进ACC这个累加器
这是在逻辑上它实现了这个功能
那么在电信号这个级别上
就是说物理层面上
它产生了一个#IOR信号
在这个#IOR信号有效期间
数据才真正的读进了累加器
相应地OUT指令它实现了
将累加器的值输出到端口里
它同时在物理层面上
也产生了个#IOW信号
在#IOW有效期间
那么数据信号能够输出出去
#IOW也好#IOR信号也好
跟Read和Write信号一样
都是一个负脉冲
而且是一个比较窄的负脉冲
这个和CPU具体的钟频是有关系的
那么在这个很窄窄的负脉冲里头
也就是实际上
对我们人来讲是一瞬间的里头
这个数据就输入或者输出了
那么我们现在提个问题
对于存储器的读或者写允许信号
它是由什么指令来产生的呢
这个问题留给大家
所以总的来讲
当接口只有一个端口的时候
也就是说没有片内地址
那么所有的地址信号都是译码器的输入
也都是可以作为高位地址
当I/O接口里有多个端口的时候
那么它就高位作为译码地址
低位作为片内地址
这一点跟内存没有任何的区别
主要的一个除了刚才我们的读写控制信号
这样一个区别之外
I/O接口里边它的译码电路的设计
还有一个和内存接口的这个
译码电路设计的不同在
在于因为I/O端口它的地址资源非常丰富
刚才我们说了它本来可以寻址64K个端口
也就是说它有能力产生64K个地址编码
用16位的地址信号来产生
但是它实际上在这个真正计算机里头
它只管理了1K个端口
所以 它有那么那么多的
63K个端口地址编码
都可以被浪费掉
所以它的资源相当丰富
因此在这种情况下
我们以线路简单变成了最主要的矛盾
所以我们在接口地址译码中
通常会采用部分地址译码
下面我们通过一个练习来跟大家
把这个问题来加深一下印象
这个题目是这样
某一个外部设备的接口里边有4个端口
告诉了你这个地址范围是2F0到2F3H
然后由A15到A2译码得到
片内地址为A1和A0
因为我们这个芯片上有4个端口
所以它需要2位片内地址来寻址这4个端口
现在要你来设计一下这个系统的译码电路
这个设计的方法是一样的
因为这个题目里头
也没有告诉你这个芯片的型号
我们所以用一个示意的形式来练习了
我们跟前边设计译码电路的方式相同
我们首先来看一下
把这个整个的给定的地址范围
用2进制数来描述出来
刚才我们说2F0到2F3
所以首地址和尾地址
在这里没有给出高四位一定是0
也就是说这个题目并没有告诉你是02F0到02F3
所以高四位是0000到1111都是可以的
那么这就意味着高四位任意状态都行
任意状态都行那就是说你可以有可以没有
所以在系统中
是不能够连接在译码电路的输入端的
当然你在做程序设计的时候
你的端口地址用代码去写
比如用IN指令
我们要从某个端口里读数据
那个端口地址你肯定要写一个具体的地址
你不能写××2F0 对吧
所以这个时候你可以写成02F0
或者你不写0
系统会默认它前面是0
但是你在线路设计的时候
高四位是不能够直接接到系统中的
一旦接上了
那么这高4位就等于我们整个译码电路
就变成全地址译码了
那高4位就必须要有确定的状态
这就意味着如果确定都是0的话
那么意味着其他15种状态
你这个都选不中这个端口
这一点是不行的
这就是把部分地址译码变成了全地址译码
也就是说固定成了一个地址编码
好 那么高4位任意状态我们不管它了
现在低2位是作为片内寻址
所以它肯定不能作为译码器的输入
那么剩余的从A2到A11
这就是译码器的输入信号了
好 下边我们来设计一下
我们把这个A11到A2全部写在这里
写在这里呢 我们把读写信号
读写控制信号跟前面讲
存储器接口的那个译码电路设计一样
读写控制信号也要作为译码器的输入信号
好 下面我们就来填这个空
这个空应该填哪一些呢
我们其实大家现在已经知道
它译码电路的设计方法不是唯一的
比如我们在这里如果选与非门的话
与非门的输出要求是低电平的话
这里顺便说一下
译码电路的输出通常的都是要低电平有效
因为它对应的控制的芯片
片选信号都是低电平有效的
那么如果这个与非门要输出是低电平
我们知道与非门的输入必须同时为1
所以现在A4到A9这些为1的信号
我们就写在这里了
中间那个点点点表示A4到A7之间是连续的
就是A4 A5 A6都是在这里头
那么我们剩下A2 A3还有A8 A10 A11
这些是为低电平的
我们通过一个或非门让它输出高电平
然后这个高电平又接到与非门的输入端
在这种情况下 与非门就会输出0了
我们刚才讲过
我们读写信号还必须作为译码器的输入
所以IOR IOW他们都是低电平有效的
所以通过与非门连接到这里
如果对前面存储器接口
还没有太熟悉的同学
这个地方我再解释一下
我们说读写控制信号是由CPU来控制产生的
CPU可以对外边不读不写
那么这个时候
它的读写控制信号
就是在这里的话就是IOR IOW
那么它们就会同时为高电平
这个时候就表示
CPU在自己肚子里做加减乘除
它既不输出也不输入 既不读也不写
那么这个时候译码电路一定不能工作
大家看我们现在设计的这个
当IOR IOW同时为1的时候
与非门会输出0
正好把后面的这个与非门给封死了
所以它的输出端是不可能为低电平
另外呢 如果要对外边进行读操作或者写操作
那么IOR和IOW就会有1位是0
另一位是1
所以这两位读写信号
只要有任意一位为0的时候
这个与非门会输出1
那么这个高电平就会作为
后边这个大与非门的这个输入端之一
大与非门的输入有一个是1
它的输出由其他的状态来决定
所以这个时候其他的高位地址
按我们现在这样连接
那么 这种情况下的话与非门会输出低电平
就是产生一个有效的片选信号
但是读和写信号刚才我们说
它可以不读不写 可以读或者写
它绝对不能同时又读又写
这个是CPU本身的工作时序保证了这一点
这就像你一个人不能自己打自己 对吧
所以这种时候
IOR和IOW不可能同时为0
所以虽然这个读写信号是2位信号
但是它只有3种组合
它不可能出现第四种
这个再给大家强调一下
好 这个就是I/O端口地址译码
它的一个简单用示意的形式
我们来帮助大家建立了概念
学到这里大家会发现
实际上和我们之前学的
存储器接口的设计方法
是完全类似的
唯一的就是要注意
在I/O系统中间
译码电路的输入信号
不可能包括A16到A19
因为它能够寻址的端口最多就是16位地址
再一个就是再次强调
读写控制信号一定要做为译码器的输入信号
这个后边我们在讲锁存器接口的时候
我们用锁存器来做例
我们再会给大家解释
如果这两个信号不作为译码器的输入
有可能它后边的这样的一个接口芯片
永远都不可能被选中 或者说被触发
当然它有可能触发
触发就是它整个
因为地址信号跳变的时候它才会触发
这样会造成时序上的混乱
好 这一讲我们就讲到这里
-第1讲 关于本课程
--关于本课程
-第2讲 微型计算机系统
--微机系统_01
--微机系统_02
-第3讲 微型计算机一般工作过程
-第4讲 数制与编码
--计算机中的编码
-第5讲 计算机中数的表示与运算
--数的表示
--符号数的表示
--数的表示与运算
-第6讲 基本逻辑运算与逻辑电路
-第7讲 本周小结
--本周小结
-第1周 微型计算机基础概论--第一周单元测验
-第8讲 8088微处理器
-第9讲 8088 CPU主要引线及机构
-第2周 8088微处理器--第二周单元测验
-第10讲 实模式存储器寻址
-第11讲 8088系统总线
--8088系统总线
-第12讲 微处理器小结
--微处理器小结
-单元测验--作业
-第13讲 指令概述
--指令概述
-第14讲 寻址方式
--寻址方式
-第15讲 通用数据传送指令
-第16讲 地址传送指令
--地址传送指令
-第17讲 输入输出指令
--输入输出指令
-第4周 数据传送指令--第四周单元测验
-第18讲 算术运算指令
--加法运算指令
--减法指令
--乘除运算指令
-第19讲 逻辑运算指令
-第20讲 移位操作指令
--移位操作指令
-第5周 算术运算、逻辑运算与移位操作指令--第五周单元测验
-第21讲 关于串操作指令的说明
--串操作指令说明
-第22讲 串传送与串比较
--串传送与串比较
-第23讲 串扫描指令
--串扫描指令
-第24讲 串装入与串存储指令
-第六周单元测验--作业
-第25讲 程序控制指令说明
-第26讲 转移类指令
--无条件转移指令
--条件转移指令
-第27讲 循环控制指令
--循环控制指令
-第28讲 过程调用指令
--过程调用指令
-第29讲 中断指令
--中断指令
-第30讲 处理器控制指令
--处理器控制指令
-第31讲 指令系统小结
--指令系统小结
-第7周 程序与处理器控制--第七周单元测验
-第7周 程序与处理器控制--第七周作业
-第32讲 汇编语言源程序
-- 汇编语言源程序_01
-- 汇编语言源程序_02
-第33讲 伪指令
--数据定义伪指令
--其它伪指令
-第34讲 系统功能调用
-第35讲 汇编语言程序设计示例详解
--程序设计示例1
-第36讲 汇编语言程序设计小结
-第8周 汇编语言程序设计--第八周单元测验
-第8周 汇编语言程序设计--第八周作业
-第37讲 半导体存储器概述
--半导体存储器概述
-第38讲 内存单元编址
--存储单元编址
-第39讲 随机存取存储器RAM
-- RAM_01
--RAM_02
-第40讲 只读存储器ROM
--ROM_01
--ROM_02
-第九周单元测验--作业
-第41讲 半导体存储器扩展
--存储器扩展_2
-第42讲 半导体存储器小结
--半导体存储器小结
-第十周单元测验--作业
-第十周作业--作业
-第43讲 基本I/O接口
-第44讲 简单接口芯片
--简单接口芯片
-第45讲 基本输入输出方法
--基本I/O方法
-第46讲 简单I/O控制系统设计
-第47讲 中断技术
--中断技术1
--中断技术2
-第48讲 输入输出与中断技术小结
--本周小结
-第十一周单元测验--作业
-第49讲 可编程定时计数器
-第50讲 可编程并行接口
-第51讲 可编程接口小结
--本周小结_01
--本周小结_02
-第十二周单元测验
-第52讲 模拟量的输入输出
--模拟量的输入输出
-第53讲 D/A转换器
-第54讲 A/D转换器
-- A/D转换器_01
-第十三周单元测验--作业
-第55讲 I/O接口系统综合设计示例详解I
-第56讲 综合设计示例详解II
-第57讲 结束语
--结束语