五、PCI总线的仲裁机制

为了使访问的等待时间最小,PCI的仲裁机制使基于访问而不是基于时间。总线管理必须为总线上的每个一个访问执行仲裁,也就是说,一个总线主设备要想再总线上进行访问,必须提出仲裁要求。PCI总线执行中心仲裁方案,每个主设备都应又各自的请求线REQ#和GNT#,要想得到总线的控制权,必须履行响应的请求——批准手续。仲裁使“隐含的”,也就是说,一次仲裁可以再上一次访问期间完成,这样就使得仲裁的具体实现不必占用PCI总线周期,但是,如果在总线空闲期,就不一定采用隐含方式。中心仲裁机构必须实现一定的特殊仲裁算法,因为它是最坏情况下的仲裁基础,通常采用轮转优先级、公平性等仲裁算法。在具体实施中,系统设计者可以选择或修改算法,这是因为,仲裁算法从根本上看并不属于PCI总线技术规范。但有一点应注意,系统设计者在考虑具体算法时,必须为所选用的I/O控制器机器接插件所要求的访问延迟提供保障。关于总裁其的实现方案,在PCI总线规范中未作具体规定(即是任意的),但一定要保证在任何时间只能有一个GNT#信号成立。

5.1、仲裁协议

PCI总线仲裁中主要利用REQ#和GNT#两个信号线实现的,前者用于某一个设备占用总线的请求,后者允许某一设备占用总线和应答。换而言之,一个设备依靠发出它的REQ#信号来请求使用总线,当仲裁其根据当时情况决定发出一个设备可以使用总线时,就发出该设备的GNT#信号,对于一个设备,只要当它真正需要使用总线时才能发出REQ#,绝对不能利用REQ#把自己“停靠”在总线上。即使要实现总线的停靠,也要有仲裁器来指定缺省的总线拥有者。

仲裁其可以在任何时钟上置某一设备的GNT#无效。若某一设备要利用PCI总线传输数据时,必须确保它的GNT#信号在此时有效。下面给出PCI总线仲裁的基本协议规则:

1)若设置了GNT#信号无效而FRAME#有效时,当前的数据传输是合法的且继续进行下去。

2)如果总线不是处在空闲状态,则一个设备GNT#信号有效和另一个设备GNT#信号无效之间必须有一个延迟时钟,否则会在AD线上和PAR线上出现时序竞争。

3)当FRAME#无效时,未了响应更高优先级主设备的服务,可在任意时刻置GNT#和REQ#无效。若总线占用者在GNT#和REQ#设置后,在处于空闲状态16个PCI时钟后,仍未开始数据传输,仲裁其允许当前主机“打破”这个状态。仲裁其也可以在任意时刻移去GNT#,以便服务于一个跟高优先级的设备。

上述三条也可以说时GNT#信号的撤下原则。下面通过两个设备对总线的占用情况来说明仲裁的基本过程。其时序关系如下图所示。

为了讨论方便,我们假设两个设备分别为A和B,从上图可看出,在时钟1或在此之前设备A发出了REQ#-A请求使用总线,仲裁其根据总线的使用情况,于时钟2处发出了GNT#-A信号,表示设备A的请求获得了批准,可以使用总线。由于此时只有GNT#-A有效,而FRAME#和IRDY#无效,所以设备A可以在之中2启动一次传输。到了时钟3,FRAME#信号有效,设备A便可开始其数据的真正传送。兹于它的总线请求信号REQ#-A一直未撤销,说明它还要进行另外一次传输。

