901-输入输出接口的基本功能
# 901-输入输出接口的基本功能
计算机的核心能力就是运算, 而快速的数学运算,甚至是早期设计计算机时的唯一目标。
但是今天,计算机已经成为了我们日常生活中,密不可分的一部分。 我们平时感受更多的,可能是计算机与外界交互的能力, 因此,想要了解计算机的组成,我们就必须要知道现代计算机当中,输入输出设备到底是怎么工作的。
我们先来一起回顾模型机的结构, 这个模型机由一个 CPU,一个存储器,和一个输入输出设备组成。 在系统启动后,CPU 就会从地址总线发出地址给存储器,然后从数据总线读回对应的指令编码, 并通过指令译码部件,产生相应的控制信号,完成对应的操作, 那这些操作有可能是进行运算, 也可能是读写存储器当中的某个单元,那也有可能是要进行输入输出的动作
那我们来看一看,CPU 如果要完成一个简单的输入动作,会是怎么样的。 我们这里的输入设备是八个手动的开关, 我们假设前三个开关都拨到高电平,后五个开关拨到低电平,那这八个开关可能连接到了一个寄存器, 那这个单元当中,就保存了 1110 0000 这个数, 而且事先在系统当中,也为这个单元分配了一个地址, 那么事先就编写了一个用于输入的程序,在这个程序当中,有一条指令就是读取 1111 这个地址单元。 那么当 CPU 执行了这条指令的时候,就会在地址总线上发出这个地址,与此同时,在控制总线上发出表示当前是读操作的信号,那这个输入输出设备收到这样地址和控制信号之后,就会 从 1111 这个单元,取出对应的内容,然后把它送到数据总线上去, 而 CPU 这时会采样数据总线上的信号,得到这个数值, 然后这条指令应该是把这个数,保存到某个通用寄存器当中去, 这样后续的程序也就可以对这个数进行操作了,这就完成了一个输入的动作。
那我们再来看一个输出的简单场景,我们现在的输出设备是 8 个小灯泡, 它也和一个 8 位的寄存器相连,并有对应的地址, 那现在 CPU 执行到某一条指令,是想点亮这 8 个灯泡当中的某几个, 那这条指令就会在地址总线上送出 1110,然后在控制总线上送出写的控制信号,与此同时,还需要在数据总线上,送出要写的数据, 这个输入输出设备,就会根据控制总线发现是一次写操作,就找到地址总线上的信号对应的单元,并将数据总线上对应的信号写进去, 于是 1110 这个单元,就被写入了 11001100 这个数, 然后这个单元的输出,就直接通过物理的连线,连接到 8 个小灯泡上,数值为 1 代表高电平,就会点亮某个灯泡,数值为 0,代表低电平,那对应的灯泡就是熄灭的状态。 这样我们就通过一条指令,完成了这几个小灯泡亮灭的控制, 从而让计算机外部的人,可以观察到输出的信息。
因此,由 CPU、存储器和输入输出设备,就构成了一个简单的计算机系统。 用于输入输出的,可以是拨码开关、LED 管,这样的的简单的设备, 也可能是比较复杂的设备,像打印机、硬盘, 那现在的计算机系统当中,输入输出设备变得越来越多,功能也非常的丰富。 这些设备的差异非常大,有些设备要求很高的数据传输率,比如说显示器, 有些设备的速度却很慢,比如键盘和鼠标, 而且有一些接口是串行的,有一些是并行的,有数字电路的接口,也有模拟电路的接口
如此千差万别的设备,就没有办法直接和 CPU 这一个芯片进行连接, 因此我们就需要在 CPU 和这些设备之间,设置一个中转站, 这就是输入输出接口,也被称为 I/O 接口。
I/O 接口主要提供了这些功能,1 是数据缓冲, 用于解决高速的 CPU 和低速的外设之间的差距。
第 2 是提供联络信息,比如打印机什么时候能够接收数据。
第 3 是提供格式上的转换,比如模拟信号和数字信号之间的转换, 串行信号和并行信号之间的转换,不同电平之间的转换。
第 4,一个接口可能连接了多个设备,比如说有多个硬盘, 那这个 I/O 接口还需要提供设备选择的功能。
其它还有一些功能,在用到的时候再做介绍。
因此,在现代的计算机系统当中, 往往把跟输入输出相关的设备分解成两个类型,一部分是 I/O 接口, 这可能是插在计算机主板上的一块插卡,也有可能是主板上的一个芯片,它内部会有一些寄存器,CPU 可以通过系统总线,去访问 I/O 接口当中的这些寄存器, 而这个 I/O 接口芯片,还会有一些管脚,与外部的设备相连。 那这种划分的典型代表,就是显卡和显示器, 显卡是一个 I/O 接口,显示器则被称为外设,那我们要注意的是,这样的划分和冯诺依曼结构当中所定义的输入输出设备,是不能完全一一对应的, 在这里,我们描述的是现代计算机发展过程中的,一种具体的实现。
那 I/O 接口究竟是如何用外设相连的, 我们来看一个例子,这是一种最简单的 I/O 接口, 叫做并行接口,它一边通过系统总线和 CPU 相连, 另一边可以连接数码管、拨码开关,这样简单的设备, 也可以连接打印机这样比较复杂的设备。 那这样的并行接口,一般有两种常见的实现形式,一种是采用独立的芯片,比如这个 8255A,就是一个并行接口芯片。那么早期的 I/O 接口,大多会采用这样独立芯片的形式, 而现在可以在一个芯片当中,实现多个 I/O 接口的功能。 所以这个并行接口,也可能被实现在一个多功能的芯片当中, 但不管是哪种实现形式,它总是要与这些外设进行连接。
我们先来看看它和那些简单的外设是怎么连接的, 比如说和一个简单的输出设备,就是这个数码管,那这个并行接口的芯片,对外会有 8 根引脚, 通过主板上的连线,就可以连接到这个数码管, 每根信号线,正好连接到其中一个可以发亮的部分, 加上旁边的这个小数点,一共有 8 个,因此,这和我们刚才用模型机演示的例子一样,CPU 只要将对应的数据写到这个数据输出寄存器上,并行接口芯片就会直接将这个寄存器的内容,输出到这八根信号线上,那这个数码管上对应的部分就会亮起,从而展现出我们编程想要输出的数字
那类似的,这个并行接口芯片,还可以有 8 个引角,连接到拨码开关, 那拨码开关的状态,就会被保存在数据输入寄存器当中,等待 CPU 来读取, 这些都是非常简单的设备。
那我们再看一些稍微复杂一点的设备,比如说打印机, 那么就不能像刚才那样简单的传入数据了,除了连接刚才那 8 根输出的信号之外, 还需要有一根信号,告诉打印机,此时输出的数据,是希望打印机接收的数据, 而打印机在接收了这个数据之后,还要给出一个回答的信号, 以表示它已经完成了这个数据的接收工作, 这样才能保证,这个并行接口和打印机进行数据传输时, 既不丢失数据,也不会传输到重复的数据。
那么对于扫描仪这样的输入设备,也是类似的情况, 扫描仪在将扫描了的数据进行输入时,也需要给出一个输入准备好的信号, 那并行接口电路在采样了数据输入之后,也需要给出输入的回答信号, 因此,并行接口芯片,在连接这些比较复杂的设备时, 除了那 8 根数据信号之外,还需要有两根用于通讯联络的信号, 而这两根信号,又被称为握手信号,在数据传输中, 起着协调和联络的作用,那对于稍微复杂一些的外设, 都得采用带握手信号的数据传输的方式。
在现代的计算机当中,这种并行接口电路,算是最简单的 I/O 接口了, 它和许多其它更为复杂的 I/O 接口,都会在集成在南桥芯片当中, 而还有少数对性能要求比较高的接口,则会采用独立的芯片,或者板卡的形式, 而在一些紧凑型的设备中,比如说平板电脑和智能手机, 这些 I/O 接口甚至会和 CPU 一起,集成在一个芯片当中。 那不管是哪种形式,这些 I/O 接口的功能都是独立存在的, 而且它们也需要各自的管脚、连线,与对应的外设相连,从而让 CPU 可以与外部进行交互。
外面的世界很精彩,但也很复杂。 我们的 CPU 虽然又超群的计算能力,然而它的交往技巧却是很贫乏, 所以我们为它找到了 I/O 接口这个好帮手