总线
概述
类型:
- 系统总线:连接CPU、存储器、I/O控制器和其他功能设备 
- 通信总线:连接主机和I/O设备,或连接不同的计算机系统 
设计要素:
- 用途 - 专用总线、复用总线
 
- 仲裁 - 集中式、分布式
 
- 时序 - 同步、异步、半同步、分离事务
 
- 总线带宽和数据传输速率 
- 总线层次结构 - 单总线、双总线、多总线
 

总线结构
- 数据线:在系统组件之间传输数据 - 数据线的数量决定了一次可以传输的数据的大小
 
- 地址线:在数据线和地址I/O端口上指定数据的来源和去向 - 地址线的数量决定了寻址空间的大小
 
- 控制线:控制对数据线和地址线的存取和使用 - 时钟:用于总线同步操作 
- 总线请求:表示模块需要获得对总线的控制 
- 总线允许:发出请求的设备已经被允许控制总线 
- 中断请求:表示某个中断正悬而未决 
- 中断响应:未决的中断请求被响应 
- 存储器读:从存储器读数据到总线 
- 存储器写:将数据从总线写入存储器 
- I/O读:从I/O端口读数据到总线 
- I/O写:将数据从总线写入I/O端口 
 
总线上数据传输的特点:
- 总线可以被多个设备监听,但同一时刻只能由一个设备发送数据 - 如果同一时刻多个设备同时发送数据,会造成数据之间的混淆 
- 总线被使用时,其他设备不能抢占 
 
- 如果连在总线上的某个设备希望向另一个设备发送数据,需要: - 获得总线的使用权 
- 通过总线传送数据 
 
- 如果连在总线上的某个设备希望向另一个组件请求数据,需要: - 获得总线的使用权 
- 通过总线向另一个设备发送请求,等待另一个设备发送数据 
 
用途
- 专用总线:始终只负责一项功能,或始终分配给特定的计算机组件 
- 复用总线:将同一线路用于多种用途 
仲裁
总线仲裁:当多个设备需要与总线通信时,通过某种策略选择一个设备
平衡因素:
- 优先级:优先级高的设备优先被服务 
- 公平性:优先级最低的设备不能一直被延迟 
仲裁方案
- 集中式:由仲裁器或总线控制器负责分配总线使用权 - 链式查询/菊花链 
- 计数器查询 
- 独立请求 
 
- 分布式:每个设备都包含访问控制逻辑,各设备共同作用分享总线 - 自举式 
- 冲突检测 
 
链式查询
所有的设备都是串行连接的,并允许信号从优先级最高的设备下发到优先级最低的设备
- 总线仲裁器收到请求后,在总线不忙的前提下,发起允许信号 
- 如果某个设备收到了允许信号并且发起了总线请求,该设备将总线设置为繁忙状态,允许信号将不再被进一步传递 
优点:
- 确定优先级简单 
- 可以灵活地添加设备 
缺点:
- 不能保证公平性 
- 对电路故障敏感 
- 限制总线的速度 
计数器查询
将总线允许线替换为设备ID线
- 如果总线空闲,总线仲裁器通过设备ID线发送计数 
- 如果当前发送请求的设备ID等于总线仲裁器当前的计数,中线仲裁器将停止计数,并将总线设置为忙 
优点:
- 通过使用不同的初始计数,可以灵活确定设备优先级 - 强调优先级:从1开始 
- 强调公平性:从下一个设备的ID开始 
 
- 对电路故障不敏感 
缺点:
- 需要添加设备ID线 
- 需要解码和比较设备ID信号 
- 限制总线的速度 
独立请求
每个设备都有自己的总线请求线和总线允许线,且直接连接到总线仲裁器
- 当一个设备请求总线时,它通过总线请求线将请求信号发送给总线仲裁器 
- 总线仲裁器决定哪个设备可以使用总线 - 固定优先级、公平链式、LRU、FIFO、$\cdots$
 
优点:
- 快速响应 
- 可编程的优先级 
缺点:
- 复杂的控制逻辑 
- 更多的控制线路 
自举式
每个设备在其总线请求线上发送请求,固定优先级,自行判断自己是否在请求总线地设备中优先级最高
- 最低优先级的设备没有请求线 
- 箭头最少的优先级最高 
冲突检测法
冲突:如果两个设备发现总线空闲,它们可能同时使用总线
- 在传输数据时,设备会监听总线,检查是否存在冲突 
- 如果发生冲突,所有使用总线的设备将停止数据传输,并分别在随机间隔时间后再次请求总线 
时序
确定每个总线事物的开始和结束时间
- 总线事务:地址 + 数据 + $\cdots$ + 数据
类型:同步时序、异步时序、半同步、分离事物
同步时序
时间的发生由始终决定
优点:
- 更容易实现和测试
缺点:
- 所有设备共享一个时钟 
- 总线长度受到时钟偏差的限制 - 同步总线很短,不然会出现时钟混乱
 
- 数据过长会导致不同步,造成问题 

异步时序
一个时间的发生取决于前一个事件的发生
分为非互锁、半互锁、全互锁三个阶段(使用握手规则)

- 蓝色表示先后关系,也就是“一次握手” 
- 非互锁(第一次握手):我告诉你我准备好了 
- 半互锁(第二次握手):我告诉你我已经收到了 - “我准备好了”信号只能在你说“我收到了”之后才能撤回
 
- 全互锁(第三次握手):我知道了你知道“收到了”之后才能撤回 
优点:
- 可以灵活地协调速度不同的设备
缺点:
- 接口逻辑复杂 
- 对噪声敏感 
异步数据传输

