PCI总线协议基础
; \6 b* M* s! B* H. Y- ^& j6 H& ^
PCI基本总线协议传输机制是猝发成组数据传输。一个分组由一个地址相位和一个或多个数据相位组成。
5 X) h! s8 o$ k; U
1.PCI总线的传输控制
) R/ B( s* }) h; t+ C' I* Q, j& V9 Y
PCI总线上所有的数据传输基本上都是由以下三条信号线控制的:
9 ^2 G5 o4 t8 Z) d1 m$ z2 V- K: x FRAME#:由主设备驱动,说明一次数据传输周期的开始和结束。
6 P% Z" k! v3 t$ d& |; t
IRDY#:由主设备驱动,表示主设备已经作好传送数据的准备。
1 @+ F3 S: s2 Z1 {- P! J
TRDY#:由从设备驱动,表示从设备已经作好传送数据的准备。
) u7 j3 [3 u! Y) j7 l" s* F* A) X2 j
当数据有效时,数据源设备需要无条件设置xRDY#,接收方可以在适当的时间发出xRDY#信号。FRAME#信号有效后的第一个时钟前沿是地址相位的开始,此时,开始传送地址信息和总线命令,下一个时钟前沿进入一个或多个数据相位。每当IRDY#和TRDY#同时有效时,所对应的时钟前沿就使数据在主从设备之间传送。在此期间,可由主设备或从设备分别利用IRDY#和TRDY#的无效而插入等待周期。
; l0 B' G0 N8 g' C% D6 [0 X 一旦主设备设置了IRDY#,将不能再改变IRDY#和FRAME#,直到当前的数据相位完成为止,而此期间不管TRDY#的状态是否发生变化。一旦从设备设置了TRDY#,就不能改变DEVSEL#、TRDY#或STOP#,直到当前的数据相位完成为止。也就是说,只要数据传输已经开始,那么在当前数据相位结束之前,不管是主设备还是从设备都不能撤消命令,必须完成数据传输。
8 Y2 C7 K$ @, G) e 最后一次数据传输时(可能紧接地址相位之后),主设备应撤消FRAME#信号而建立IRDY#,表明主设备已作好了最后一次数据传输的准备。当从设备发出TRDY#信号,表明最后一次数据传输已经完成,接口转入空闲状态,此时FRAME#和IRDY#均被撤消。
+ `7 z4 c( _; ]* u$ T2 O! Z
对于PCI总线的传输,可总结出以下几条规则:
0 R% O9 w+ f6 V* \$ V& F, w ①FRAME#和IRDY#决定总线的忙/闲状态。当其中一个有效时,表示总线忙;两个都无效时,总线进入空闲状态。
" Y2 F' u5 A$ J& O* d6 f: }5 K
②一旦FRAME#被置为无效,在同一传输期间不能重新置为有效。
* }; D8 o# i3 j$ M' V
③除非设置IRDY#,一般情况下不能设置FRAME#无效(在FRAME#无效后的第一个时钟沿IRDY#必须保持有效)。
) j- V- M1 ~4 j4 `0 |5 l9 f# f# }0 E
④一旦主设备已使IRDY#有效,在当前数据相位完成前,不能改变IRDY#或FRAME#的状态。
[/ \3 p) H3 K3 q( f8 _ ⑤在完成最后一个数据相位之后的时钟周期主设备必须使IRDY#无效。
. E; \3 f1 w: u2 F r
2.PCI总线的寻址
: C7 P% m8 c$ h4 C% C* x2 G! b PcI总线定义了三种物理地址空间:内存地址空间、I/O地址空间及配置地址空间,前两种为通常意义的地址空间,第三种配置地址空间用以支持PCI的硬件配置。
$ x% r- ^; w* I PCI总线的地址译码是分散的,每个设备都有自己的地址译码逻辑,从而省去了中央译码逻辑。PCl支持对地址的正向译码和负向译码,所谓正向译码,是指总线上每个设备都监视地址总线上的访问地址,判断是否落在自己的地址范围内,译码速度较快。所谓负向译码,是指要接受未被其他设备在正向译码中接受的所有访问,因此,此种译码方式只能由总线上的一个设备来实现(一般是连接标准扩展总线的桥)。由于它要等到总线上其他所有设备都拒绝之后才能动作,所以速度较慢。负向译码对于标准扩展总线上地址空间零散的设备是很有用的。
9 } `1 g& J2 `4 |, M4 _- Y# {4 y
在I/O地址空间,所有韵32位地址都用来表示一个完整的字节地址。启动I/O传输的主设备应确保AD[1~0]正确指示本次传输的最低有效字节(即起始字节)。字节允许信号和AD[1~0]一起指明传输的数据宽度和双字中被选中的字节,表9.5表示了AD[1~0]和初始数据相位中字节允许的有效组合。
; Q% h% k: a1 v. v( o7 ]4 X3 H/ M6 y
0 o' v1 n% O% |5 J& D- u
- t/ r) ]' F% d( l$ ]* d' p3 r! s. w4 G& Z0 a3 H4 T: s: ?1 E
+ T/ d9 P/ D0 B- m+ y1 |
1 \7 N- t1 @5 J$ e5 R 在存储器地址空间,AD[31~2]提供一个双字边界地址,而AD[1—0]不参与地址译码,用来指明主设备要求的数据传输顺序,见表9.6。
Q5 ^! f" D* [5 g% {0 o, z
- K* j U, @: R, {
0 S0 R' p, L5 C8 G8 q5 _; X- I7 X% H' l# p/ T6 L+ _: h" o
2 k$ F$ `0 h- H6 \8 S: _ & T# E. Q' Y2 B7 r5 d: a7 U9 L
在线性增加模式下,每个数据相位后,地址增加一个双字(即加4,对32位传输)或增加两个双字(即加8,对64位传输),直到传输结束。对于Cache行回卷(wayp)模式,传输可从Cache中任意地址偏移处开始,Cache块的长度是由配置空间中的Cache块大小寄存器定义的。访问过程中每次地址增加一个双字(64位传输中地址增加两个双字),一直到Cache块的末尾,然后回卷到同一Cache块的开始处,再进行到Cache块的剩余部分被传送完为止。
6 P2 b" q# m( J0 q( H 在配置地址空间,由AD[7—2]寻址64个双字寄存器。当一条配置命令的地址被译码,IDSEL有效且AD[1—0]=00时,设备判断是否寻址自己的配置寄存器,如果不是则不理会当前操作。
$ J; n l# y/ c0 j" b, i! J
3.PCI总线驱动的过渡
2 P" O: F: `. J9 E0 q. h# W
为了避免多个设备同时驱动一个信号到PCI总线上而产生竞争,在一个设备驱动到另一个设备驱动之间要设置一个过渡期,又称为交换周期,如图9—6所示中用互相指向对方尾部的双箭头符号表示。不同信号的交换周期出现的时刻可能不同。对于IRDY#、TRDY#、S