PCI上的基本总线传输机制时突发成组传输。一个突发分组由一个地址期和一个(多个)数据期组成。PCI支持存储器空间和I/O空间的突发传输。这里的突发传输是指主桥(位于主处理及和PCI总线之间)可以将多个存储器访问在不产生副作用的前提下合并为一次传输。一个设备通过将基址寄存器的预取位置1,来表示允许预读数据和合并写数据。一个桥可利用初始化时配置软件所提供的地址范围,来区分哪些地址空间可以合并,哪些不能合并。当遇到要写的后续数据不可预取或者一个对任何范围的读操作时,在缓冲器的数据合并操作必须停止并将以前的合并结果清洗。但其后的写操作,如果时在预取范围内,便可与更后面的写操作合并,但无论如何不能与前面合并过的数据合并。
只要处理及发出的一系列写数据(双字)所隐含的地址顺序相同,主桥路总是可以将它们组合成突发数据。例如,若处理机的写顺序时DWORD0、DWORD2、DWORD3,那么主桥路即可将它们组合成一次突发。PCI的突发顺序可以是DWORD0、DWORD1、DWORD2到DWORD3结束,中间可插入未访问的DWORD(双字),只要对应该双字的字节使能信号不发即可。合并的原则是只要后面的DWORD地址比前面的高就行。当读操作不会再被寻址的从设备上引起副作用时,桥路便可将单个的处理机读请求转变为一次突发读(前述的预取)。
对于I/O空间的访问不能合并,因此它们一般只有一个数据期。目前,是否由处理机或总线主设备可以发出指向I/O空间的突发传输,还无法得知,但不能排除将来有着这种设备的可能性。不能处理多个I/O数据期的PCI设备必须再第一个数据期之后断开访问,为此,桥路绝对不能把顺序的I/O访问合并成一个 突发的访问或单个的PCI访问。也就是说,对于所有的I/O访问,再处理机产生它们的同时,该访问也必须出现再PCI总线上。如果一个从设备被I/O访问选中,在字节使能信号所代表的传输长度大于该设备能支持的长度时,从设备要用目标终止方式结束本次访问。
在PCI总线中,除了RST#、INTA#~INTD#之外,其它所有信号都在时钟上升沿被采样,每个信号都有相对于时钟前沿的建立和保持时间,在此期间不允许有信号跳动,该时间一过,信号的变化就无关紧要了。这种建立和保持时间对于不同的信号,其情形时不同的。对于AD[31..0]、AD[63..32]、PAR、PAR64和IDESL来说,只有在一定的时钟边沿上才有上述时间的要求;对于LOCK#、IRDY#、TRDY#、FRAME#、DEVSEL#、STOP#、REQ#、GNT#、REQ64#、ACK64#、SBO#、SDONE#、SERR#和PERR#这些信号,在每个时钟前沿都有建立和保持时间;对于C/BE[3..0]、C/BE[7..4]这两组信号,在传输总线命令时,要在FRAME#第一次建立时对应的时钟边沿上遵守建立和保持时间关系;若传输字节使能信号时,要在完成一个地址期或数据期之后的每个时钟沿保证相应的建立和保持时间。
3.1、PCI总线的传输控制
PCI总线上所有的数据传输基本上都是由一下三条信号线控制的:
FRAME#:由主设备驱动,指明一个数据传输的起始和结束。
IRDY#:由主设备驱动,允许插入等待周期。
TRDY:由从设备驱动,允许插入等待周期。
当数据有效时,数据资源需要无条件设置XRDY#信号(写操作为IRDY#,读操作为TRDY#)。接收方可以在适当的时间发出它的XRDY#信号。FRAME#信号有效后的第一个时钟前沿时地址期的开始,此时传送地址信息和总线命令。下一个时钟前沿开始一个(多个)数据期,每逢IRDY#和TRDY#同时有效时,所对应的时钟前沿就使数据在主、从设备之间传送,在此期间,可由主设备或从设备分别利用IRDY#和TRDY#的无效而插入等待周期。
一旦主设备设置了IRDY#信号,将不能改变IRDY#和FRAME#,直到当前的数据期完成为止。而一个从设备一旦设置了TRDY#信号或STOP#信号,就不能改变DEVSEL#、TRDY#或STOP#,知道当前的数据期完成。也就是说,不管时主设备还是从设备,只要承诺了的数据传输,就必须进行到底。
当到最后一次数据传输时(有时紧接地址期之后)主设备应撤销FRAME#信号,而建立IRDy#信号,表明主设备已经做好了最后一次数据传输的准备,待到从设备发出TRDY#信号后,就说明最后一次数据传输完成,FRAME#和IRDY#信号均撤销,接口回到了空闲装填。总之,PCI总线的传输一般遵循如下管理规则:
1)FRAME#和IRDY#定义了总线忙/闲状态。当其中一个有效时,总线是忙的;两个都无效时,总线处于空闲状态。
2)一旦FRAME#信号被置为无效,在同一传输期间不能重新设置。
3)除非设置IRDY#信号,一般情况下不能设置FRAME#信号无效。
4)一旦主设备设置了IRDY#信号,知道当前数据期结束为止,主设备不能改变IRDY#信号和FRAME#信号的状态。
3.2、PCI的编址
PCI总线定义了三个物理地址空间:内存地址空间、I/O地址空间和配置地址空间。前两个是通常都有的,第三个用以支持PCI的硬件配置,将在后续章节中进一步说明。
PCI总线的编址是分布式的,每个设备都有自己的译码,从而省去了中央译码逻辑。PCI支持正向和负向两种风格的地址译码,所谓正向译码就是每个设备都监视地址总线上的访问地址是否落在它的地址范围,因此速度较快;而负向译码是指该设备要接受未被其它设备在正向译码中接受的所有访问,因此,此种译码方式只能由总线上的一个设备来实现,由于它要等到总线上其它所有设备都拒绝之后才能行动,所以速度较慢。然后,负向译码对于像标准扩展总线这类设备却是很有用的,这是因为这类设备必须响应一个很零散的地址空间。但无论是正向译码的设备还是负向译码的设备都不对保留的总线命令发出DEVSEL#响应信号。
1.I/O地址空间
在I/O地址空间,全部32位AD线都被用来提供一个完整的地址编码(字节地址),这使得要求地址精确到字节水平的设备不需要多等一个周期就可完成地址译码(产生DEVSEL#信号)、也使负的地址译码节省了一个时钟周期。
在I/O访问中,AD[1..0]两位很重要,它一方面用来产生DEVSEL#信号,更值得注意的是它也表示传输涉及的最低有效字节,并且要与C/BE[3..0]#相配合。例如,当C/BE0#有效时,那么AD[1..0]必须为“00”;如果C/BE3#有效时,AD[1..0]就应当为“11”.在具体访问中,每当一个从设备被地址译码选中后,便要检查字节使能信号是否与AD[1..0]相符 ,如果二者矛盾,则整个访问就无法完成,此时,从设备不传送任何数据,而是以一个“目标终止”操作来结束访问,下表给出了AD[1..0]和C/BE[3..0]#的对应关系。
AD1 | AD0 | C/BE3# | C/BE2# | C/BE1# | C/BE0# |
0 | 0 | X | X | X | 0 |
0 | 1 | X | X | 0 | 1 |
1 | 0 | X | 0 | 1 | 1 |
1 | 1 | 0 | 1 | 1 | 1 |
其中,1表示高电平,0表示低电平,X表示0或1.对于任何不同于上表的组合状态都是非法的。
2.内存地址空间
在存储器访问中,所有的目标设备都要检查AD[1..0],要么提供所要求的突发传输顺序,或者执行一目标设备断开操作。对于所有支持突发传输的设备都应能实现线性突发传输顺序。而Cache的行切换不一定必须实现,在存储器地址空间,要用AD[31..2]译码得到一个双字地址的访问。在线性增长方式下,每个数据周期过后地址按一个DWORD(4个字)增长,直到对话结束。在存储器访问期间,AD[1..0]的含义如下:
当AD[1..0] = 00时,突发传输顺序为线性增长方式;AD[1..0] = 01时,为Cache行切换方式;AD[1..0] = 1X时,为保留。
3.配置地址空间
在配置的地址空间中,要用AD[7..2]将访问落实到一个DWORD地址。当一个设备收到配置命令时,若IDSEL信号成立且AD[1..0] = 00,则该设备即被选为访问目标。否则就不参与当前的对话。如果译码出的命令,符合某桥路的编号,且AD[1..0] = 01,则说明配置访问时对着该桥后面的设备。
3.3、字节校正
字节使能信号仅被用来指出哪些字节带了有意义的数据,在每个数据期内,可以自由改变字节使能,使之对传输数据的实际含义和有效部分进行界定,这一功能被称作“字节校正”。
由于PCI设备的地址译码需要32位地址/数据线的全部,所以在PCI总线上不能进行字节的交换。但是具有64位数据通路的主设备可以进行DWORD(双字)的交换,这就是说,字节总是按字节地址所规定的自然字节位置上出现。主设备可以在每个新数据期改变字节使能信号,但一定要使其在每个数据期开始的时钟前沿变为有效,且在整个数据期中保持不变。一个主设备若要在读操作中改变字节使能信号,那么在写操作中也应采用同样的时序关系。如果目标设备在读操作中特别要求字节使能信号配合的话,则在响应的数据期必须等到字节使能信号有效,方可完成传输,否则该设备必须会送全部字节。
如果当前要读取的数据来自于可缓存的存储器,则无论字节使能信号是否有效,所有的字节都必须传送。这就要求主控一方能够保证使得目标设备回送全部字节。也就是说,假如可缓存性是由数据读取发起者判断而知,则该设备要能保证使C/BE[3..0]的各位均有效,以使被选中的设备送回全部字节;反之,要是目标一方判断而知,那么目标放就必须回送全部字节,可不必考虑字节使能信号的状态。
对于一个不支持高速缓存但支持预取的从设备(目标设备),只要不会引起数据破坏或状态改变,也可回送全部字节而不受字节使能信号的控制。
PCI总线允许字节使能信号以相邻或不相邻的形式进行组合。对于目标设备,即使没有字节使能信号,也必须通过发出TRDY#使数据传输完成,倘若使读操作还要提供奇偶位。
3.4、总线的驱动和过渡
为了避免多个设备同时i驱动一个信号到PCI总线上而产生竞争,在一个设备驱动到另一个设备驱动之间设置了一个过渡期,又称交换周期,在后续章节的时序图中,用互相指着对方尾部的双箭头符号来表示。此周期在不同的信号上所出现的时刻使不同的。对于IRDY#、TRDY#、STOP#、DEVSEL#和ACK64#这些信号都利用地址期作为交换周期;而FRAME#、C/BE[3..0]#、AD[31..0]、C/BE[7..4]#、AD[64..32]及REQ64#这些信号,则是利用数据传输之间的空闲期作为交换周期;LOCK#信号的交换周期出现于当前的控制着释放它之后的一个时钟周期;PERR#的交换周期开始于前一个数据期过后的第四个时钟周期,相当于比AD线的交换周期推迟了三个时钟周期。
在每个地址期和数据期中,所有的AD线,都必须被驱动到稳定的状态(数据),即便是在当前数据传输中未涉及的字节所对应的AD线,也不例外。这样做的目的有三:①为了奇偶计算;②使传送中未被包含的字节所对应的缓冲区不至于处在临界状态;③便于快速而相对稳定地锁定数据。在实际应用中,如果对功耗要求较大时,未尽量减少由于总线上信号开关所造成的功耗,对当前总线周期中不用的字节最后利用与前一周期相同的数据驱动它们,否则,没有具体要求。但奇偶位的计算包括所有的字节在内,与字节使能信号的有效与否无关。