计算机的核心能力就是运算,
而快速的数学运算,甚至是早期设计计算机时的唯一目标。
但是今天,计算机已经成为了我们日常生活中,密不可分的一部分。
我们平时感受更多的,可能是计算机与外界交互的能力, 因此,想要了解计算机的组成,我们就必须要知道
现代计算机当中,输入输出设备到底是怎么工作的。
我们先来一起回顾模型机的结构,
这个模型机由一个CPU,一个存储器,和一个输入输出设备组成。
在系统启动后,CPU就会从地址总线发出地址 给存储器,然后从数据总线读回对应的指令编码,
并通过指令译码部件,产生相应的控制信号,完成对应的操作, 那这些操作有可能是进行运算,
也可能是读写存储器当中的某个单元,那也有可能是要进行输入输出的动作,
那我们来看一看,CPU如果要完成一个简单的输入动作,会是怎么样的。
我们这里的输入设备是八个手动的开关,
我们假设前三个开关都拨到高电平,后五个开关 拨到低电平,那这八个开关可能连接到了一个寄存器,
那这个单元当中,就保存了11100000这个数, 而且事先在系统当中,也为这个单元分配了一个地址,
那么事先就编写了一个用于输入的程序,在这个程序当中,有一条指令就是读取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可以与外部进行交互。