前面我们曾提到总线的仲裁时隐含的,因此,在设备A获得批准(时钟2)到它的数据开始传输(时钟3)期间,仲裁器同时决定出B设备应为下一个总线使用者。这是因为在设备A占用总线期间,设备B也提出了使用总线的请求(时钟1过后REQ#-B有效),所以,当设备A在时钟4传完数据时,仲裁器便撤销了GNT#-A而置GNT#-B有效,允许设备B使用总线。这样,设备A在时钟4之后就释放总线,同时FRAME#和IRDY#也消失,从而使得所有的PCI设备都能够判断出当前的数据传输已经结束。设备B在时钟5处成为总线的拥有者,可以启动开始传输,并在时钟7完成相应的传输。

另外,从上图中还可以看到在时钟6处REQ#-B信号撤销,而FRAME#信号有效,这表明设备B只请求进行一次数据传输,因而仲裁器便在此期间批准设备A为下一个主设备(由于REQ#-A仍然存在)。

从上面的讨论可以得出如下结论或者是注意事项:

1)如果当前的总线占有者要求进行多次数据传输时,应保持其总线请求信号REQ#一直有效。假如没有其它设备提出请求,或者该设备具有最高优先级,仲裁器便会批准它继续占用总线。

2)一个设备在其获得总线占有权期间只能进行一次数据传输,若想再次传输,他就要继续发出请求信号REQ#。

3)一个设备可在任何时刻撤销它的REQ#信号,但这时仲裁器也就认为该设备不再请求使用总线,随之撤销相应的GNT#信号。

4)倘若某设备只需要占用总线做一次数据传输,那么它必须在发出FRAME#信号的同时撤销REQ#信号。

5)如果一次传输因从设备发出STOP#而被终止的话,相应的主设备必须把它的REQ#信号撤销,并且要保持这种撤销状态至少达到两个PCI周期。即使这个主设备打算完成被从终止的传输,它也必须先撤销REQ#,然后重新发出REQ#信号再次提出请求。否则,它可以等以后需要使用总线时再发REQ#。这样做的目的是为了给其它设备留出使用总线的机会,一次给前一个从设备留出时间为下一次传输做准备。

5.2、仲裁的停靠

所谓停靠是指总线仲裁器再没有设备使用总线或者也没有设备请求使用总线的情况下,根据一定方式选定一个设备给它发出GNT#信号,从而选择一个缺省的总线拥有者,这有点类似于计算机常用的缺省配置。缺省所依据的方式一般采用固定为某一设备或选择最后一次使用总线的设备等,有时也可指定自己(仲裁器)为缺省的拥有者。

当仲裁器在总线空闲期间给一个停靠的设备发出GNT#信号时,该设备必须在8个时钟周期内将其AD[31..0]、C/BE[3..0]#及PAR的输出缓冲器打开,但是并不要求一定要在某一个时钟周期之内将全部的输出缓冲器打开,只要在2~3个时钟周期内完成即可。PAR相对于AD和C/BE信号可能延迟一个时钟周期。这样做的目的时为了保证总线能安全地停靠于某个设备上,从而导致总线不至于浮动。如果仲裁器不将总线实行停靠,则总线将由仲裁器所在的中央资源进行驱动。

在总线空闲时,除非仲裁器在撤销一个设备GNT#信号时赶巧碰上该设备发出FRAME#方可进行传输,否则,无论何种情况,该设备都将失去对总线的访问权,而且应把AD[31..0]、C/BE[3..0]及PAR(延迟一个时钟周期)变为第三态。这一点与前述的打开它们的输出缓冲器有所不同,它要求该设备必须在一个时钟周期内禁止全部输出缓冲器(断开输出),以防与下一个总线拥有者发生竞争。

根据以上的情况可以得出,在PCI总线上,从总线空闲周期开始到仲裁完成所需的最小延迟为:

1)具有停靠时,停靠的设备为0个时钟周期,其它设备为2个时钟周期;

2)没有停靠时,每个设备都为2个时钟周期。

最后要说明的是,当总线停靠于一个设备时,该设备不用发REQ#信号就可以开始一次传输(只要总线空闲且GNT#有效),如果它要进行多次数据传输,就需要发出REQ#,向仲裁器提出多次传输的请求;而只要求一次传输时,就不应当发REQ#,一面仲裁器在它不需要使用总线的情况下又给它发批准信号GNT#。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值