一.组成架构
PCI的拓扑结构如图1-1,各设备的作用如下:
1>HOST主桥:隔离处理系统的存储器域与处理器系统总线的PCI域,管理PCI总线域,完成处理器与PCI设备之间的地址转换。
2>PCI总线:处理器系统中,含有PCI总线和PCI总线树两种概念,PCI总线由HOST主桥或者PCI桥管理用来连接各类设备。
3>PCI设备:声卡,网卡。分为三类:PCI主设备,PCI从设备,桥设备,同时刻只能为主设备或者从设备。
二.引脚信号定义
按照类型将上述引脚分类,逐个进行介绍。
(1)、系统信号线
CLK:时钟信号线,系统在时钟信号上升沿是有效,才能进行传输。
RST:复位信号线,在低电平时信号才能进行传输。
(2)、地址及数据线
AD0-AD31:地址和数据多路复用的输入输出信号。在FRAME有效时是地址周期,在IRDY和TRDY同时有效时是数据周期。在执行地址周期时,地址周期为一个时钟周期,在该周期中AD0~AD31线上含有一个32位的物理地址,对于I/O操作,它是一个字节地址;若是存储器操作和配置操作,则是双字地址。在执行数据周期时,IRDY有效表示写数据稳定,TRDY有效表示读数据有效。
C/BE0~3:总线命令和字节使能多路复用信号线。在地址周期内,这四条线上传输的是总线命令;在数据周期内,传输的是字节使能信号,用来表示在整个数据期中, AD0~AD31上哪些字节为有效数据。
(3)接口控制信号线
FRAME:帧周期信号。由当前主设备驱动,表示一次访问的开始和持续时间。当其 无效时,表示传输的最后一个数据周期。
RDY:主设备准备好信号。该信号有效表明发起本次传输的设备(主设备)能够完成一个数据期。它要与TRDY配合使用,当这两者同时有效时,才能进行完整的数据传输,否则即为等待周期。在写周期,该信号有效时,表示有效的数据信号已在AD0~AD31中建立;在读周期,该信号有效时,表示主设备已做好接收数据的准备。
TDRY:从设备准备好信号。该信号有效表示从设备已做好完成当前数据传输的准备工作,此时可进行相应的数据传输。同样,该信号要与IRDY配合使用,这两者同时有效数据才能进行完整传输。在写周期内该信号有效表示从设备已做好了接收数据的准备。在读周期内,该信号有效表示有效数据已被送入AD0~AD31中,同理, TRDY和IRDY中的任何一个无效时都为等待周期,此时不能进行数据的传输。
STOP:停止数据传输信号。从设备发出的信号,表示请求主设备停止发送数据的信号。
LOCK:锁定信号。有PCI总线上发起数据传输的设备控制发出的信号,多个设备在使用PCI总线,但是LOCK指令的控制者只有一个主设备(由GNT信号标识)。当LOCK信号有效时,表示驱动它的设备所进行的操作可能需要多个传输才能完成,如果对某一设备具有可执行的存储器,那么它必须能实现锁定,以便实现主设备对该存储器的完全独占性访问。对于支持锁定的目标设备,必须能提供一个互斥访问块,且该块不能小于16 个字节。连接系统存储器的主桥路也必须使用LOCK信号。
IDSEL:初始化设备选择信号。在参数配置读写传输期间,用作片选信号。
(4)、仲裁信号线
REQ:总线请求信号。该信号一旦有效即表示驱动它的设备要求使用总线。它是一个点到点的信号线,任何主设备都应有自己的REQ信号。
(5)、错误报告信号线
PERR:数据奇偶校验错误报告信号。但是该信号不报告特殊周期中的数据奇偶错误。一个设备只有在响应设备选择信号DEVSEL和完成数据期之后,才能报告一个PERR。对于每个数据接收设备,如果发现数据有错误,就应在数据收到后的两个时钟周期将PERR激活。该信号的持续时间与数据期的多少有关,如果是一个数据期,则最小持续时间为一 个时钟周期;若是一连串的数据期并且每个数据期都有错,那么PERR的持续时间将多于一个时钟周期。由于该信号是持续的三态信号,所以该信号在释放前必须先驱动为高电平。另外,对数据奇偶错的报告不能丢失也不能推迟,需要实时进行响应。
(6)、中断信号线
中断在PCI总线上是可选用的,低电平有效,用漏极开路方式驱动。同时,此类信号的建立和撤销是与时钟不同步的。PCI为每一个单功能设备定义一根中断线。对于多功能设备或连接器,最多可有4条中断线。对于单功能设备,只能使用INTA,其余3条中断线无意义。PCI局部总线有四条中断线,定义如下:
INTA o/d:中断A,用于请求一次中断。
INTB o/d:中断B,用于请求一次中断并只在多功能设备上有意义。
INTC o/d:中断C,功能同中断B。
INTD o/d:中断D,功能同中断B。
多功能设备上的任何一种功能都能连到任何一条中断线上。中断寄存器决定该功能用哪一条中断线去请求中断。如果一个设备只用一条中断线,则这条中断线就称为INTA,如果该设备用了两条中断线,那么它们就称为INTA和INTB,依此类推。对于多功能设备,可以是所有功能用一条中断线,也可以是每种功能有自己的一条中断线,还可以是上两种情况的综合。
(7)、高速缓存(Cache)支持信号线
为了使具有可缓存功能的PCI存储器能够和贯穿写(Write-Through)或回写(Write- Back)的Cache相配合工作,可缓存的PCI存储器应该能实现两条高速缓存支持信号作为输入。如果可缓存的存储器位于PCI总线上,那么连接回写式Cache和PCI的桥路必须要利用两条引脚,且作为输出,而连接贯穿写式Cache的桥只需要实现一个信号。上述两个信号的定义如下:
SBO in/out:双向试探返回信号(Snoop Backoff)。当其有效时,说明对某修改行的一次命中,所访问的数据为无效数据。当SBO无效而SDONE有效时,说明PCI发起方正在访问存储器的有效性并可进行高速缓存的操作。
(8)、64位总线扩展信号线
AD32~AD63 t/s:扩展的32位地址和数据多路复用线。在地址周期(如果使用了双地址周期DAC命令且REQ64信号有效时)这32条线上含有64位地址的高32位,否则它们是保留的;在数据周期,当REQ64和ACK64同时有效时,这32条线上含有高32位数据。
C/BE 4~7 t/s:总线命令和字节使能多路复用信号线。在数据周期,若REQ64和ACK64同时有效时,该4条线上传输的是表示数据线上哪些字节是有意义的字节使能信号。如C/BE4对应第4个字节,C/BE5对应第5个字节。在地址周期内,如果使用了DAC命令且REQ64信号有效,则表明C/BE 4~7上传输的是总线命令,否则这些位是保留的且不确定。
REQ64:64位传输请求。该信号由当前主设备驱动,表示本设备要求采用64位通路传输数据。它FRAME与有相同的时序。
ACK64:64位传输认可。表明从设备将用64位传输。此信号由从设备驱动,并且和DEVSEL具有相同的时序。
2、PCI总线的传输控制
采用猝发成组数据传输的传输方式,一个分组有一个地址相位(相位地址是指 把一个随时间变化的波形的相位存储到存储器中 然后编址取出 就是它的地址了)和一个或多个数据相位组成。数据传输的控制线:
FRAME#:由主设备驱动,说明一次数据传输周期的开始和结束。
IRDY#:由主设备驱动,表示主设备已经作好传送数据的准备。
TRDY#:由从设备驱动,表示从设备已经作好传送数据的准备。
当数据有效时,数据源设备需要无条件设置xRDY#(IRDY/TRDY),接收方可以在适当的时间发出xRDY#(TRDY/IRDY)信号。FRAME#信号有效后的第一个时钟前沿是地址相位的开始,此时,开始传送地址信息和总线命令,下一个时钟前沿进入一个或多个数据相位。每当IRDY#和TRDY#同时有效时,所对应的时钟前沿就使数据在主从设备之间传送。在此期间,可由主设备或从设备分别利用IRDY#和TRDY#的无效而插入等待周期。
只要数据传输已经开始,那么在当前数据相位结束之前,不管是主设备还是从设备都不能撤消命令,必须完成数据传输。最后一次数据传输时(可能紧接地址相位之后),主设备应撤消FRAME#信号而建立IRDY#,表明主设备已作好了最后一次数据传输的准备。当从设备发出TRDY#信号,表明最后一次数据传输已经完成,接口转入空闲状态,此时FRAME#和IRDY#均被撤消。
对于PCI总线的传输,可总结出以下几条规则:
①FRAME#和IRDY#决定总线的忙/闲状态。当其中一个有效时,表示总线忙;两个都无效时,总线进入空闲状态。
②一旦FRAME#被置为无效,在同一传输期间不能重新置为有效。
③除非设置IRDY#,一般情况下不能设置FRAME#无效(在FRAME#无效后的第一个时钟沿IRDY#必须保持有效)。
④一旦主设备已使IRDY#有效,在当前数据相位完成前,不能改变IRDY#或FRAME#的状态。
3、PCI总线的寻址
PCI总线定义了三种物理地址空间:内存地址空间、I/O地址空间及配置地址空间,前两种为通常意义的地址空间,第三种配置地址空间用以支持PCI的硬件配置。
(1)、I/O地址空间
表1 字节允许和AD[1~0]的编码
AD[1~0] | 起始字节 | 有效的C/BE0~3的组合 |
00 | 字节0 | XXX0或1111 |
01 | 字节1 | XX01或1111 |
10 | 字节2 | X011或1111 |
11 | 字节3 | 0111或1111 |
(2)、内存地址空间
在存储器访问中,所有的目标设备都要检查AD0~AD1,要么提供所要求的突发传输顺序,或者执行预备断开操作。对于所有支持突发传输的设备都应能实现线性突发性传输顺序,而高速缓存的行切换不一定是存储器地址空间,用AD2~AD31译码得到一个双字地址的访问,而AD[1—0]不参与地址译码,用来指明主设备要求的数据传输顺序。
表2 猝发顺序编码
AD1 | AD0 | 猝发顺序 |
0 | 0 | 线性增加方式 |
0 | 1 | 保留(在第一个数据相位后解除连接) |
1 | 0 | Cache行回卷(wrap)模式 |
1 | 1 | 保留(在第一个数据相位后解除连接) |
(3)、配置地址空间
(4)、字节校正
(5)、总线的驱动与过渡
为了避免多个设备同时驱动一个信号到PCI总线上而产生竞争,在一个设备驱动到另 一个设备之间设一个过渡期,又称为交换周期。在时序图上,交换期用"→←"来表示。
三.PCI总线的数据传输过程
PCI采用地址/数据复用技术,每一个PCI总线传送由一个地址相位和一个或多个数据相位组成。地址相位由FRAME#变为有效的时钟周期开始。在地址相位,总线主设备通过C/BE[3~0]#发送总线命令。如果是总线读命令,在地址相位后需要一个交换周期,该周期过后,AD[3l~0]改由从设备驱动,以接纳从设备的数据。对于写操作没有过渡期,直接从地址相位进入数据相位。数据相位的个数取决于要传送的数据个数,一个数据相位至少需要一个PCI时钟周期,在任何一个数据相位都可以插入等待周期。FRAME#从有效变成无效表示当前正处于最后一个数据相位。
(1)、总线上的读操作
图2表示PCI总线读操作时序的一个例子,从中可以看出,一旦FRAME#信号有效,地址相位便开始,并在时钟2的上升沿处稳定有效。在地址相位内,AD[31~00]上包含有效地址,C/BE#[3~0]上包含一个有效的总线命令。由于是对数据进行读取,因而要先插入一个等待周期,数据相位是从时钟3的上升沿处开始,AD[31一00]上传送的是数据,C/BE#线上的信息用于指定数据线上哪些字节有效(即哪几个字节是当前要传输的)。需要强调的是,无论是读操作还是后面要讲的写操作,从数据相位的开始一直到传输完成,C/BE#的输出缓冲器(或锁存器)必须始终保持有效状态。 图2中的DEVSEL#信号和TRDY#信号由被地址相位内所发地址选中的从设备提供,但要保证TRDY#在DEVSEL#之后出现,IRDY#信号是发起读操作的主设备根据总线的占用情况发出的。数据的真正传输是在IRDY#和TRDY#同时有效的时钟前沿进行的。当这两个信号之一无效时,就表示需要插入等待周期,此时,不进行数据传输。这说明一个数据相位可以包含一次数据传输和若干个等待周期。图中所示的时钟4、6、8处各进行了一次数据传输,而在时钟3、5、7处插入了等待周期。
在读操作中的地址相位和数据相位之间,AD线上要有一个总线交换周期,这通过从设备强制TRDY#实现,即让TRDY#的发出比地址晚一拍。在交换周期过后且DEVSEL#信号变为有效时,从设备必须驱动AD线。

