搜索 K
Appearance
博客正在加载中...
Appearance
计算机的核心能力就是运算, 而快速的数学运算,甚至是早期设计计算机时的唯一目标。
但是今天,计算机已经成为了我们日常生活中,密不可分的一部分。 我们平时感受更多的,可能是计算机与外界交互的能力, 因此,想要了解计算机的组成,我们就必须要知道现代计算机当中,输入输出设备到底是怎么工作的。
我们先来一起回顾模型机的结构, 这个模型机由一个 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 接口这个好帮手