本系列文章为哈尔滨工业大学刘宏伟计算机组成原理学习笔记,前面的系列文章链接如下:
计算机组成原理:P1-计算机系统概述
一、总线的基本概念
为什么要用总线
冯诺依曼结构的计算机包含运算器、控制器、存储器、输入设备、输出设备。尽管我们将运算器、控制器做在一起形成CPU,输入设备、输出设备做在一起形成I/O设备,我们也还包含三大部分。并且现在的计算机可能包含若干个CPU,外部设备的数量和种类也非常丰富。只有把这些部件连在一起,它们才会组成一个完整的计算机系统,才能协调地进行工作。
----将部件连接起来的方式有两种:
①分散连接:需要通信的两个部件用线连接起来。如果这台机器有数百个部件需要两两连接,则这些线非常多,若直接做在电路板上成本非常高,难度也很大。同时,设备间进行连接的接口要占用大量的空间,比如说有几百个部件要和CPU相连,这几百个接口就要占一个大箱子。同时,系统难以扩展。如果新增的部件要和原来的部件相连,增加起来难度就很大。
②总线(BUS):为了解决分散连接的问题,就引出了总线。总线是连接各个部件的信息传输线,是各个部件共享的传输介质。
总线上信息的传送
总线上信息传送有两种方式:串行和并行
串行:要传输的信息一位一位放到总线上去,接收方再一位一位接收。支持传输距离长,可以在机器外部传输或者机器之间的传输。
并行:要传输的信息多位同时放在总线上传输,接收方同时接受多位数据。需要多条数据线,如果传输距离较长,线和线之间会产生干扰,传输信息容易发生变形。因此并行传输适合短距离信息传输,适合放在机箱内。
总线结构的计算机举例
①单总线结构框图
如果所有部件都连接在一个总线上,那么总线就会非常繁忙。在任一时刻都只能有一对设备使用总线,这就使得总线很容易成为系统的瓶颈。比如主存有数据输入输出,那么CPU执行程序的过程就会中止,会严重影响CPU的效率。同时,如果设备较多,这个总线会比较长,远端设备与CPU通信时间会较长。但是这也有个优点就是可扩展性强。
②面向 CPU 的双总线结构框图
CPU与主存之间的信息传送非常频繁,CPU运行程序的过程中,数据、指令都来自主存。所以专门增加一条M总线在CPU与主存之间传递信息。但是这个结构也有问题,如果主存要与一个I/O设备通信,它俩之间没有直接的通路,需要通过CPU这个媒介,这就使得CPU执行程序的过程仍然会被打断。
③以存储器为中心的双总线结构框图
这个结构就保证了主存与CPU之间有总线传输数据,同时CPU、主存、I/O设备之间都能直接相连。
二、总线的分类
根据总线的位置分类
①片内总线
如果总线在芯片内部,完成芯片内部不同部件的连接,就叫片内总线。
②系统总线
计算机各部件之间的信息传输线,根据传输信息的不同又可以分为以下三类:
------数据总线
:一般来说数据总线是双向的,数据总线的宽度与机器字长、存储字长有关(一般小于等于机器字长)
------地址总线
:单向的,由CPU或主设备发出,地址总线的宽度与存储地址、 I/O地址有关
------控制总线
:双向的,由CPU向外输出(存储器读、存储器写、总线允许、中断确认),向CPU输入(中断请求、总线请求)。
③通信总线
用计算机系统之间或计算机系统与其他系统(如控制仪表、移动通信等)之间的通信,传输方式包含串行通信与并行通信
三、总线性能及性能指标
总线的位置
总线印刷在主板上,主板上有各个部件的插板。
总线的特性
①机械特性
要想进行有效连接,尺寸、形状、管脚数及排列顺序需要满足要求。
②电气特性
传输方向、有效的电平范围
③功能特性
每根传输线的功能:地址、数据、控制
④时间特性
信号的时序关系
总线的性能指标
①总线宽度
即数据线的根数,根数越多,同时传输的数据位数就越多。
②标准传输率
每秒传输的最大字节数(MBps)
③时钟同步/异步
是否有同步时钟,传输方式是同步还是不同步的。
④总线复用
地址线与数据线复用,可以减少总线中信号线的数量,减少芯片管脚数,芯片的封装体积就减小了。
⑤信号线数
地址线、数据线和控制线的总和
⑥总线控制方式
突发、自动、仲裁、逻辑、计数
⑦其他指标
如负载能力,即这条总线上可以挂在多少个I/O设备。
总线标准
现在各个厂商可以生产计算机的各个部件,要想将不同厂商生产的部件集成为一个计算机硬件系统,这些部件就需要遵守一些约定。只要按照这个标准约定,就可以将这些部件连接起来构成更大的系统。
总线标准逐渐向高速、可扩展性强方向发展。以ISA为例,每秒可以传递8M次信息,每次传输16位(2个Byte)信息,可以计算出带宽就是16MBps。
四、总线结构
前面我们看过单总线结构,也知道容易导致总线成为系统瓶颈
前面讲过以CPU和以存储器为中心的双总线结构,我们来看一种不一样的双总线结构。
将存储总线和I/O总线进行分离。存储总线连接CPU和主存,I/O总线连接各种I/O设备,两种总线通过通道进行连接实现CPU与I/O设备的通信。
三总线结构
新增一个
DMA(Direct Memory Access,直接存储器访问)总线
,直接完成一些高速外部设备对系统内存的访问,低速的外部设备仍然通过I/O总线进行访问。
三总线结构的又一形式
CPU性能提升大概每年52%,但是内存的存储延迟大概每10年才会变成原来的一半,内存的速度是个瓶颈。为了解决这个问题,在CPU与内存间增加了一个小容量的高速度的Cache,对主存中的数据进行缓存。CPU运行中需要的指令的数据主要从Cache中获取,局部总线就将CPU与Cache连接起来。系统总线通过一个扩展总线接口连接扩展总线,各种类型的设备都可以挂在扩展总线上,解决了I/O设备的扩展问题。
在这种结构中,多种速度类型的设备都连接到扩展总线上,会影响外部设备的工作速度
四总线结构
四总线结构多了一个高速总线,解决了上面那种三总线结构的缺点。
总线结构举例
①传统微型机总线结构
②VL-BUS局部总线结构
③PCI总线结构
④多层PCI总线结构
如果PCI总线上连接设备过多,总线的驱动能力不够,我们可以进行PCI桥进行扩展。
五、总线控制
总线上连接了多个设备,当多个设备同时向总线发出占用总线的请求,而总线在同一时刻只能由一对设备使用,这时就需要解决一个问题:判优控制
。这对设备占用总线后要进行通信,如何完成这个通信过程,这就是另外一个问题:通信控制
。
5.1 判优控制
根据是否能提出总线请求将设备分为两类
①主设备(模块):对总线有控制权
②从设备(模块):对总线没有控制权,响应 从主设备发来的总线命令
有的设备既能作为主设备也能作为从设备,有的总线还可以有多个主设备,有的总线只能有一个主设备。
总线判优控制方式
①集中式
将总线的判优逻辑做到一个部件上,如做到CPU中。集中式的总线判优控制又包含三种方法:
----链式查询
----计数器定时查询
----独立请求方式
②分布式
将总线的判优逻辑左到多个部件上,如做到各个部件的端口上
1、链式查询
链式查询方法中,共包含5条总线:数据线、地址线、BS(Bus State,总线状态线)、BR(Bus Request,总线请求线)、BG(Bus Grant,总线响应线)。在下面这个例子中,假设I/O接口1和I/O接口n都通过BR向总线控制部件申请占用总线。这时总线控制部件通过BG逐个去查询是那些接口发出的请求,知道碰到第一个提出总线占用的求情。这里最先会碰到I/O接口1,发现其发出了请求,于是同意其申请。于是I/O接口1就通过BS设置总线忙。
特征:各个接口都发出占用总线的申请,优先级由连接方式决定。如果一个I/O设备优先权较低,那么它就排在较后,很可能它提出的总线占用请求一直都不会应答。
缺点:对电路故障特别敏感,尤其是BG这条线。在向下传送过程中,如果一个接口出现了电路故障,后面的设备再也无法获得总线使用权。速度慢,因为会一直向下查询。
优点:结构特别简单,增删设备特别方便,优先级算法简单。进行可靠性设计时,比较容易实现,比如说把BS换成两条线,防止断了后电路无法工作。
用途:适用于微型计算机或一些简单的嵌入式设备。
2、计数器定时查询方式
计数器定时查询方式包含5条线:数据线、地址线、设备地址、BS、BR,总线控制部件里有个计数器。当若干个I/O接口通过BR向总线控制部件发出占用总线申请,总线控制部件接收到请求后在能够响应的情况下,就会启动这个计数器,计数器的值通过设备地址这条线向外输出。比如说现在计数器的值是0,那就对I/0接口0进行查询,看看是否提出了占用总线申请。如果它没有提出申请,计数器的值就自动加1,然后对I/O接口1进行查询。这里I/O接口1提出了申请,通过BS这条线进行应答。
优点:优先级确定非常灵活。比如说每次优先级查询时,计数器的值都是从0开始的,然后1 2 3 4…一直到n。也可以让计数器的值从上一次停止的地方那个值开始,那就变成了循环优先级。
特点:和前面的链式查询相比,它少了一条BG线,但是多了设备地址线。设备地址的宽度和设备数有关,比如说我有n个设备,进行二进制编码,需要 ⌈ l o g 2 n ⌉ \left\lceil {{\rm{lo}}{{\rm{g}}_{\rm{2}}}{\rm{n}}} \right\rceil ⌈log2n⌉位。
3、独立请求方式
前面两种方式查找哪一个高优先级设备提出了总线占用请求都是按顺序查找的,顺序比较慢。独立请求方式改变了这种方式,每个I/O接口都增加了BR和BG线。当多个I/O接口通过各自的BR向总线控制部件发出占用总线申请时,总线控制部件内部的排队其对优先级进行排队。
缺点:用的线比较多
5.2 总线控制通信
总线控制通信
①目的:总线判优结束并与设备建立通信后,解决通信双方协调配合问题
②总线传输周期:主从设备间完成一次完整可靠的通信所需要的时间。需要解决下面四个问题:
----申请分配阶段
:主模块申请,总线仲裁决定
----寻址阶段
:主模块向从模块给出地址和命令
----传数阶段
:主模块和从模块交换数据
----结束阶段
:主模块撤消有关信息,从模块也撤销有关信息
③总线通信的四种方式
同步通信
:由统一时标控制数据传送
异步通信
:采用应答方式,没有公共时钟标准
半同步通信
:同步、异步结合
分离式通信
:充分挖掘系统总线每个瞬间的潜力
1、同步式数据输入
例:假设CPU采用同步式数据输入从外部一个设备输入数据。
一个总线传输周期如下,分成了四部分
在T1时钟上升前,主设备必须要给出地址信号。在我们这个例子中,是CPU给出的。
在T2时钟上升前,必须要给出读命令信号,告诉从设备CPU要开始读取数据。
在T3时钟上升前,从设备必须要给出数据信号,通过数据总线给出
在T4时钟上升前,数据信号和控制信号就可以撤销了。
在T4时钟结束前,地址信号也可以撤销了。
同步式数据输出
例:假设CPU采用同步式数据输出向一个模块输出数据。
相同的,也有一个总线传输周期,分成了四部分
在T1时钟上升前,主设备必须要给出地址信号。
在T1时钟下降前,必须要给出数据。
在T2时钟上升前,必须要给出写命令。
在T3时钟做数据写入操作。
在T4时钟上升前,主设备撤销数据、撤销写命令。
在T4时钟结束前,撤销地址信息。
同步数据传输方式总结
总结:同步式数据传输方式出适用于总线长度较短,并且各个模块存取时间比较一致的情况
特点:需要有一个定宽定距的时标来控制整个数据的传输过程,同时在固定的时间点要给出固定的操作。
2、异步通信
和同步通信相比,没有定宽定距的时隙,但是多了两条线:请求线(主设备发出)和应答线(从设备应答)。
①不互锁方式:主设备发出请求,一段时间后自行撤销请求信号。从设备收到请求后进行应答,一段时间后自行撤销应答信号。不互锁方式通信安全性较差。
②半互锁方式:主设备发出请求,在收到应答信号后才撤销请求信号,如果没有收到应答信号就会一直发送请求信号。从设备收到请求后进行应答,一段时间后自行撤销应答信号。半互锁方式可能会导致请求信号一直保持高电平。
③全互锁:主设备发出请求,在收到应答信号后才撤销请求信号,如果没有收到应答信号就会一直发送请求信号。从设备收到请求后进行应答,在收到请求撤销信号后才撤销应答信号。这种方式可以完成可靠的数据传输。
3、半同步通信(同步、异步结合)
同步:发送方用系统时钟前沿发信号,接收方用系统时钟后沿判断、识别。
异步:允许不同速度的模块和谐工作,为了调整主从设备的差异,增加一条 等待响应信号 W A I T ‾ \overline {{\rm{WAIT}}} WAIT(从设备给出)。
以输入数据为例的半同步通信时序
正常流程如下:
T1时钟上升前,主模块发地址
T2时钟上升前,主模块发命令
T3时钟上升前,从模块提供数据
T4时钟上升前,从模块撤销数据,主模块撤销命令
但是,如果主从模块速度不一致,比如主模块是CPU,处理速度快。从模块是存储器,处理速度慢于CPU。在T3上升前,如果从模块无法提供数据,那么从模块要发出 W A I T ‾ \overline {{\rm{WAIT}}} WAIT信号(低电平有效)。主模块就检测 W A I T ‾ \overline {{\rm{WAIT}}} WAIT这条信号线,如果检测到是低电平,那么就插入一个Tw周期,等待数据的到来。在下一个时钟周期到来前,主模块还会检测 W A I T ‾ \overline {{\rm{WAIT}}} WAIT这条信号线是否为低电平,如果是,那么还会等待一个Tw周期,直到在某个时钟周期检测到 W A I T ‾ \overline {{\rm{WAIT}}} WAIT成为高电平。
对应的时序图如下:
在T1时钟上升前,主设备必须要给出地址信号。
在T2时钟上升前,必须要给出读命令信号,告诉从设备要开始读取数据。
在T3时钟上升前,如果从设备不能将数据准备好,通过 W A I T ‾ \overline {{\rm{WAIT}}} WAIT信号给出一个低电平,告诉CPU进行等待。CPU检测到 W A I T ‾ \overline {{\rm{WAIT}}} WAIT是低电平,在T3上升之前,插入Tw周期,直到数据准备好。T3开始就传输数据。
在T4时钟上升前,数据信号和读数据信号就可以撤销了。
在T4时钟结束前,地址信号也可以撤销了。
上述三种通信的共同点
一个总线传输周期(以输入数据为例)可以分成以下三部分:
①主模块发地址 、命令。这个过程需要占用总线
②从模块准备数据。这个过程不占用总线,总线是空闲的,这对总线资源来说是一种浪费。
③从模块向主模块发数据。这个过程需要占用总线
4、分离式通信
分离式通信可以充分挖掘系统总线每个瞬间的潜力,一个总线传输周期被分为两个子周期。
①子周期1:主模块 申请 占用总线,使用完后即 放弃总线 的使用权
②子周期2:从模块 申请 占用总线,将各种信息送至总线上
将总线传输周期化分成两个子周期就将总线空闲的那一段让出来了
分离式通信的例子
一个硬盘挂在通道上,在程序执行过程中,我们要从硬盘读取数据。对硬盘读取数据要分三部操作:
①定位:磁头在硬盘的表面进行镜像移动,移动到指定的磁道。这个时间比较长,一般需要几十毫秒
②找指定的扇区:磁头停止在硬盘表面,硬盘本身围绕一个轴转动。假设我们是5000转的磁盘,等待指定的扇区转到这个磁头的下面,平均的时间大概是6秒左右,然后才能开始读取数据。
③读取数据:假设每秒读取33M字节,一个磁盘的扇区大概是512个字节,这样我们只需要几微秒就将磁盘数据读出来。
如果通道发出定位命令后,通道和总线就断开了,硬盘控制器控制磁盘完成定位操作。找到扇区后,硬盘再次向通道发出请求,通道再让它们进行数据传输。这样就充分利用了总线每一瞬间的潜力。
分离式通信的特点
①各模块有权申请占用总线
②采用同步方式通信,不等对方回答
③各模块准备数据时,不占用总线
④总线被占用时,无空闲
总之,充分提高了总线的有效占用