(2)、总线上的写操作
图3是PCI总线写操作时序的一个例子。从中可以看出,总线上的写操作与读操作相类似,也是FRAME#的有效表示写操作周期中地址相位的开始,但地址相位后不需要交换周期,因为数据和地址都是由同一主设备提供的。在图3中,第一个和第二个数据相位中没有等待周期,而在第三个数据相位中连续插入了3个等待周期,注意,第一个等待周期是由传输双方共同引起的。告诉从设备最后一个数据相位的方法与读操作时相同,即当FRAME#撤消后,还需要IRDY#处于有效状态。这里,主设备在时钟6处使IRDY#恢复有效,通知从设备这是最后一个数据相位,但由于从设备未准备好,最后一次数据传输到时钟8才完成。
从图中AD和C/BE#的波形可看出,主设备发送数据可以延迟,但字节允许信号不受等待周期的影响,不得延迟发送。
上述的读/写操作均是以多个数据相位为例来说明的。如果是一个数据相位, FRAME#信号在没有等待周期的情况下,应在地址相位(读操作应在交换周期)过后即撤消。对于一个数据相位,中间亦可插入等待周期。

(3)、PCI总线传输的终止过程
无论是主设备还是从设备,都可以提出终止传输的要求,但不一定得到响应。也就是说,主从设备双方均无权单方面终止传输,而需要相互配合,但传输的最终停止控制要由主设备完成。
①由主设备引发的终止
主设备是通过撤消FRAME#并建立IRDY#来提出终止请求的,这样做是为了通知从设备,现在己进入了传输周期中最后一个数据相位。此后,IRDY#一直保持有效直到TRDY#信号有效,完成最后一个数据的传输。接着便撤消IRDY#,从而达到完全终止的条件(FRAME#和IRDY#同时无效),结束传输,进入总线空闲状态。
主设备一般在下列情况下会提出终止传输:
a一次数据传输即将结束(剩下一个数据未传输)。
b总线上有更高优先级的总线占用请求,而总线仲裁器取消当前主设备的总线控制权(移去了GNT#信号)。
c主设备发出了FRAME#后在规定的时间内没有检测到目标设备的DEVSEL#响应信号。
②由从设备引发的终止
从设备可以通过STOP#信号请求终止传输。一旦STOP#有效,就必须保持有效到主设备置FRAME#无效。IRDY#和TRDY#之间的关系与STOP#和FRAME#之间的关系无关。所以,在从设备请求终止期间数据仍可以传送,这仅取决于当时IRDY#和TRDY#的状态。
从设备可由下面两种原因请求终止传输:
①从设备正处于不能传送数据的状态。例如,设备的数据缓冲器满,暂时不能接收数据,或者因数据缓冲器空而不能发送数据等。待传送条件满足后,重新启动传输。这种情况称为“重入(Retry)”。
②由于从设备的响应速度太慢,在PCI引导时间长度(8个时钟周期)不能作出响应以及在猝发传输中,从设备检测到下一个数据的地址已经超出规定的范围等原因而提出终止传输请求。此种情况称为“解除连接(Disconnect)”。
(4)、posted和non-posted传输方式
PCI总线规定了两种数据传送方式,分别为posted和no-posted,使用posted数据传送方的总线事务被称为posted总线事务,NON-posted同理。
posted总线事务是指PCI主设备向PCI目标设备发送数据的时候,当数据到达PCI桥后立即由PCI桥掌管来自上游总线的总线事务,并将其转发到下游总线。
non-posted总线事务是指PCI主设备向PCI目标设备进行数据传递的时候,数据必须到达最终目的地之后,才能结束当前总线事务。
举例:
(1)posted过程:PCI设备11向存储器进行DMA写操作为例
1>当PCI设备11获得PCI总线x1的使用权之后,将发送存储器写总线事务到PCI总线x1
2>当PCI桥1发现这个总线事务的地址不在改桥管理的地址范围内将首先接收这个总线事务,并结束PCI总线x1的总线事务
3>PCI总线事务结束之后,PCI设备11可以和PCI设备12进行通信,PCI桥1获得PCI总线x0的使用权之后,将转发这个存储器写总线事务到PCI总线x0
4>之后host主桥x将接收这个存储器写总线事务,并最终将数据写进存储器。逐级释放总线资源!
(2)PCI设备进行DMA写操作:
1>PCI设备将存储器写请求发送到PCI总线x1.
2>PCI总线所有设备监听这个请求,由于是向处理器的存储器写,所以PCI总线上的PCI agent都不会接收这个请求。
3>PCI桥x1发现当前总线事务使用的PCI总线地址不是其下游设备的PCI域地址,所以接收这个请求,此时PCI桥x1结束来自PCI设备11的posted存储器写请求,并将这个请求推到PCI总线0上。
4>所有PCI设备包括host主桥都监听这个请求。并结束PCI桥x1的posted存储器写请求。
5>HOST主桥x发现这个数据请求发向存储器,将PCI域地址转化为存储器地址,之后通过存储器控制器将数据写入存储器。