PCI总线协议(一)

一.组成架构


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上哪些字节为有效数据。

   PAR:奇偶校验信号。它通过AD[31::00]和C/BE[3::0]进行奇偶校验。主设备为地址周期和写数据周期驱动PAR,从设备为读数据周期驱动PAR。

(3)接口控制信号线

   FRAME:帧周期信号。由当前主设备驱动,表示一次访问的开始和持续时间。当其 无效时,表示传输的最后一个数据周期。

   RDY:主设备准备好信号。该信号有效表明发起本次传输的设备(主设备)能够完成一个数据期。它要与TRDY配合使用,当这两者同时有效时,才能进行完整的数据传输,否则即为等待周期。在写周期,该信号有效时,表示有效的数据信号已在AD0~AD31中建立;在读周期,该信号有效时,表示主设备已做好接收数据的准备。

  TDRY:从设备准备好信号。该信号有效表示从设备已做好完成当前数据传输的准备工作,此时可进行相应的数据传输。同样,该信号要与IRDY配合使用,这两者同时有效数据才能进行完整传输。在写周期内该信号有效表示从设备已做好了接收数据的准备。在读周期内,该信号有效表示有效数据已被送入AD0~AD31中,同理, TRDY和IRDY中的任何一个无效时都为等待周期,此时不能进行数据的传输。

  STOP:停止数据传输信号。从设备发出的信号,表示请求主设备停止发送数据的信号。

 LOCK:锁定信号。有PCI总线上发起数据传输的设备控制发出的信号,多个设备在使用PCI总线,但是LOCK指令的控制者只有一个主设备(由GNT信号标识)。当LOCK信号有效时,表示驱动它的设备所进行的操作可能需要多个传输才能完成,如果对某一设备具有可执行的存储器,那么它必须能实现锁定,以便实现主设备对该存储器的完全独占性访问。对于支持锁定的目标设备,必须能提供一个互斥访问块,且该块不能小于16 个字节。连接系统存储器的主桥路也必须使用LOCK信号。

   IDSEL:初始化设备选择信号。在参数配置读写传输期间,用作片选信号。

   DEVSEL:设备选择信号。由从设备驱动,该信号有效时,表示驱动它的设备已成为当前访问的从设备。它有效表明总线上的某一设备已被选中。

(4)、仲裁信号线

   REQ:总线请求信号。该信号一旦有效即表示驱动它的设备要求使用总线。它是一个点到点的信号线,任何主设备都应有自己的REQ信号。

   GNT:总线允许信号。用来向申请占用总线的设备表示其请求已获批准。这也是一 个点到点的信号线,任何主设备都应有自己的GNT信号

(5)、错误报告信号线

   PERR:数据奇偶校验错误报告信号。但是该信号不报告特殊周期中的数据奇偶错误。一个设备只有在响应设备选择信号DEVSEL和完成数据期之后,才能报告一个PERR。对于每个数据接收设备,如果发现数据有错误,就应在数据收到后的两个时钟周期将PERR激活。该信号的持续时间与数据期的多少有关,如果是一个数据期,则最小持续时间为一 个时钟周期;若是一连串的数据期并且每个数据期都有错,那么PERR的持续时间将多于一个时钟周期。由于该信号是持续的三态信号,所以该信号在释放前必须先驱动为高电平。另外,对数据奇偶错的报告不能丢失也不能推迟,需要实时进行响应。

   SERR:系统错误报告信号。该信号用于报告地址奇偶错,特殊命令序列中的数据奇偶错,以及其他可能引起灾难性后果的系统错误。 SERR是漏极开路信号,由返遣错误的单元驱动,在一个PCI时钟内有效。SERR信号的发出和时钟同步,因而满足总线上所有其他信号的建立时间和保持时间的要求。

