- 总线干嘛的?说白了就是用来传输数据的,在计算机的各个部件之间。比如我主存里存的数据CPU要用,需要一条线路传过去吧,CPU内部各个寄存器之间、寄存器与ALU、CU与各个部件之间等等等等很多地方,总之就是部件之间需要传输数据
- 传输的数据分为三种,对应着三种功能的总线
- 数据总线
- 地址总线
- 控制总线
- 那么为何称为“总”线?那是因为大部分情况下,我们没办法把任意两个部件之间都连起来,因为部件的数量太多太多了
- 所以我们只用一根总线来传输, 那么面临的第一个问题就是,怎么区分数据、地址、控制这三类呢??
- 确实对于数据和地址有一种技术叫做总线复用,因为计算机是在时序的控制下工作,所以一根总线上的数据在不同的时间段内被规定为“数据”还是“地址”。对于控制信号还没有这样做的,,,
- 还是分三根总线来吧
- 那么又有一个问题,只有三根线的话,虽然可以区分是数据还是地址还是控制信号,但是对于众多的部件来说,它如何知道当前总线上传输的数据是不是给它的?因为一条数据线连接了所有的部件,A给B发送数据的时候上面的数据是给B的,对于其他部件是没用的、是错误的数据。
- 所以说,就需要控制信号来控制嘛。A发送数据的时候,控制信号就只让B从数据总线接收数据,其他部件是不接收的。
- 突然想到一个比喻,只是用来解释总线的工作原理,并非历史发展
- 总线大概就像自来水管,自来水厂没办法给所有的家庭都铺设一条专门的管道,所以就只铺设一条管道连接起所有的家庭。每个家庭都有自己家庭的工作用来给社会做贡献,哪家需要用水,就可以随时打开自来水管取水。
- 后来自来水厂买下了加油站,但是不想再铺设更多的线路,所以就仍旧用一根管道,但是告诉所有的家庭,只有在你收到了自来水的信号,从管道上才能取出你需要的自来水,收到的是汽油信号,取出来的就是汽油。信号的传输也需要一条线,所以就铺设了一条电线来传输信号
- 事实证明这做是明智的,因为自来水厂经济越来越发达,逐渐买下了食用油厂、煤气厂、盐厂、汉堡厂等等等等,但是依旧使用一根管道就可以服务所有的家庭了,只不过需要传输的控制信号多一点,这比多铺设管道要省钱多了
- 后来发现家庭之间的交换也比较频繁,既然有这么方便的总管道为什么不用呢?于是大家都在控制信号的控制下,被告知可以往管道上放东西的家庭就可以往管道上放东西,然后再通知谁来取东西。这些管道就变成了双向的通行,可以取也可以放。
- 所以总线的一个很重要的特征就是,对挂在上面的部件是共享的。
- 如果两个家庭之间达成私下交换的协议,或一个家庭和自来水厂有关系可以让人把东西专门开车送来,那相当于专门的通信通道,不能称之为总线
- 对应到计算机上,这种总线就是“以分时形式共享一组电导线”来实现。
- 废话太多了…
总线组成与特性
组成
- 传输线、接口和总线控制器
- 除了传输数据、地址和控制信号的信息线外,还有电源线和接地线来连接到每个部件,也有可能会有备用线来预防总线出故障
- 接口由三态门和缓冲寄存器组成。三态门可以决定当前总线与这个部件的联通状态,三态门的输出可以是1、0和高阻抗三个状态,多一个EO使能来控制
- 由于总线的共享性,所以需要一个总线控制器来控制总线的使用和分配,
特性
功能特性
- 传输线按功能(传输的数据是个啥)分类
- 地址总线
- 数据总线
- 控制总线
电气特性
- 也就是传输方向了啦
- 单向总线:只能一个方向传输数据。地址线单向就够了=、=
- 双向总线:全双工和半双工
- 全双工:同时可以双向的传输数据
- 半双工:一个时刻只能按照一个方向来传输数据
- 别问我怎么实现的,我不知道。我猜应该是在数字电路这门课上,,,,,,搞得我好想学
时间特性
- 按照时序来规定了每根传输线上的信号在什么时间才是有效的
- 不在指定的时间内读数据的话,大概是(没错我又开始猜了),要么读不到、要么读错掉
总线设计与实现
- 说到这还只是单总线的结构,即所有的模块共用一个总线。
- 但是
- 一个总线上接入的模块是有限的,太多的模块会让总线的负荷太高,降低通信效率
- 每个模块的工作频率也可看作速度不尽相同,比如CPU明显要快于I/O接口,这样在工作慢的模块占用总线的时候,工作快的模块干完了获要使用总线,但是总线被慢模块占用所以不得不等待。
- 所以出现了带局部总线的多总线结构
- 然各个部件之间的工作频率也不相同,这就很难协调,结果就是效率降低,于是就出现了层次总线结构,来处理部件之间的协调性
- 进一步还有
- 带局部总线的层次总线结构
- 使用桥接器连接的多总线结构
- 具有更强容错能力的多重总线结构
总线控制
- 有两句话很好的概括了总线的两个特性
- 发送的互斥性:某一时刻只允许一个功能部件往总线上发送数据
- 接受的共享性 :允许多个功能部件在同一时刻接收总线上传输的信息
- 那么如何协调好多个部件之间的这种信息传递的关系,就需要有人站出来控制大家对总线的使用
- 根据两个特性来分析
- 如何决定某一时刻由那个功能部件往总线上发送数据,称这个部件为主部件,主部件控制了总线。这部分叫“总线仲裁”。
- 接收信息的时候应该如何控制?万一我要接收数据的时候主部件还没有把数据放到总线上呢?万一我要接收的时候主部件却把数据从总线上撤销了咋办?这部分为总线的通信控制。
总线仲裁
- 如果很不幸,只有一个人站出来控制总线,那么就是集中式总线仲裁,谁来当主部件即谁来占用总线由他“集中”控制
- 串行链接方式:所有的部件通过一条线来向总线仲裁器发送“总线请求”信号。
- 若部件y发送总线请求信号,刚好总线是空闲的,那么总线仲裁器就发出总线可用的信号,它若接收到了那么就由它来占用总线,并也由它来发送总线忙的信号来告诉其他部件总线不是空闲的。
- 但是,总线可用信号的传递是从部件0依次向下传递的,如果部件0没有发出总线请求,才会把总线可用信号传递到下一个部件1。这很正常啊,谁让总线可用信号先经过我呢?就算你后面的部件在请求总线,那也是我前面的请求总线的部件先收到总线可用的信号啊。
- 这就形成了一种默认的优先级,,,而且因为是串联,所以一旦一个部件坏掉,其后面的部件将永远收不到总线可用信号
- 有一个名字叫“菊花链”……这一定是很久之前的名字了
- 定时查询方式:基于串行链式的方式
- 对所有的部件编号,在第一次收到总线请求的时候,计数器从0开始计数,并将计数器的数值作为总线可用的信号定时广播到每个部件
- 这个数值对应着可用接收这个总线可用信号的部件的编号,所以广播之后,所有的部件收到了总线可用的数值,对比自己的编号如果一样才可以发出总线忙的信号来占用总线,一旦收到总线忙的信号,计数器就停止计数(而不是归0,串行链接相当于计数器归0)。
- 否则的话计数器就+1,那么在下次发送总线可用信号的时候,可以响应总线可用信号的部件就是下一个了。
- 而且,计数器的值可以由软件来控制,这也意味着优先级可以由软件来随时更改。
- 明显复杂了许多,线路多成本高,而且由于需要提前编号、线路的数目取决于总线部件的数目等,使得可扩展性差。另外由于其定时发出信号的频率依赖于计数器的工作频率,所以不会很高。
- 独立请求方式
- 相对于串行的连线,独立请求就是总线请求和总线可用线对于每个部件都有一根专门与总线仲裁器相连,总线忙信号只需要一根就足够
- 每个部件独立的向总线仲裁器发送总线请求信号,如果当前总线是空闲的(总线忙的线无信号),则总线仲裁器向该部件发送总线可用信号,对于多个同时发送的总线请求信号,总线仲裁器内部根据硬件实现的仲裁算法来确定谁可占用总线
- 仲裁算法有预定(静态优先级)、自适应(动态优先级)、循环计数(平等)、先来先服务(队列)。
- 灵活性很强,但是成本最昂贵,,,你看那一根根的线,都是钱啊
- 固定时间片方式
- 利用了分时的思想
- 按照固定长度的时间片依次让各个部件来使用总线,即便当前部件不用总线,那也得等当前时间片过去之后才能换到下一个部件。
- 最简单,最公平,成本最低,效果最不好(不过在某些情况下也足够了)
- 串行链接方式:所有的部件通过一条线来向总线仲裁器发送“总线请求”信号。
- 集中之外就是分布了
- 分布意味着不需要一个大哥带头来宣判,而是大家一起按照规则来商量谁占用总线。不再有唯一一个仲裁器,而是有多个分布的仲裁器。
- 面向多处理器的计算机系统的总线标准就采用分布式总线仲裁器,也就是说这种分布的处理一般用于协调多个处理器
- 不过部件的工作终久还是干活,而不是忙于商量这种事,所以就交给一个代理“分布总线仲裁器”,各个代理手握自己部件的优先级,代理们商量也不是不可以嘛。
- 自举分布
- 自举不意味着平等,这种方式反而意味着固定的优先级,只不过需要你自己去检测有没有比你优先级更高的在使用总线
- 一个部件、先检测总线忙是否有信号,如果有则等待,否则再检测比它优先级更高的部件的总线请求信号是否有(也就是如果多个部件同时发出总线请求信号的话,总线忙还是没信号状态,但总不能分配给多个部件使用总线吧),如果有,就等待,否则使用总线并持续发出总线忙信号
- 设备 i 通过 BRi 线来发送总线请求信号,最低优先级的 设备3 的 BR3 线被当作总线忙 的信号
- 且慢,听我慢慢分析
- 最初没有设备在使用总线,所以BR0-BR3都是空闲的
- 设备3要使用总线,先检测总线忙(BR3)有没有信号(没有),再检测 BR0 - BR2 有没有信号(没有),于是 设备3 向 BR3 发送了总线请求信号,并持续向BR3发送信号作为总线忙的信号
- 设备1 和 2 也要使用总线了,但是总线忙(BR3)是有信号的,所以要等待(也就是说设备3虽然优先级最低,但也得尊重一下吧,使用总线的时候总不能被打断),于是 设备1 和 设备2 保持 着总线请求信号,也就是 BR1 和 BR2 都处于有信号状态
- 设备3 用完了,撤回 BR3 的信号,此时 设备1 和 设备2 检测到 BR3 没信号了,说明总线不忙了,但 设备2 检测到 BR1 上有信号,意味着有比 设备2 更优先的 设备1 在请求总线,所以 设备1 占用总线,并向 BR3发出信号,然后 设备1 就可以撤掉 BR1 的请求信号了
- 也就是说,BR3既是设备3(最低优先级)的总线请求线,也是大家所有的 总线忙 线。因为最低优先级的设备不需要根据 总线请求信号 来判断有没有更高的优先级,而只需要根据 总线忙 信号就可以。而最低优先级设备发送的 总线请求 信号如果能起作用,那也只有在 总线不忙 的时候才可以。所以 最低优先级设备的总线请求 和 总线忙 可以合到一起。
- 一根根线都是钱啊,是成本啊,是复杂度啊,这些东西都是能少就少的
- 此时的分布式总线仲裁器比较简单,只需要检测相应的线(总线忙和更高优先级的总线请求)有没有信号就可以了,所以内置到设备内也不是不可以,这样就不必单独设一个总线仲裁器了。
- 并行竞争
- 哈,这个比较复杂,设备自己搞不定了,所以需要一个分布式总线仲裁器
- 一个部件先向自己对应的分布仲裁器发送一个“优先级别AP#”的代码(M位的二进制可表示2^M个优先级)
- 分布仲裁器向总的“请求/准用”线上发布自己的 AP#
- 所有的 AP# 在“请求/准用”线上做 逻辑或 运算
- 随后各个分布仲裁器读取“请求/准用”线上的结果,如果结果大于自己的AP#,则说明有更高级别的设备在请求,于是就暂时撤销自己的 AP#
- 随着时间的流逝,“请求/准用”线上就留下了优先级最高的 AP# ,那么这个时候它的分布仲裁器再读取,就和自己的 AP# 一样了,也就没有比自己更高的,于是就可以占用总线并发出总线忙了
- 冲突检测
- 这个就简单了
- 如果总线忙,则等待
- 如果总线不忙
- 如果只有自己请求(无冲突),则使用总线
- 如果不止自己在请求(有冲突),则所有冲突的请求(即自己和其他请求)都推迟一个随机的时间再请求
- 不好意思没有图
- 这个就简单了
通信控制
通信需要发送方和接收方的配合,发送数据叫“源部件”,接受数据叫“目的部件”
- 同步通信
- 即根据时序的控制
- 源部件在固定的时间内发送数据并保持信号,到点就撤,不确认目的部件是否收到了数据
- 目的部件在固定的时间读取数据,不管能不能读到数据(总线上是否有数据),也不管读到的数据对不对(读到的是源部件发送的数据还是其他的杂乱数据)
- 时序哪里来?可以由中央时标来控制,也可以每个部件自带时标,但是需要和中央时标同步,就好比我们手机、电脑上的时间,每次打开网络就会在网络上和标准时间同步
- 如8086微处理器采用同步通信读取存储器的数据的时候
-
- T1CPU发送访存地址
- T2CPU发送读信号
- T3主存把数据放上去
- T4CPU读取数据
- 即根据时序的控制
- 异步通信
- 就是需要双方互相确认操作,这种确认是通过“握手”协议来实现,种类很多但大致分成单边控制和双边控制
- 单边控制
- 再分就是,目的部件控制还是源部件控制
- 目的控制
-
- 目的部件先发送数据请求,经过 t 时间的延迟到达源部件,源部件把数据放到数据总线,经过 t 时间的延迟数据到达目的部件
- 图
- 源部件先发送数据,隔 t1 时间再发送数据就绪信号(防止数据就绪信号比数据更早到达目的部件),目的部件收到数据就绪信号就读取数据总线上的数据。两次数据的发送间隔 t2 时间,这短时间内完成 源部件 向数据缓冲器装载数据,总线仲裁逻辑完成仲裁。
- 双边控制
- 双方都参与到确认中,但依然分主次,且进一步分为“非互锁”、“半互锁”、“全互锁”
- 书上只讲了以源部件为主……我也没再查更多的资料……
- 只看图吧。应该很容易看懂
- 半同步通信
- 两种极端的方式优点明显,但是缺点也明显
- 人们就很喜欢综合几种极端的方法来实现更好的平衡
- 宏观上按照同步通信来组织,局部上来用异步应答的方式
总线性能评价
- 位宽
- 总线一次传输数据的位数,也就是总线的线数,一根线只能穿1位(我猜是线上有电还是没电。没电其实说不太过去,因为我一直看到的都是“高电平”还是“低电平”。)
- 工作时钟频率
- 即控制总线的时钟信号的频率,单位一般是HZ,即一秒钟被分成了多少个节拍
- KHZ = 1000HZ
- MHZ = 1000KHZ
- ……
- 单个数据的传送周期
- 数据传输的方式分为正常传输和突发传输
- 正常传输
- 先发一个地址,再发一个数据
- 突发传输
- 先发一个地址作为首地址,然后发送多个数据
- 一个时钟周期即为一个节拍的长度
- 负载能力
- 总线上可挂在的部件的最大数目,其实一般不会太大,太大在仲裁的时候会有比较久的延迟,而且总线本身也负载不起
- 数据传输速率
- 总线一秒可稳定传送数据的字节数
- 单位为KB/s、MB/s
- 最大数据传输速率又称为带宽
- 总线带宽 = 总线位宽 * 总线工作频率 / 8
时间: 2024-10-13 00:06:34