在具有了信号传输的能力之后,总线标准的另一项任务就是规定如何使用这些信号来传输数据。数据的传输一般是在总线上的两个设备之间进行的,这两个设备中的一个要控制总线完成整个传输过程,这个设备被称作“主设备”,相应地另一个设备被称作“从设备”。
为使信息传送正确有效,主从设备之间应遵循一致的传输协议。这种协议可以通过直接定义相关信号的时序关系来实现,也可以采用数据包交互的方式来定义。这种协议要解决以下几个问题:数据的传输方向、数据的传输目标以及数据的传输过程。
数据的传输方向指的是数据在主设备和从设备之间的流动方向。一般来讲,从主设备向从设备传输数据被称作“写”,从设备向主设备传输数据被称作“读”。数据的传输目标一般用目标地址的方式来给出。由于一般情况下不同的设备占用不同的地址区域,所以目标地址可以被用来分辨哪个设备是从设备,这个过程可以通过对地址线的一部分进行译码来实现。另外,目标地址的其余部分还可以被用作在设备内部的寻址,从而指明从设备应当如何处理数据。
一条总线可以定义多个地址空间,这些地址空间互相之间是无关的,不同的地址空间被用作不同的用途,不同地址空间的读写操作可以通过不同的数据传输命令来区分。例如ISA总线定义了16 MB的存储器空间和64 KB的I/O端口空间,所以ISA总线相应地定义了存储器读、存储器写、I/O读、I/O写这几种不同的总线操作来对不同的地址空间进行不同的操作。由于更强功能的要求,PCI和PCI Express总线对地址空间的定义比ISA更为复杂,其总线操作命令也相应地更加复杂。
数据的传输过程一般由总线主设备通过一系列的信号或命令进行控制,一般情况下,整个传输过程要经过数个总线时钟周期才能完成。在这个过程中,总线主设备通常要先给出总线命令和目标地址,然后再根据传输的方向和从设备的响应进行数据的传输工作。对于写操作,由于数据是从主设备向从设备传送,主设备可以在送出总线命令和目标地址的同时将要传送的数据放到数据总线上,直到从设备完成了数据的接收并给出确认信号,一次总线写操作才能完成。对于读操作,由于数据来自从设备,主设备必须等待从设备将数据放置在总线上,并根据从设备给出的确认信号对数据加以采样,才能完成一次总线读操作。这样,一次总线传送从总线主设备控制总线给出传输命令开始,到总线操作完成回复空闲(或开始下一次总线传送)为止,这段时间(一般是总线时钟周期的整数倍)被称作一个总线周期。一个总线周期可以传送一次数据,也可以传送多次,具体的传送次数由总线传输协议规定。
从用途上来讲,总线信号一般分为三类:总线基本信号(包括复位、时钟、电源、地线等总线工作必需的基本信号)、总线访问信号(用于访问数据的地址、数据线以及相应的应答信号)和总线控制信号(用于总线控制等功能)。不同的总线对总线信号有着不同的定义,ISA总线的引脚定义如图7-25所示。
图7-25 ISA总线的引脚信号定义
图7-25中省略了用于给ISA总线设备进行供电的电源与地引脚,这些引脚为ISA总线设备提供±5 V和±12 V直流供电。ISA信号在总线插槽上的位置如图7-26所示。
图7-26 ISA总线信号在插槽上的位置
在ISA总线中,总线基本信号主要由RESET、BCLK和OSC三个信号组成:
●RESET:用于系统加电时或复位键按下时作用于ISA总线上的初始化信号,高电平有效。当ISA卡收到RESET线上有一定宽度的高电平脉冲时,表示系统要求初始化。
●BCLK:总线基本时钟,总线上的其他信号都以BCLK来同步,由于早期的ISA总线与CPU直接相关,因而它常与CPU时钟同步,通常在4.77 MHz(8088CPU时钟)~8.33M(33MCPU时钟的分频)之间变化。目前ISA作为慢速的扩充总线已与CPU无关,因而大多BCLK固定在8 MHz。
●OSC:14.318 MHz时钟,可用于ISA卡的部件。这个信号的设立是因为早期PC的晶振采用这个频率(14.318/3=4.77 MHz),ISA卡上的一些器件,如异步串行器件8250也需要这一时钟,从兼容性出发,ISA总线上仍保留了这一信号。
在总线基本信号的基础上,总线访问信号提供总线访问和传输控制的能力。为了达到总线传输的目的,总线访问信号必须提供目标地址信号、地址锁存/地址有效信号、总线数据信号、读写控制信号等。
ISA总线的目标地址信号由两部分组成,它们分别是位于基本插槽的低20位地址和位于16位扩展插槽的高7位地址:
●SA19~SA0:存储器和I/O地址空间的第19位至第0位地址线,可以访问8位ISA的1 MB空间。SA19~SA0经过锁存,在整个访问周期内一直保持有效。
●LA23~LA17:存储器空间的第23至第17位地址线,用于确定16 MB地址空间的高位,与SA合起来访问整个16 MB的地址空间。
由于8位和16位ISA总线地址空间的不同,ISA总线的地址信号线被分成了两部分,其中SA19~SA0可以独立使用,而LA23~LA17则需要与SA19~SA0结合起来使用。这两部分地址信号中LA19~LA17和SA19~SA17是相互重叠的,所以它们能够传送20+7-3=24位的有效地址,从而实现对16 MB地址空间的寻址。
与地址信号配合使用的是一个被称作BALE的地址锁存信号,这个信号用于对地址信号进行锁存以保证地址信号在整个总线访问周期的有效性。
●BALE:地址锁存信号,SA19~SA0就是经BALE将CPU的地址信号锁存后送到总线上的。而LA23~LA17是不锁存的,即在BALE期间LA23~LA17有效,如希望在访问周期的以后时间内仍有效,ISA卡应在BALE下降沿将其锁存。由于LA23~LA17为非锁存信号,它会比SA19~SA0更早有效,可使地址译码提前开始,从而加快了数据访问速度。这也是为什么要“浪费”三个引脚将LA19~LA17这三条地址线重复一遍的原因之一。
在地址信号之外,总线还必须传送总线命令信号以表明总线上要被执行的是什么样的传送操作。在ISA总线中,可以访问的地址空间被分为存储空间与I/O空间,相应地可以被执行的总线传送操作包括I/O读、I/O写、存储器读和存储器写,这些总线传送操作可以由一系列的信号来表示:
●、:I/O的读与写命令信号,低电平有效。和信号是在CPU或DMA控制器发出地址信号后发出的信号,用以通知ISA卡进行的I/O读和写操作。
●、:存储器读和写信号。低电平有效,用以通知ISA卡进行存储器读和写操作。
●、:系统存储器读和写信号,低电平有效。和SW用于8位ISA总线上,指示CPU或DMA控制器对前1 MB以内的存储器进行访问。1 MB以外的存储器访问不产生和信号。从实现上来讲,R和信号实际上就是和信号与1 MB以下地址信号译码结果的逻辑与。
很显然,总线上的I/O读、I/O写、存储器读、存储器写这四种总线操作是不可能同时出现的,那么,、、、这几个信号应当是互斥的,也就是说,这些信号不应当同时出现在总线上。
地址信号给出了目标地址,传送命令信号指明了总线上要进行什么样的传送操作,被操作的数据也需要一组信号线进行传递,这就是总线数据信号。
●SD15~SD0:总线数据信号,共中SD15~SD8由16位ISA扩充槽提供。SD15~SD0是CPU或DMA控制器与ISA卡之间信息传送的数据线。当读数时(或、有效),数据从ISA卡读到CPU或DMA控制器控制的设备;当写数时(或、有效)数据从CPU或DMA控制器控制的设备写数到ISA卡。如果
数据的传送仅限于8位数据(8位ISA卡),则总线控制器自动将16位操作的高位数
据SD15~SD8接到SD7~SD0中,16位传送变为2次8位数据的传送。
由于ISA总线上可能连接的设备种类非常多,这些设备的读写速度可能有着很大的差别,所以ISA总线不可能规定其上的设备必须在几个时钟周期内完成读写操作,这就要求总线上必须有一组信号指明何时数据传送结束。在ISA总线中,I/O CHRDY和信号被用来实现这个作用:
●I/OCHRDY:ISA卡准备好信号,高电平有效,当ISA设备速度太慢,不能达到ISA正常的访问速度时,可以使I/OCHRDY无效来插入等待周期,直到设备准备好。I/OCHRDY信号在总线控制器上自动提拉为高电平,因而能与ISA速度匹配的卡可以不必驱动这一信号,默认为已准备好。
●:无等待周期指示信号,低电平有效。ISA中每一种访问方式,(8位I/O,8位存储器,16位I/O,16位存储器)都有默认的完成周期数,这些周期实际上已插入了1~3个周期的等待状态。如果ISA设备足够快而不必插入等待周期,可发出信号,使插入的等待周期去除或者减少一些。
实际上,在大多数总线中,用来指明数据传送结束只需要一个信号就足够了。ISA总线中使用两个信号来实现这个功能完全是历史原因。早期的ISA总线上能够挂接的设备速度都很低,所以ISA总线在总线传送的过程中默认地插入了一定量的等待周期,并依靠I/OCHRDY信号来延长这种等待以适应更低速的设备。随着微机的不断发展,ISA总线上的设备速度也不断提高,默认插入的等待周期成为了一种浪费,于是B8位置上的保留信号被定义为,以取消或减少这些默认的等待周期,提高总线上数据传输的速度。总线上传输的数据有时会因为各种原因而发生错误,这时就需要总线提供一种用来反映这些传输错误的机制。在ISA总线中,信号被用来实现这项功能:
●I/OCHCK:ISA设备奇偶校验出错信号,低电平有效。当ISA设备中采用了奇偶校验方式来校验总线或设备内部逻辑的正确性,且在出现错误后需要通知系统,此时可发出信号。K信号在PC中连接到了CPU的非屏蔽中断信号线上,因而这一信号的产生要格外小心。
除此之外,ISA总线还定义了几个特殊的总线传送控制信号:
●:地址允许信号,用于指示CPU的信号线与总线脱开,以便执行DMA传送。此信号为高时有效,由DMA控制器控制地址、数据,读、写信号线。用于译码电路以区分是DMA控制器访问还是CPU访问。
●:CPU或DMA控制器请求高8位传送数据,即高字节有效。如访问16位的卡,则可通过SD15~SD8传送高8位数据,这时一次可进行16位数据的传送。为低电平有效。
●、:存储器和I/O访问时,如果CPU或DMA控制器要求16位宽度的数据传送(SBHE有效),而且ISA卡也能够实现16位传送,那么ISA卡发出相应的或有效信号(低电平),就可以确认16位传送方式,否则传送仅
能以8位方式进行。
这些总线信号依照一定的时间顺序(即时序)出现,从而实现在总线上传送数据的功能。ISA总线实质上脱胎于8086/80286 CPU的外部总线,其总线时序也和8086/80286 CPU外部总线的时序相仿。下面我们分几种不同的情况来介绍ISA总线上的时序。
●标准8位存储器访问(见图7-27)
图7-27 ISA总线标准8位存储器读时序
如图7-27所示,时序图中按BCLK上升和下降沿顺序分为T0.0 T0.1…T0.A T0.B共12个沿,6个BCLK周期(总线周期)。ISA在T0.1产生BALE,在此之前,LA23~LA17已产生,在T0.2处用BALE下降沿锁存地址,SA19~SA0有效。若此时访问的是8位ISA卡或是仅支持8位存储器操作的16位ISA卡,不会产生信号,即T0.2保持为高,此时就确认为8位操作。此后T0.3时发出R或W信号,如果是写数据操作,在此之前控制器已把要写的数据放在数据线的低8位SD7~SD0上。经过几个周期后(由控制器自动插入了等待周期),在T0.A采样I/OCHRDY,如有效则在本周期末端(T0.B以后)完成本次操作。在T1.0(下一个周期开始)撤销R或W,读数据时采样数据,写数据时把数据移走,总线开始下一个周期T1.0、T1.1……。由上述时序时间可以看出,对于最简单的ISA卡,如它不对类似于、NI/OCHRDY等总线应答信号进行处理(设计中不连上这些信号线),那么它就会以标准的周期方式完成总线操作。如上述的8位存储器操作是标准的6个BCLK周期。如果6位BCLK仍不能满足ISA卡的慢速设备的时间要求,则可通过I/OCHRDY继续插入等待周期,一直等到最后I/OCHRDY有效才完成操作。
●快速8位存储器访问(见图7-28)
图7-28 ISA总线快速8位存储器读时序
与标准8位访问不同的是,在周期的T0.5控制器要采样信号时,如发现ISA卡产生了信号,那么控制器会在紧接着的T0.6时期结束本周期操作(即变T0.6为T1.0)。这样快速8位存储器访问最快可在3个BCLK内完成。如需要实现4或5个BCLK周期的8位存储器访问,可相应推迟1或2个BCLK周期再产生信号即可。注意:ISA总线规范规定,若产生了信号,则不允许再出现I/OCHRDY无效的情况,否则会出现不可预知的状态。因而ISA卡设计时不能同时产生NS和I/OCHRDY来控制总线周期长度。
●标准16位存储器访问(见图7-29)
图7-29 ISA总线标准16位存储器读时序
如果ISA卡能对SBHE进行分析,并对作出响应,则可在ISA总线上实现16位存储器访问。ISA总线控制器在T0.2对进行采样,如ISA卡允许进行16位存储器操作,则它必须在T0.2前拉低M信号作为响应,那么控制器就会提前在T0.2发出存储器访问信号(SR等)而不是8位操作时的T0.3。ISA卡可根据SBHE和SA0决定对哪个8位(SD15~SD8或SD7~SD0)数据操作。由于信号要求较早,用SA19~SA0不足以产生这个信号,因而必须用LA23~LA17来译码产生MEMCS16信号。总线在T0.4采样I/OCHRDY决定是否插入等待周期,然后在下一个BCLK结束即可结束访问。这种标准16位存储器访问可在3个BCLK内完成,当然也可以用I/OCHRDY来插入等待周期。
16位存储器访问并不意味着非要进行16位数据传送,实际上这种方式也允许进行8位数据传送,只要对及SA0正确判定,即可得到所需正确的8位数据线上的数据。这样可通过实现比8位ISA卡更快的数据传送。
●快速16位存储器访问(见图7-30)
图7-30 ISA总线快速16位存储器读时序
与8位存储器访问类似,16位存储器访问可采样NOWS信号,使访问周期最短达到2个BCLK。从图7-30中可以看到,当在T0.2采样到来以后,在T0.3时控制器再采样NOWS信号,如有效则在T0.4就结束访问周期,此时存储器访问信号)等仅有一个BCLK的宽度了。
●标准16位I/O访问(见图7-31)
图7-31 ISA总线标准16位I/O访问时序
I/O访问时序与存储器访问的主要区别在于,I/O访问发出IOR或IOW信号而非SMEMR等信号,另外I/O仅用到16位地址线,即SA15~SA0,而且I/O操作还要用到AEN信号。由于不能提前判断I/O操作类型,6是在或有效以后的T0.5才采样。标准I/O访问为3个BCLK周期。同样,I/O操作也可通过I/OCHRDY信号插入等待周期。
与存储器访问类似,I/O访问也可以分为16位和8位操作,标准8位操作为6个BCLK周期。如ISA卡产生信号,也可以使I/O访问周期变短,这里就不对其他的情况一一列举了。
从前面的叙述可以看出,ISA总线中很多信号的功能上是重叠的,比如和、之间,I/OCHRDY和之间,在功能上都有所重叠。这也从另外一个侧面说明ISA总线实际上是一种未经良好设计的总线。实际上,ISA总线是一种效率比较低的总线,一方面,ISA总线的总线时钟的频率只有8 MHz,这就严重地限制了总线的传输能力,另一方面,ISA总线一个总线周期只能传输一组数据(8位或16位),这也使得总线的传输开销比较大、效率比较低。这些弱点在PCI总线中都得到了改善。
需要说明的是,由于PCI总线规范中将“能够提供总线控制信号控制总线运行的PCI设备”定义为“PCI主设备”,将“不能提供总线控制信号控制总线运行的PCI设备”定义为“PCI从设备”。为了避免概念上的混淆,在PCI总线传输过程中启动并控制一次总线传输过程的PCI设备被称作“启动方”或“启动设备”,而根据启动方给出的目标地址被选中的参与总线传送的另一方被称作“目标设备”。为了方便起见,有时我们也将“启动方”称作“主设备”而将“目标设备”称作“从设备”,并不将这几个概念进行严格的区分。
PCI总线的接口信号如图7-32所示。
图7-32 PCI总线接口信号
PCI总线是一种半同步的局部总线,绝大多数信号的有效或无效都是由主时钟CLK的上升沿采样来取得,不以信号线的变化为处理条件。因此,PCI总线中的系统信号主要指的就是PCI时钟和复位信号。
●CLK:PCI系统时钟信号。PCI总线上的所有操作都是与PCI时钟信号同步的,系统在CLK的上升沿采样PCI上设备的所有输入信号。时钟信号的频率范围是0 MHz~33 MHz,或33.33 MHz~66.66 MHz。而66 MHz时钟仅支持3.3 V的信号环境。时钟仅在节省电源状态下才会停止。
●RST:复位信号。当复位信号有效时,将所有PCI专用的寄存器、定时器和信号复位到指定状态。一般情况下,全部输出信号处于高阻状态。
吸取了ISA总线设计中的教训,PCI总线在设计过程中大量使用了复用技术,从而使得PCI总线可以使用更少的引脚实现和ISA总线相同的功能,省出更多的引脚来实现各种附加功能,但是这种设计也增加了PCI设备和PCI总线控制器设计的难度。在PCI总线中,被复用的主要信号包括地址/数据信号和命令/字节使能信号。
●AD31~AD0:地址/数据信号,用于传输32位的总线地址和数据。由于PCI总线将一个总线周期分成了地址段和数据段,地址与数据信号不会同时出现在总线上,所以地址和数据信号可以共用同一组引脚,在地址段,地址信号出现在这些引脚上,而数据段中这些引脚被传送的数据所占据。
●AD63~AD32:64位扩展地址数据/信号,同AD31~AD0,用于传递64位PCI总线中的高32位地址与数据。(www.xing528.com)
●:命令/字节使能信号,在地址段传送总线命令,用来指明当前总线周期的总线操作类型。在数据段用来传送字节使能信号,用以表示32位数据总线上哪些字节被使能(即允许传送数据信号),其中用来使能AD7~0,BE1用来使能AD15~8,用来使能AD23~16,BE3用来使能AD31~24。
●C/BE7~4:64位扩展命令/字节使能信号,用于对AD63~32上传输的高32位数据进行使能,其使能分配与BE3~0相同。
在存储地址空间和I/O地址空间之外,PCI总线还定义了独立的“配置地址空间”,用于实现PCI的自动配置(PnP)能力。为了使用尽可能少的信号引脚表示针对这三个不同的地址空间的不同总线操作,PCI总线没有使用ISA那样的互斥的多个信号来表示不同的总线操作命令,而是将总线操作编码为4位的总线命令通过C/BE3~0引脚在总线周期的地址段传送,从而达到节省信号引脚、改善总线的扩展性等目的。由于PCI将一次总线传送操作称为一次“总线交易”,所以PCI的总线操作命令又叫做PCI总线交易命令。表7-1即为PCI规范中定义的总线交易命令。
表7-1 PCI总线操作命令
按照PCI规范的规定,除了PCI桥之外的所有PCI设备必须支持配置读和配置写总线交易,其他的总线交易可以视为可选项而选择性地予以支持。由于存储器空间、I/O空间和配置空间的不同特性,在这三个不同的地址空间上的总线编址方法也有所不同。对于I/O空间,目标地址为字节地址,其全部32位地址都要参与译码,并由字节使能信号说明此次传送数据的宽度。字节使能信号和字节地址之间必须保持一致,图7-33列出了所有允许的AD[1:0]和BE[3:0]的组合。
图7-33 I/O空间操作的字节允许与地址低位的有效组合
注:x代表可以为0或1,如果BE[3:0]为1111,则AD[1:0]可以为任意取值
对于存储器空间和配置空间,目标地址为双字地址,即所有的数据传送都以双字为单位进行,32位目标地址中的低2位不参与地址译码,而被用于指示数据传输的次序。和ISA总线每个总线周期只能进行一次数据传输不同,PCI总线可以在一个总线周期中传送多组数据,这种传输方式被称作猝发传输(Burst transfer,也译作突发传输)。PCI可以在其所有的三个地址空间中使用猝发传输,但一般情况下大部分设备不支持I/O读写的猝发传输,所以PCI猝发传输主要出现在对存储器空间和配置空间的读写,尤其是对存储器空间的读写上。在猝发读写时,一个总线周期有一个地址段和2n个(一般是4个)数据段组成,每个数据段传输一组数据。由于在一个总线周期中只有一个地址段,只能传送一次目标地址,那么猝发传输时被传输的多个数据的地址就必须由这个目标地址按照一定原则推算得到,这个推算的原则由AD[1:0]这两个不参加译码的地址信号给出(见图7-34)。
图7-34 猝发传输次序代码
在线性增加模式下,每个数据段后,地址增加一个双字(即加4,在32位传输时)或增加两个双字(即加8,在64位传输时),直到传输结束。对于Cache行回卷(wrap)模式,传输可从Cache中任意地址偏移处开始(Cache块的长度是由配置空间中的Cache块大小寄存器定义的),访问过程中每次地址增加一个双字(64位传输中地址增加两个双字),一直到Cache块的末尾,然后回卷到同一Cache块的开始处,再进行到Cache块的剩余部分被传送完为止。
与ISA类似,PCI也提供了用于验证AD31~0和C/信号正确性的奇偶校验信号,以及用于通知总线错误的一组错误报告信号。
●PAR:双向、三态奇偶校验信号,分别被主设备和从设备驱动。由于PCI并不支持重传操作,所以奇偶校验信号可以在被校验的信号(AD31~0和C/)之后的一个周期有效,以提供奇偶校验以及错误报告能力。
●PAR64:用于64位扩展的奇偶校验信号,用于对AD63~32和C/提供奇偶校验能力,和PAR相仿,该信号比被校验的信号晚一个周期。
●:校验错信号,从设备上为输出,在主设备上为输入和输出信号。信号用于在上述奇偶校验出现错误的时候置为有效,从而报告总线上出现的奇偶校验错误。
●SERR:系统错信号,输出,漏极开路,该信号在同一时间内可由多个PCI代理驱动。在产生地址奇偶校验错、专用周期数据奇偶校验错及其他严重错误时,PCI设备可以驱动系统错误信号有效,被看做向系统报告严重错误的最后求助途径。通常在置为有效时,引起NMI中断。
除了这些信号之外,PCI规范还定义了一系列用于控制总线交易过程的信号。和ISA总线不同,这些信号属于独立的通用信号,和X86系列微处理器的控制信号没有任何相似之处。这些信号包括:
●:总线周期确认帧信号,由PCI主设备驱动,该信号的负向跳变代表总线交易的开始,FRAME信号有效的持续时间表示交易的持续时间。
●:设备选择信号,由PCI目标设备驱动。当目标设备对主设备发出的地址进行译码并且地址命中时,该设备通过使本信号有效,并保持到总线交易结束,向主设备响应本次总线交易。如果一个主设备启动一次总线交易后6个CLK内没有有效的信号出现,则代表目标设备不能响应或不存在,本次总线交易将被取消。
●IRDY:主设备(启动方)准备好信号,由PCI交易的启动方发出,表示主设备已经准备好与当前寻址目标进行数据传送。
●:目标设备(从设备)准备好信号,由PCI交易的目标设备发出,表示目标设备已经准备好与本次PCI交易的启动方进行数据传送。在CLK的上升沿,如果IRDY和TY同时处于有效状态时,代表一次数据传送的完成。如果和中有一个处于无效状态,则代表此次数据传送尚未完成,需要插入一个额外的等待周期。
●:交易中止信号,当目标设备需要终止当前的PCI总线交易时,通过此信号通知总线主设备停止当前的PCI总线交易。
在PCI总线中,这些信号用于控制整个PCI总线交易过程(见图7-35)。
PCI总线交易可以分为地址段和数据段,根据PCI总线规范的规定,一次总线交易由一个地址段和一个或多个数据段组成。
(1)地址段
PCI总线交易的开始是以有效的信号出现开始的。当总线上信号和IRDY信号都处于高电平(即无效)状态时,说明PCI总线处于空闲状态。此时,PCI主设备可以拉低信号以标志一次总线交易开始。与此同时,它还要将有效的地址送到AD31~0(对于64位PCI总线,应该是AD63~0)上,同时总线命令也将出现在C/BE引脚。总线上的其他设备在检测到信号发生负跳变(即在CLK1为高电平而CLK2为低电平)时,将对AD信号线上出现的地址和C/BE信号线上出现的总线命令进行译码,并判断自身是否是此次总线交易的目标设备。如果一个设备确认其为目标设备,则以有效的D信号回应总线交易的发起方,从而确认一次总线交易。在PCI总线上,每个设备占用的地址空间是不会重叠的,所以总线交易过程中不会出现多个目标设备被同时选中的情况。由于在这段时间内出现在AD引脚上的是目标地址,所以总线周期的这个阶段被称作“地址段”。
图7-35 PCI总线交易时序
根据PCI总线规范的规定,PCI总线从设备必须在3个时钟周期内以有效的信号响应总线交易请求,如果一个PCI总线从设备可以在1个时钟周期内响应,被称为“快速”。如果响应需要2个时钟周期,则称作“中速DEVSEL”。需要注意的是,无论有没有DEVSEL信号响应,AD引脚上的目标地址和C/BE引脚上的总线命令都只能延续一个时钟周期,因此PCI设备必须在检测到FE信号发生负跳变的第一个时钟周期内将地址和总线命令加以锁存。
如果在三个时钟周期内总线上没有有效的L信号出现,就意味着没有PCI设备能够响应这次总线交易,PCI总线上的桥接设备将在第5个时钟周期(即间隔4个时钟周期)把这个总线交易请求桥接到其他总线(如ISA)上并以有效的DEVSEL信号加以响应。当PCI总线上挂接的PCI设备都是快速L或中速的时候,这个桥接动作可能会来得更早些。一旦总线交易的启动方在6个时钟周期内没能采样到有效的L信号,则认为目标设备不存在或无法响应,此次总线交易将被撤销。
PCI规范还提供了一种在32位PCI总线上使用超过32位目标地址的方法,那就是双地址总线交易。双地址总线交易通过在AD31~0引脚上分两次传递64位地址的方法来扩展地址空间。在使用双地址总线交易的时候,总线主设备必须在FRAME信号有效的第一个时钟周期里将地址的低32位和“双地址周期”总线交易命令(1101)分别送到PCI总线的AD31~0和C/上,然后在下一个时钟周期里将高32位地址和需要执行的总线交易命令(如存储器读/写)分别送到PCI总线的AD31~0和C/引脚上。这时,总线周期的地址段将延长一个时钟周期。
(2)数据段
在信号出现之后,PCI总线交易的地址段随即结束,数据段开始。根据总线交易类型的不同,一次PCI总线交易可能会有一个或多个数据段,每个数据段完成一次数据的传输。在数据段,PCI总线的AD引脚上出现的是被传送的数据,当总线交易为写操作时,数据由总线主设备提供。当总线交易为读操作时,目标设备需要驱动AD引脚上的数据。完成一次数据的传输要求主设备和从设备都处于“准备好”的状态,PCI总线上,代表主设备准备好,Y表示从设备准备好,主、从双方都是根据和TY同时有效时的情况来确定数据已准备就绪和正常取走,以便进行下一个步骤。主设备和从设备都可通过自己的准备好信号来插入等待周期,如图7-35中的CLK-3、CLK-5和CLK-7时刻,其中CLK-7是主设备未准备好需等待,CLK-3和CLK-5是从设备未准备好需等待。PCI规范要求,一旦设备已准备好(或有效),则它必须保持有效直到本次数据操作完成。
如果一次PCI总线交易过程中参加数据传输的双方速度都足够快,那么和信号将在整个总线交易过程的所有数据段中保持有效,每个数据段都只持续一个时钟周期(见图7-36)。32位PCI总线一次可访问4个字节,如仅对4个字节中的某些字节进行操作,可用C/信号提示。在地址周期后,C/的4位就代表了32位操作中的哪个字节被访问。64位PCI总线也有类似的协议要求。C/是由主设备发出的,因而要求在主设备的IRDY有效时,C/也应处于有效状态,并保持到本次数据操作的结束。
图7-36 无等待周期的PCI总线交易时序(写)
如果一次总线交易使用猝发访问,那么这次总线交易应当具有多个数据段。在这些数据段中,第一个数据段所传输的数据地址由总线交易地址段中给出的目标地址所确定,其后的所有数据地址都是以这个首地址为起始按照某种固定的变化方式推算得出,具体的推算方法由地址线的最低2位所确定(见图7-34)。在猝发访问的最后一个数据段,主设备必须形成无效和Y为有效的状态,如图7-35的CLK-8,此时一旦有效,则完成本次PCI周期的最后一个数据操作,结束整个总线交易周期。
从设备除了对主设备做出响应外,还可以主动控制访问的进程,它可以用TRDY插入等待周期,还可以用P信号停止数据周期。P和及T的组合,形成了以下几种周期结束方式:
●访问数据断开(Disconnect With Data):表示访问完当前数据后断开,从设备提供(读)或接受(写)最后一个数据,就不再处理本次访问。
●不访问数据断开(Disconnect Without Data):要求主设备不处理当前数据就结束访问周期。
●从设备退出(Target Abort):表示从设备出现其他(非数据)问题而退出访问周期。通过,从设备可以通告主设备结束访问,而不至于发生错误。当然,主设备结束访问也应遵守无效、有效的信号要求。
为了节约总线带宽,PCI协议规定一个从设备不能长时间处于未准备好的等待状态(T无效),通常要求从设备已准备好(一批)数据后再申请(通过),即使发生等待,也不应超过16个CLK。主设备同样也不能长时间用IRDY等待,即使发生等待,也不应超过8个CLK,必要时用STOP(从设备)或FRAME、IRDY(主设备)停止总线访问。对于主设备占用总线的时限,在配置空间中有Latency Timer指出最大占用的CLK数量。当主设备占用的时间超过此数时(此数由总线控制器初始化时写入),主设备应在访问最后一个数据后释放总线,除非没有其他主设备申请总线(此时G会一直有效)。
(3)总线信号的转换
PCI总线绝大部分信号都是双向的,即对于某一周期或周期内某一时刻,它由一个设备驱动,而到另一个周期或周期内另一时刻则由另一个设备驱动。信号从一个设备驱动切换为另一个设备驱动时,需要有一个转换周期(Turn Around),图7-35中用表示。此时要求所有的设备都不能驱动该信号线。
在PCI总线上,如总线处于空闲状态时,所有的控制信号都不被各设备所驱动,为维持信号处于无效时的电平(如为高电平),不至于发生误操作,总线上通常有一个上拉电阻维持高电平(PCI总线的控制线都是低电平有效)。鉴于PCI总线的负载能力及高速要求,这些上拉电阻不可能做得太小,但大了又无法在驱动脱离后很快(1个周期内)经电阻拉高电平。为此,PCI总线规范规定在这些信号线变为三态之前(进入转换态之前)要被驱动为高电平,如图7-35中信号在进入CLK-8转换周期前,在CLK-7后把信号变高。这一要求对所有低电平有效的控制信号都有效(除外)。这样,在这些信号上仅用能维持高电平的大电阻即可,而不会对总线的速度有太大影响。
从信号定义和传输时序两个的角度来对比ISA总线和PCI总线,我们可以看出,ISA总线实质上是一种8086系列微处理器外部总线的简单扩充,其信号定义的冗余性大,传输时序不够灵活而且效率比较低。而PCI总线通过使用总线命令代替ISA中的一系列总线信号、分时复用地址线与数据线、提供猝发传输支持等改进,提供了一种完全处理器无关的总线规范,成功地提升了总线的传输速率并降低了总线的能耗,从而实现了总线的一次革命性的进步。
与从ISA到PCI的变化相比,从PCI到PCI Express的变化更加巨大。首先,PCI Express采用了与ISA/PCI不同的点到点连接和差分串行传输,差分串行传输带来的是更高的传输频率,而点到点连接带来的则是设备之间传输的并发化和聚合频宽的成倍提高。然后,PCI Express抛弃了PCI所使用的半同步定时机制,转而采用类似网络传输所使用的异步定时机制。最后,PCI Express不再依靠总线引脚信号来标识总线命令与响应,而是使用类似网络中常用的分层协议通过交换总线交易数据包来完成各种总线交易。
虽然PCI Express采用大量和PCI不同的技术和模式,但是PCI Express在软件层保持了和PCI总线的兼容性,从而使得PCI Express总线在软件操作上呈现出和PCI总线相同的特性,避免了总线变化带来的软件上的修改。
PCI Express总线使用网络协议常用的分层模型(见图7-37),定义了物理层、数据链路层、事务层、软件层(有时还将配置层单独独立出来)几个不同的层次,用来实现不同的功能。其中,物理层被用于定义物理信号和机械连接、实现通道的组合(将多个Lane组合为一个连接Link)、实现串并转换和8B/10B编解码等功能;数据链路层将物理层上传送字节流的基础上实现数据包的传送,包括数据包的封包与解封、正确性验证与控制等功能;事务层则依靠在端点(即PCI Express总线设备)之间交换预先定义好的各种不同类型数据包来完成各种总线交易,如存储器读、I/O写等。为了保证PCI Express与PCI总线在软件上的兼容性,这些总线交易在语义上和PCI的同名总线交易具有相同的功能解释,虽然它们的实现手段完全不同。
图7-37 PCI Express分层
PCI Express的物理层服务实现帧的传送,其主要内容包括引脚信号定义、信号驱动、串并转换、8B/10B编解码、通道组合、帧控制等。PCI Express使用串行全双工传输,每个方向上一次只传输一位数据,这位数据通过一个差分信号进行传输,因此,PCI Express总线中一个通道的数据信号线被定义为4条:2条用于发送数据的差分信号线和2条用于接收数据的差分信号线(见图7-38)。
图7-38 PCI Express物理层模型
对于只有一个数据通道的x1模式PCI Express总线,其信号定义如表7-2所示。
表7-2 PCI Express x1总线信号定义
从表7-2看出,PCI Express用于进行信号传输的主要就是两对差分信号引脚,其中没有地址线,也没有类似PCI中这样的控制信号,而是使用特定的帧头编码与帧尾编码(为了和实际数据的区分,帧头和帧尾编码使用8B/10B编码中的K码,这些K码不可能由普通的字节串编码得到)来确定一个数据帧的起止,这也跟PCI Express使用类似OSI的分层协议体系结构有关。
由于PCI Express并没有使用类似ISA或PCI的基于统一时钟的半同步定时机制,其时钟必须从差分数据信号中恢复,而这种恢复依赖于信号电平的跳变。所以,被传送的信号电平不能有长时间不变的高电平或低电平,以保证有足够频繁的电平跳变用于时钟信号的恢复。而被传送的原始数据是不可能满足这项要求的,这就使得对原始数据进行编码成为必然。PCI Express总线使用一种被称作8B/10B的编码方式来完成这项工作,这是一种将8个比特编码为10个比特的编码方式。经过8B/10B编码之后,在传输线路上所发送的比特流中不会出现连续的6个‘0’或者连续的6个‘1’(即连续的‘0’或‘1’不超过5个),从而保证时钟信号的恢复。
为了进一步提高PCI Express总线的传输率,PCI Express标准还规定了将多个通道捆绑为一个链路的方法(见图7-39)。一般来讲,一个链路可以由1、2、4、8、16或32个通道捆绑而成,每个通道包括分别用于发送和接收的两对差分信号,这些通道可以在物理层协议的控制下协同工作,将组成帧的字节流中不同字节通过不同的通道进行传送,从而达到更高的传输速率。
图7-39 多个通道上的并发传送
需要注意的是,PCI Express虽然允许捆绑多个通道以形成更高传输率的数据链路,但这种通道捆绑和PCI、ISA等总线上的并行传输是不一样的。在PCI、ISA等总线中,所有的数据位必须遵循相同的时序规定,由同一组时钟与控制信号所控制,并保持时相上的同步。在PCI Express总线中,通道虽然被捆绑在一起,但是各通道之间仍然保持独立运行,每个通道上的数据传送过程都是相互独立的,不存在统一的控制信号和时相同步要求,只是在PCI Express物理层协议的控制之下通过字节流的分解与组合来实现多个通道的协同工作。
既然PCI Express支持多种不同的通道组合方式,其总线插座也同样具有多种不同的规格。为了保证“短”的扩展卡可以插入“长”的插座中,PCI Express在总线插座的信号定义上使用了一种向下兼容的策略。以x16的PCI Express总线插座为例,其前36个信号线和x1的PCI Express总线插座完全相同,后面的128个信号引脚中包括用于传送通道1~通道15这15个通道差分信号的60个引脚和一系列的电源、地、保留引脚等,与前面的36个信号线共同组成x16的PCI Express总线插座的164个信号引脚。这样,x1和x16的扩展卡都可以插入到x16的总线插座中并正常工作,不仅如此,x4、x8的扩展卡同样可以插入到x16的总线插座中正常工作。
在物理层之上是数据链路层和交易层,这两层分别用来实现数据链路控制和交易控制的功能。
从图7-40可以看出,PCI Express各层上传送的数据包在格式上和网络中分层协议各层上传送的数据包如出一辙。每一层都在其上一层传递下来的数据基础上加上包头和可能存在的包尾,并通过对包头和包尾的处理与控制实现该层的一些功能。对于物理层,帧头和帧尾的加入使得连续的字节流能够被解释成为一个个的具有一定结构的数据帧。而对于数据链路层,包头和包尾的主要功能就是实现链路控制和错误控制。
图7-40 PCI Express各层及其上传送的数据包
PCI Express的数据链路层中使用ACK/NAK控制方式。每个数据链路层包都被赋予了一个循环使用,在可预见的时间内不会发生重复的序列号,并且在数据包的末尾加上一段循环冗余校验码,用于校验数据包传输的正确性。在一个数据包被交易层正确接收时,一个代表“成功接收”的ACK包将带着数据包的序列号被返回给这个数据包的发送者。在接收到的数据包被交易层判断发生CRC校验错的时候,一个代表“接收错误”的NAK包将带着数据包的序列号被返回给这个数据包的发送者。当数据包的发送者收到一个NAK包或者在等待ACK包时发生超时时,数据包的发送者就认为该数据包在传送过程中发生了错误,并通过重发该数据包实现错误控制的功能。ACK和NAK包使用数据链路层控制数据包DLLP(Data Link Layer Packet)来传递,这些DLLP数据包与交易层无关,只在数据链路层中实现流量控制等底层功能。同时,PCI Express的数据链路层使用基于信用的流量控制协议实现对流量的控制,保证接收方具有足够的缓冲来暂存接受到的数据。通过交换流控DLLP,链路双方传递可以用来接受数据的资源容量,以保证数据包只有在接收方能够正常接收的情况下才会被传送。
在数据链路层提供的传输功能基础之上,PCI Express的交易层负责实际控制PCI Ex-press设备之间的信息交换,这些信息交换是通过在数据链路层提供的链路基础上交换一系列的交易层数据包(Transcation Layer Packet——TLP)而实现的。PCI Express规范严格定义了交易层数据包的格式和功能,其中包括I/O读写、存储器读写、配置空间读写等9种请求数据包和带数据响应、不带数据响应等4种响应数据包。PCI Express不同的请求数据包代表了不同的总线交易请求,这些总线交易请求和PCI总线的总线交易命令基本上可以对应,从而保证PCI Express总线在软件上与PCI总线的兼容性。
PCI Express总线交易都是通过交换这些TLP完成的。以I/O读为例,启动方设备通过发送一个I/O读的TLP请求数据包来发起一次总线交易请求,当从设备收到这个交易请求时,从设备将完成I/O读的操作,并将读到的结果包装成为一个带数据的响应包返回给启动方。如果I/O读无法完成,从设备将通过一个不带数据的响应包来响应启动方,告知I/O读操作无法完成。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。