计算机组成.零件之间的通信.总线BUS

2023-05-16

  • 总线干嘛的?说白了就是用来传输数据的,在计算机的各个部件之间。比如我主存里存的数据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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机组成.零件之间的通信.总线BUS 的相关文章

  • WSL2中使用systemctl报错Failed to connect to bus: Host is down

    问题截图 xff1a System has not been booted with systemd as init system PID 1 Can t operate Failed to connect to bus Host is d
  • Spring Config 配置中心和Spring Bus配合使用的一些坑

    个人觉得bus这个东西这是坑多 折腾好一会 xff08 使用actuator bus refresh 而不用bus refresh xff09 首先Config 和 Client 项目都添加如下配置 management endpoints
  • $CF1153A\ Serval\ and\ Bus$

    看大佬的代码都好复杂 xff08 不愧是大佬 orz 蒟蒻提供一种思路 因为求的是最近的车对吧 qwq 所以我们可以用一个 while 循环所以没必要去用什么 for 至于这是 div2 的第一题还是比较水的 code include lt
  • px4驱动linux,S.Bus Driver for Linux

    用于 Linux 的 S Bus 驱动 S Bus Driver for Linux 允许基于 Linux 的无人机通过串行端口从 Futaba S Bus 接收机 访问多达 16 个通道 驱动程序还应该与使用 S Bus 协议的其他接收器
  • matlab simulink 自定义bus使用

    使用matlab simulink 可以方便的查看数据 xff0c simulink支持自定义bus xff0c 在bus中可以自定义数据结构 其中需要注意的是 xff0c 自定义的数据结构是有顺序的 xff0c 当signal需要和bus
  • 总线学习(BUS)

    1 总线的概念 总线是指计算机设备和设备之间传输信息的公共数据通道 总线是连接计算机硬件系统内多种设备的通信线路 xff0c 一个重要特征是由总线上的所有设备共享 xff0c 可以将计算机系统的多种设备连接到总线上 如果是某两个设备或设备之
  • 从零开始学JetsonTX2----can bus开发

    step by step implementation 搞硬件开发 xff0c 先把技术手册搞到手 这个网页把几乎Jetson tx2的开发资料都汇总了一下 找教程开始配置can所需要系统环境 NIVIDA社区的教程 xff1a https
  • RS232/RS485/CAN_BUS 通信原理总结与通信波形分析

    分析一 xff1a 232串口信号 要点 xff1a RS232 xff0c 全双工 xff0c 采用三线制传输分别为TXD RXD GND xff0c 其中TXD为发送信号 xff0c RXD为接收信号 在RS232中任何一条信号线的电压
  • Google-Guava-EventBus源码解读

    Guava是Google开源的一个Java基础类库 它在Google内部被广泛使用 Guava提供了很多功能模块比如 集合 并发库 缓存等 EventBus是其中的一个module 本篇结合EventBus源码来谈谈它的设计与实现 概要 首
  • CXL 2.0 Device配置空间寄存器组成

    目录 1 配置空间 1 1 PCI Power Management Capability Structure 1 2 PCI Express Capability Structure 2 扩展配置空间 2 1 Virtual Channe
  • DDR从channel/rank/chip/bank/row/col/cell,DDR/GDDR/HBM

    DDR GDDR HBM请参考文献 1 ddr的层级结构 一个soc或者PC上的ddr都是有很多颗ddr single chip组成的 这么多颗ddr又组成了不同的层级 这些层级从大到小分为 channel gt rank gt chip
  • 存储器实验:存储扩展实验、MIPS寄存器文件设计

    一 实验要求 项目1 存储扩展实验 现有如下 ROM 组件 4片4K32位 ROM 7片16K32位 ROM 请在 Logisim 平台构建 GB2312 汉字编码的16K 16点阵汉字字库 电路输入为汉字区号和位号 电路输出为8 32位
  • Labview设计计算机--组合逻辑与时序逻辑(5)

    在写接下来的内容之前 我要强烈推荐一部书 编码 隐匿在计算机软硬件背后的语言 这是一本由浅入深的书 我也是借鉴了书中的很多想法才有勇气尝试在Labview上构建一个简单的计算机 看这本书的门槛不高 大概有高中知识就差不多了 ok 进入正题
  • vue 兄弟组件之间传值之bus

    有时候两个组件也需要通信 非父子关系 当然Vue2 0提供了Vuex 但在简单的场景下 可以使用一个空的Vue实例作为中央事件总线 参考 http blog csdn net u013034014 article details 54574
  • 【PCIe】3: PCIe BDF(Bus,Device,Function)

    目录 1 概述 2 BUS 总线号 3 Device 设备号 4 Function 功能号 1 概述 PCIe总线中的每一个功能都有一个唯一的标识符与之对应 这个标识符就是BDF Bus Device Function
  • 【计算机组成】Cache与CPU的直接映射、全相联映射与组相联映射

    一 Cache与CPU需要映射的原因 CPU准备访问内存时 会先问问cache存储器有没有已经提前准备好了数据 如果没有则再找内存要 如果Cache刚好命中 则直接从Cache中读取数据 如果Cache没有命中 Cache失效 则CPU再去
  • DDR5内存条容量计算

    DDR5内存条容量计算 一 理解DDR5通道的变化 二 理解芯片package 三 DDR5 symmetric module容量计算 之前对DDR的一些基础知识进行了总结 最近需要了解DDR5的知识 在之前文章基础上又有一些认识 所以重新
  • stWSO2ESB 输出序列处理

    我正在 WSO2ESB 中通过 XSLT 将 XML 请求转换为 SOAP 只是想知道是否可以使请求参数可用于响应 E g
  • 是否有通用 I2C 命令来查看设备是否仍然存在于总线上?

    是否有通用的 I2C 命令来查看设备在初始化一次后是否仍然存在于总线上 例如 OLED 显示器 我问这个的原因是为了避免主程序由于库代码中存在无限循环而冻结 当设备断开连接时 例如 Wire 库 在 MCU 启动时 我想检查设备是否可用 并
  • 我正在使用 SQL 设计公交车时刻表。每条巴士路线都有多个站点,我是否需要为每条路线准备不同的表?

    我正在尝试提出尽可能最有效的数据库 我的巴士路线大约有 10 个站点 巴士从一号站出发 直到到达第十站 然后再返回 这个循环每天发生3次 我真的很困惑如何有效地生成公交车的时间以及应该在哪里存储站点 如果我将所有停靠点放在一个字段中 将时间

随机推荐