- CPU设置地址并设置ReadReq线 - 存储器读取相应地址
 
- 存储器读取相应地址并设置Ack线 - CPU释放地址线和ReadReq线
 
- CPU释放地址线和ReadReq线 - 存储器释放Ack线
 
- 存储器释放Ack线 - 存储器将数据传到数据线
 
- 存储器将数据传到数据线并设置DataRdy线 - CPU读取数据
 
- CPU读取数据并设置Ack线 - 存储器释放数据线和DataRdy线
 
- 存储器释放数据线和DataRdy线 - CPU释放Ack线
 
半同步时序
同步时序和异步时序相结合
为了减少噪声的影响,在异步计时中使时钟
- 准备和响应信号在时钟上升沿有效

分离事务
设备准备数据期间释放总线,将一个总线事件分离为两个过程
优点:
- 增加总线利用率
缺点:
- 增加每个总线事件地持续时间和系统复杂度

- 将两个信号之间的总线释放出来
总线带宽和数据传输速率
总线带宽:总线的最大数据传输速率
- 不考虑总线仲裁、数据传输等因素
数据传输速率:
- 考虑地址传输、握手等因素
总线宽度:组成总线的线数
- 数据总线越宽,一次传输的数据位数就越多 
- 地址总线越宽,一次传输的地址位数就越多 
例子:
我们假设同步总线的时钟周期为50ns,并且每一次数据传输需要一个时钟周期,异步总线每次握手需要40ns。两种总线均为32位宽,并且数据的准备时间均为200ns,计算当总线从内存中读取一个字(32位)的时候的数据传输率
- 同步总线: - 数据传输率:$\frac{32bit}{(50 + 200 +50)ns} = 106.7Mbps$ - 发送指令和地址到内存:50ns 
- 内存准备数据:200ns 
- 将数据传输到CPU:50ns 
 
- 异步总线:  - 数据传输率:$\frac{32bit}{(40 + 200 +120)ns} = 106.7Mbps$ - 步骤1:40ns 
- 步骤2、3、4 / 数据准备:$max((40 \times 3) ns,200ns)$ 
- 步骤5、6、7:$(40 \times 3)ns$ 
 
- 如果把存储器的数据准备时间改为230ns,则同步总线的数据准备时间应该是250ns,异步总线仍是230ns - 同步总线一个时间周期不可以做两件事情
 
不同数据块大小的数据传输速率
假设系统存在以下特征:
- 支持访问大小为4到16个字(每个字32位)的块 
- 同步总线具有64位宽和200MHz时钟频率,需要1个时钟周期来传输地址或64位数据 
- 在两个总线事务之间有2个空闲时钟周期 
- 内存访问时准备前4个字需要200ns,后面每4个字准备需要20ns 
- 当前面的数据在总线上传输时,内存可以同时读取后面的数据 
如果读取256个字,分别计算每次传输4个字和16个字时的数据传输速率、传输时间和每秒总线事务数:
- 每次传输4个字 - 总线事务:地址 + 4个字 - 地址传输:1个时钟周期 
- 数据准备:200ns(40个时钟周期) 
- 数据传输:2个时钟周期 
- 空闲:2个时钟周期 - 总共:$\frac{256}{4} \times (1+40+2+2) = 2880$ 个时钟周期 - 传输时间:$2880 \times 5ns = 14400ns$ - 每秒总线事务数:$\frac{64 \times 1s}{14400ns} = 4.44M$ 
- 乘以64是因为:计算的总时间是传输256,而非一个总线事务 - 数据传输速率:$\frac{256 \times 32bit}{14400ns} = 568.9Mbps$ 
 
- 每次传输16个字 - 总线事务:地址 + 16个字 - 地址传输:1个时钟周期 
- 数据准备(前4个字):200ns(40个时钟周期) 
- 数据传输:2个时钟周期(同时读取后4个字:20ns) 
- 空闲:2个时钟周期 - 总共:$\frac{256}{16} \times (1+40+3 \times max(2,4)+2+2) = 912$ 个时钟周期 - 传输时间:$912 \times 5ns = 4560ns$ - 每秒总线事务数:$\frac{16 \times 1s}{4560ns} = 3.51M$ 
- 乘以16是因为:计算的总时间是传输256,而非一个总线事务 - 数据传输速率:$\frac{256 \times 32bit}{4560ns} =1796.5Mbps$ 
 
提高总线数据传输率
- 增加时钟频率 
- 增加数据总线宽度 - 每次传输更多数据
 
- 块传输 - 传输一次地址就传输一块数据
 
- 分离总线事务 - 减少总线空闲时间
 
- 分离地址线和数据线 - 同时传输地址和数据
 
总线层次结构
单总线结构
CPU、存储器、I/O模块都连接到一条系统总线
优点:
- 简单,易于扩展
缺点:
- 连接的设备越多,总线长度越大,传输延迟也就越大 
- 聚集的传输请求接近总线容量时,总线成为瓶颈 

双总线结构I
在CPU和存储器中间增加一个存储器总线
优点:
- 增加CPU和存储器之间的传输效率,同时降低系统总线的负担

双总线结构II
将系统总线分为存储器总线、I/O总线和IOP(input/output processer)
优点:
- 降低I/O对总线的负担

多总线结构I
增加一个本地总线来连接CPU和Cache
优点:
- 分离了CPU和I/O的交互

多总线结构
将系统总线分为存储器总线、I/O总线和DMA总线
优点:
- 增加I/O效率

多总线结构III
增加一个高速I/O总线来连接高速设备
优点:
- 增加I/O交互效率
