PCI 总线
PCI: 周边组件互联局部总线 (Peripheral Component Interconnect Local Bus)
1992年,Intel发布了PCI 1.0规范, 用于替代老的ISA总线。PCI总线的产生主要解决了ISA总线的以下几个缺点:
- 总线容量不够
- 地址宽度不够
- 不支持即插即用
PCI采用的是树型拓扑结构,每一个PCI device相当于树的一个结点或者叶子,对整个PCI Bus的遍历可以采用遍历树的算法,在对树进行遍历之后,可以获得整个PCI Bus的资源需求情况,从而进行统一的分配。任何一下结点的损坏也不会造成整个树的崩溃,因而具有鲁棒性。
电气信号
- 第一组:系统信号, 时钟信号(CLK)和复位信号(PCIRST#)
- 第二组:地址/数据,命令/使能信号
- 第三组:传输控制信号,FRAME#, TRDY#, IRDY#, STOP#, DEVSEL#, IDSEL
- 第四组:仲裁请求和仲裁允许, REQ#, GNT#
- 第五组:终端信号
- 第六组:错误校验信号
- 第七组:PCI64扩展信号
总线操作
PCI总线操作的一具典型的特点就是支持BURST传输。什么是BURST传输呢?首先你得知道PCI的数据总线和地址总线是复用的。这就是说在同样的总线上,一段时间是地址,一段时间是传输数据。如果没有BURST传输,那么完成一次数据传输之前都得发一次地址,这就是总线有一半的时间都在传地址,这使得总线和利用率很低。有了BURST传输,可以先发一个起始地址和数据长度N, 之后传输数据0~N-1就可以直接发数据,不用再发地址了。
PCI总线典型操作分为两部分:
- 地址相, 当FRAME#有效时,C/BE#上面出现4位交易码,AD上面是地址数据
- 数据相,当DEVSEL#有效时,AD上面出现传输数据
PCI总线的具体交易过程如下:
- 主设备发起#REQ, 申请总线的使用权
- 得到仲裁允许,#GRT
- FRAME#信号拉低,交易地址放入AD, 交易码放入C/BE#
- 如果从设备就在这个总线上,那么地址译码成功后,从设备会把DEVSEL#拉低,就可以开妈传输数据了
- 如果从设务不是直接连在总线上,而是跨过了PCI-PCI bridge。那么bridge就会启动一个请求重传的机制。即通过控制信号通知主设备重试,在此同时将自己作为主设备向下一级总线转发上级总线的交易请求,这样,当下一次主设备再次发起交易的时候,bridge上面已经有了从设备获取来的数据,交易就可以正常进行了。