(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,依此类推。对于多功能设备,可以是所有功能用一条中断线,也可以是每种功能有自己的一条中断线,还可以是上两种情况的综合。  

   系统供应商在对PCI连接器的各个中断信号和中断控制器进行连接时,其方法是随意的,可以是线或方式、程控电子开关方式,或者是二者的组合,这就是说,设备驱动程序对于中断共享事先无法作出任何假定,即它必须能够给任何逻辑设备提供中断。

(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具有相同的时序。

   PAR64 t/s:奇偶双字节校验。是AD32~AD63和C/BE 4~7的校验位。当REQ64有效且C/BE 0~3上是DAC命令时,PAR64将在初始地址周期之后一个时钟周期有效,并在DAC命令的第二个地址周期后的一个时钟周期失效。当REQ64和ACK64同时有效时,PAR64在备数据期内稳定有效,并且在IRDY或TRDY发出后的第一个时钟处失效。PAR64信号一旦有效,将保持到数据周期完成之后的一个时钟周期。该信号与AD32~AD63的时序相同,但延迟一个时钟周期。该信号线在任何给定的总线周期内应保证连同AD32~AD63和C/BE 4~7在内的所有信号线上的“1”的个数为偶数(偶校验)或者为奇数(奇校验)。在发送时产生而在接收时进行校验。   SDONE in/out:监听完成信号(Snoop Done),表明对处理器Cache对主存的监听状态。当其无效时,说明监听仍在进行,否则表示监听已经完成。

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#的状态。 

   ⑤在完成最后一个数据相位之后的时钟周期主设备必须使IRDY#无效。

3、PCI总线的寻址

   PCI总线定义了三种物理地址空间:内存地址空间、I/O地址空间及配置地址空间,前两种为通常意义的地址空间,第三种配置地址空间用以支持PCI的硬件配置。 

   PCI总线的地址译码是分散的,每个设备都有自己的地址译码逻辑,从而省去了中央译码逻辑。PCI支持对地址的正向译码和负向译码,所谓正向译码,是指总线上每个设备都监视地址总线上的访问地址,判断是否落在自己的地址范围内,译码速度较快。所谓负向译码,是指要接受未被其他设备在正向译码中接受的所有访问,因此,此种译码方式只能由总线上的一个设备来实现(一般是连接标准扩展总线的桥)。由于它要等到总线上其他所有设备都拒绝之后才能动作,所以速度较慢。负向译码对于标准扩展总线上地址空间零散的设备是很有用的。正向和反向译码设备都不对保留的总线命令发出DEVSEL响应信号。

(1)、I/O地址空间

   在I/O地址空间,全部32位AD线都被用来提供一个完整的地址编码(字节地址),使得要求地址精确一级的设备不需多等一个周期就可完成地址译码(产生信号),也使负向地址译码节省了一个时钟在I/O访问中, AD0~AD1这两位很重要,并要与C/BE03配合,才能进行一次有效的访问。下表表示了AD[1~0]和初始数据相位中字节允许的有效组合。

表1 字节允许和AD[1~0]的编码

AD[1~0]

起始字节

有效的C/BE03的组合

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

保留(在第一个数据相位后解除连接)

如上表所示,在线性增加模式下,每个数据相位后,地址增加一个双字(即加4,对32位传输)或增加两个双字(即加8,对64位传输),直到传输结束。对于Cache行回卷(warp)模式,传输可从Cache中任意地址偏移处开始,Cache块的长度是由配置空间中的Cache块大小寄存器定义的。访问过程中每次地址增加一个双字(64位传输中地址增加两个双字),一直到Cache块的末尾,然后回卷到同一Cache块的开始处,再进行到Cache块的剩余部分被传送完为止。

(3)、配置地址空间

   在配置的地址空间中,要用AD2~AD7将访问落实到一个DWORD地址,寻址64个双字寄存器。当一个设备收到配置命令,这条配置命令地址被译码,IDSEL信号成立且AD0AD1为00,设备判断是否寻址自己的配置寄存器,如果是则该设备即被选为访问的目标,若不是就不参与当前的对话。如果译码出来符合某桥路的编号,且AD0AD1为01,则说明配置访问是对该桥后面的设备,即不与桥直接连接的设备。

(4)、字节校正  

   用字节使能信号C/BE03来指出哪些字节带了有意义的数据,在每个数据周期内,可以自由改变字节使能,使之对传输数据的实际含义和有效部分进行界定,这一功能称作字节校正或字节对齐。    

(5)、总线的驱动与过渡  

   为了避免多个设备同时驱动一个信号到PCI总线上而产生竞争,在一个设备驱动到另 一个设备之间设一个过渡期,又称为交换周期。在时序图上,交换期用"→←"来表示。

在每个地址周期和数据周期,所有的AD线都必须被驱动到稳定的状态(数据),即使是在当前数据传涉及到的字节所对应的AD线也不例外。在实际应用中,如果对功耗要求较高时,为尽量减少由于总线上信息所造成的功耗,对当前总线周期中不用的字节与前一周期相同的数据去驱动它们。

三.PCI总线的数据传输过程

   PCI采用地址/数据复用技术,每一个PCI总线传送由一个地址相位和一个或多个数据相位组成。地址相位由FRAME#变为有效的时钟周期开始。在地址相位,总线主设备通过C/BE[3~0]#发送总线命令。如果是总线读命令,在地址相位后需要一个交换周期,该周期过后,AD[3l~0]改由从设备驱动,以接纳从设备的数据。对于写操作没有过渡期,直接从地址相位进入数据相位。数据相位的个数取决于要传送的数据个数,一个数据相位至少需要一个PCI时钟周期,在任何一个数据相位都可以插入等待周期。FRAME#从有效变成无效表示当前正处于最后一个数据相位。 

   总线操作结束有多种方式。在大多数情况下,由从设备和主设备共同撤消准备就绪信号TRDY#和IRDY#。如果从设备不能继续传送,可以设置STOP#信号,表示从设备撤消与总线的连接。所寻址的从设备不存在或者DEVSEL#信号一直为无效状态都可能导致主设备结束当前总线操作,使FRAME#和IRDY#变为无效,回到总线空闲状态。

(1)、总线上的读操作

   图2表示PCI总线读操作时序的一个例子,从中可以看出,一旦FRAME#信号有效,地址相位便开始,并在时钟2的上升沿处稳定有效。在地址相位内,AD[31~00]上包含有效地址,C/BE#[3~0]上包含一个有效的总线命令。由于是对数据进行读取,因而要先插入一个等待周期,数据相位是从时钟3的上升沿处开始,AD[31一00]上传送的是数据,C/BE#线上的信息用于指定数据线上哪些字节有效(即哪几个字节是当前要传输的)。需要强调的是,无论是读操作还是后面要讲的写操作,从数据相位的开始一直到传输完成,CBE#的输出缓冲器(或锁存器)必须始终保持有效状态。 图2中的DEVSEL#信号和TRDY#信号由被地址相位内所发地址选中的从设备提供,但要保证TRDY#DEVSEL#之后出现,IRDY#信号是发起读操作的主设备根据总线的占用情况发出的。数据的真正传输是在IRDY#TRDY#同时有效的时钟前沿进行的。当这两个信号之一无效时,就表示需要插入等待周期,此时,不进行数据传输。这说明一个数据相位可以包含一次数据传输和若干个等待周期。图中所示的时钟4、6、8处各进行了一次数据传输,而在时钟3、5、7处插入了等待周期。 

   在读操作中的地址相位和数据相位之间,AD线上要有一个总线交换周期,这通过从设备强制TRDY#实现,即让TRDY#的发出比地址晚一拍。在交换周期过后且DEVSEL#信号变为有效时,从设备必须驱动AD线。 

   尽管主设备在时钟7处已知道下一个数据相位是本次传送的最后一个,但由于某种原因它暂时不能完成该次传输(此时IRDY#无效),所以主设备还不能撤消FRAME#,只有在时钟8处,IRDY#变为有效后,FRAME#信号才能撤消,从而通知从设备这是最后一个数据相位。
                                                                                                                图2 PCI总线读操作

(2)、总线上的写操作

   图3是PCI总线写操作时序的一个例子。从中可以看出,总线上的写操作与读操作相类似,也是FRAME#的有效表示写操作周期中地址相位的开始,但地址相位后不需要交换周期,因为数据和地址都是由同一主设备提供的。在图3中,第一个和第二个数据相位中没有等待周期,而在第三个数据相位中连续插入了3个等待周期,注意,第一个等待周期是由传输双方共同引起的。告诉从设备最后一个数据相位的方法与读操作时相同,即当FRAME#撤消后,还需要IRDY#处于有效状态。这里,主设备在时钟6处使IRDY#恢复有效,通知从设备这是最后一个数据相位,但由于从设备未准备好,最后一次数据传输到时钟8才完成。

   从图中AD和C/BE#的波形可看出,主设备发送数据可以延迟,但字节允许信号不受等待周期的影响,不得延迟发送。 

   上述的读/写操作均是以多个数据相位为例来说明的。如果是一个数据相位, FRAME#信号在没有等待周期的情况下,应在地址相位(读操作应在交换周期)过后即撤消。对于一个数据相位,中间亦可插入等待周期。


                                                                                                                    图3 PCI总线写操作

(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域地址转化为存储器地址,之后通过存储器控制器将数据写入存储器。

猜你喜欢

转载自blog.csdn.net/fzhykx/article/details/79718744