大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
最近有很多大侠在交流群里讨论PCI总线,PCI作为高速接口之一,在当下的FPGA产品设计研发中,地位举足轻重,应用广泛,今天给大侠带来PCI Express 系列连载,今天带来第二篇,PCI总线的基本知识,包括PCI总线的组成结构以及PCI总线的信号定义。希望对各位大侠的学习有参考价值,话不多说,上货。
PCI总线的基本知识
PCI总线作为处理器系统的局部总线,主要目的是为了连接外部设备,而不是作为处理器的系统总线连接Cache和主存储器。但是PCI总线、系统总线和处理器体系结构之间依然存在着紧密的联系。PCI总线作为系统总线的延伸,其设计考虑了许多与处理器相关的内容,如处理器的Cache共享一致性和数据完整性,以及如何与处理器进行数据交换等一系列内容。其中Cache共享一致性和数据完整性是现代处理器局部总线的设计的重点和难点。
独立的研究PCI总线并不可取,因为PCI总线仅是处理器系统的一个组成部分。深入理解PCI总线需要了解一些与处理器体系结构相关的知识。这些知识是所需要侧重描述的,同时也是PCI总线规范所忽略的内容。脱离实际的处理器系统,不容易也不可能深入理解PCI总线规范。
对于今天的研发设计以及学习者来说,PCI总线提出的许多概念略显过时,也有许多不足之处。但是在当年,PCI总线与之前的存在其他并行局部总线如ISA、EISA和MCA总线相比,具有许多突出的优点,是一个全新的设计。
(1) PCI总线空间与处理器空间隔离
PCI设备具有独立的地址空间,即PCI总线地址空间,该空间与存储器地址空间通过HOST主桥隔离。处理器需要通过HOST主桥才能访问PCI设备,而PCI设备需要通过HOST主桥才能存储。在HOST主桥中含有许多缓冲,这些缓冲使得处理器总线与PCI总线工作在各自的时钟频率中,彼此互不干扰。HOST主桥的存在也使得PCI设备和处理器可以方便地共享主存储器资源。
处理器访问PCI设备时,必须通过HOST主桥进行地址转换;而PCI设备访问主存储器时,也需要通过HOST主桥进行地址转换。HOST主桥的一个重要作用就是将处理器访问的存储器地址转换为PCI总线地址。PCI设备使用的地址空间是属于PCI总线域的,而与存储器地址空间不同。
x86处理器对PCI总线域与存储器域的划分并不明晰,这也使得许多程序员并没有准确地区分PCI总线域地址空间与存储器域地址空间。而本书将反复强调存储器地址和PCI总线地址的区别,因为这是理解PCI体系结构的重要内容。
PCI规范并没有对HOST主桥的设计进行约束。每一个处理器厂商使用的HOST主桥,其设计都不尽相同。HOST主桥是联系PCI总线与处理器的核心部件,掌握HOST主桥的实现机制是深入理解PCI体系结构的前提。
此次连载篇将以Freescale的PowerPC处理器和Intel的x86处理器为例,说明各自HOST主桥的实现方式,值得注意的是涉及的PowerPC处理器仅针对Freescale的PowerPC处理器,而不包含IBM和AMCC的Power和PowerPC处理器。而且如果没有特别说明,涉及的x86处理器特指Intel的处理器,而不是其他厂商的x86处理器。
(2) 可扩展性
PCI总线具有很强的扩展性。在PCI总线中,HOST主桥可以直接推出一条PCI总线,这条总线也是该HOST主桥的所管理的第一条PCI总线,该总线还可以通过PCI桥扩展出一系列PCI总线,并以HOST主桥为根节点,形成1颗PCI总线树。这些PCI总线都可以连接PCI设备,但是在1颗PCI总线树上,最多只能外挂接256个PCI设备(包括PCI桥)。在同一条PCI总线上的设备间可以直接通信,并不会影响其他PCI总线上设备间的数据通信。隶属于同一颗PCI总线树上的PCI设备,也可以直接通信,但是需要通过PCI桥进行数据转发。
PCI桥是PCI总线的一个重要组成部件,该部件的存在使得PCI总线极具扩展性。PCI桥也是有别于其他局部总线的一个重要部件。在“以HOST主桥为根节点”的PCI总线树中,每一个PCI桥下也可以连接一个PCI总线子树,PCI桥下的PCI总线仍然可以使用PCI桥继续进行总线扩展。
PCI桥可以管理这个PCI总线子树,PCI桥的配置空间含有一系列管理PCI总线子树的配置寄存器。在PCI桥的两端,分别连接了两条总线,分别是上游总线(Primary Bus)和下游总线(Secondary Bus)。其中与处理器距离较近的总线被称为上游总线,另一条被称为下游总线。这两条总线间的通信需要通过PCI桥进行。PCI桥中的许多概念被PCIe总线采纳,理解PCI桥也是理解PCIe体系结构的基础。
(3) 动态配置机制
PCI设备使用的地址可以根据需要由系统软件动态分配。PCI总线使用这种方式合理地解决了设备间的地址冲突,从而实现了“即插即用”功能。从而PCI总线不需要使用ISA或者EISA接口卡为解决地址冲突而使用的硬件跳线。
每一个PCI设备都有独立的配置空间,在配置空间中含有该设备在PCI总线中使用的基地址,系统软件可以动态配置这个基地址,从而保证每一个PCI设备使用的物理地址并不相同。PCI桥的配置空间中含有其下PCI子树所能使用的地址范围。
(4) 总线带宽
PCI总线与之前的局部总线相比,极大提高了数据传送带宽,32位/33MHz的PCI总线可以提供132MB/s的峰值带宽,而64位/66MHz的PCI总线可以提供的峰值带宽为532MB/s。虽然PCI总线所能提供的峰值带宽远不能和PCIe总线相比,但是与之前的局部总线ISA、EISA和MCA总线相比,仍然具有较大的优势。
ISA总线的最高主频为8MHz,位宽为16,其峰值带宽为16MB/s;EISA总线的最高主频为8.33MHz,位宽为32,其峰值带宽为33MB/s;而MCA总线的最高主频为10MHz,最高位宽为32,其峰值带宽为40MB/s。PCI总线提供的峰值带宽远高于这些总线。
(5) 共享总线机制
PCI设备通过仲裁获得PCI总线的使用权后,才能进行数据传送,在PCI总线上进行数据传送,并不需要处理器进行干预。
PCI总线仲裁器不在PCI总线规范定义的范围内,也不一定是HOST主桥和PCI桥的一部分。虽然绝大多数HOST主桥和PCI桥都包含PCI总线仲裁器,但是在某些处理器系统的设计中也可以使用独立的PCI总线仲裁器。如在PowerPC处理器的HOST主桥中含有PCI总线仲裁器,但是用户可以关闭这个总线仲裁器,而使用独立的PCI总线仲裁器。
PCI设备使用共享总线方式进行数据传递,在同一条总线上,所有PCI设备共享同一总线带宽,这将极大地影响PCI总线的利用率。这种机制显然不如PCIe总线采用的交换结构,但是在PCI总线盛行的年代,半导体的工艺、设计能力和制作成本决定了采用共享总线方式是当时的最优选择。
(6) 中断机制
PCI总线上的设备可以通过四根中断请求信号INTA~D#向处理器提交中断请求。与ISA总线上的设备不同,PCI总线上的设备可以共享这些中断请求信号,不同的PCI设备可以将这些中断请求信号“线与”后,与中断控制器的中断请求引脚连接。PCI设备的配置空间记录了该设备使用这四根中断请求信号的信息。
PCI总线进一步提出了MSI(Message Signal Interrupt)机制,该机制使用存储器写总线事务传递中断请求,并可以使用x86处理器FSB(Front Side Bus)总线提供的Interrupt Message总线事务,从而提高了PCI设备的中断请求效率。
虽然从现代总线技术的角度上看,PCI总线仍有许多不足之处,但也不能否认PCI总线已经获得了巨大的成功,不仅x86处理器将PCI总线作为标准的局部总线连接各类外部设备,PowerPC、MIPS和ARM[1]处理器也将PCI总线作为标准局部总线。除此之外,基于PCI总线的外部设备,如以太网控制器、声卡、硬盘控制器等,也已经成为主流。
在ARM处理器中,使用SoC平台总线,即AMBA总线,连接片内设备。但是某些ARM生产厂商,依然使用AMBA-to-PCI桥推出PCI总线,以连接PCI设备。
PCI总线的组成结构
如上文所述,PCI总线作为处理器系统的局部总线,是处理器系统的一个组成部件,讲述PCI总线的组成结构不能离开处理器系统这个大环境。在一个处理器系统中,与PCI总线相关的模块如下图所示:
如图1-1所示在一个处理器系统中,与PCI总线相关的模块包括,HOST主桥、PCI总线、PCI桥和PCI设备。PCI总线由HOST主桥和PCI桥推出,HOST主桥与主存储器控制器在同一级总线上,PCI设备可以方便地通过HOST主桥访问主存储器,即进行DMA操作。值得注意的是,PCI设备的DMA操作需要与处理器系统的Cache进行一致性操作,当PCI设备通过HOST主桥访问主存储器时,Cache一致性模块将进行地址监听,并根据监听的结果改变Cache的状态。
在一些简单的处理器系统中,可能不含有PCI桥,此时所有PCI设备都是连接在HOST主桥推出的PCI总线上,此外在一些处理器系统中可能含有多个HOST主桥,如在图1-1所示的处理器系统中含有HOST主桥x和HOST主桥Y。
HOST主桥
HOST主桥是一个很特别的桥片,其主要功能是隔离处理器系统的存储器域与处理器系统的PCI总线域,管理PCI总线域,并完成处理器与PCI设备间的数据交换。处理器与PCI设备间的数据交换主要由“处理器访问PCI设备的地址空间”和“PCI设备使用DMA机制访问主存储器”这两部分组成。
为简便起见,下文将处理器系统的存储器域简称为存储器域,而将处理器系统的PCI总线域称为PCI总线域,存储器域和PCI总线域的详细介绍见第2.1节。值得注意的是,在一个处理器系统中,有几个HOST主桥,就有几个PCI总线域。
HOST主桥在处理器系统中的位置并不相同,如PowerPC处理器将HOST主桥与处理器集成在一个芯片中。而有些处理器不进行这种集成,如x86处理器使用南北桥结构,处理器内核在一个芯片中,而HOST主桥在北桥中。但是从处理器体系结构的角度上看,这些集成方式并不重要。
PCI设备通过HOST主桥访问主存储器时,需要与处理器的Cache进行一致性操作,因此在设计HOST主桥时需要重点考虑Cache一致性操作。在HOST主桥中,还含有许多数据缓冲,以支持PCI总线的预读机制。
HOST主桥是联系处理器与PCI设备的桥梁。在一个处理器系统中,每一个HOST主桥都管理了一颗PCI总线树,在同一颗PCI总线树上的所有PCI设备属于同一个PCI总线域。如图1-1所示,HOST主桥x之下的PCI设备属于PCI总线x域,而HOST主桥y之下的PCI设备属于PCI总线y域。在这颗总线树上的所有PCI设备的配置空间都由HOST主桥通过配置读写总线周期访问。
如果HOST主桥支持PCI V3.0规范的Peer-to-Peer数据传送方式,那么分属不同PCI总线域的PCI设备可以直接进行数据交换。如图1-1所示,如果HOST主桥y支持Peer-to-Peer数据传送方式,PCI设备y01可以直接访问PCI设备01或者PCI设备11,而不需要通过处理器的参与。但是这种跨越总线域的数据传送方式在PC架构中并不常用,在PC架构中,重点考虑的是PCI设备与主存储器之间的数据交换,而不是PCI设备之间的数据交换。此外在PC架构中,具有两个HOST主桥的处理器系统也并不多见。
在PowerPC处理器中,HOST主桥可以通过设置Inbound寄存器,使得分属于不同PCI总线域的设备可以直接通信。许多PowerPC处理器都具有多个HOST主桥,有关PowerPC处理器使用的HOST主桥详见后面介绍。
PCI总线
在处理器系统中,含有PCI总线和PCI总线树这两个概念。这两个概念并不相同,在一颗PCI总线树中可能具有多条PCI总线,而具有血缘关系的PCI总线组成一颗PCI总线树。如在图1-1所示的处理器系统中,PCI总线x树具有两条PCI总线,分别为PCI总线x0和PCI总线x1。而PCI总线y树中仅有一条PCI总线。
PCI总线由HOST主桥或者PCI桥管理,用来连接各类设备,如声卡、网卡和IDE接口卡等。在一个处理器系统中,可以通过PCI桥扩展PCI总线,并形成具有血缘关系的多级PCI总线,从而形成PCI总线树型结构。在处理器系统中有几个HOST主桥,就有几颗这样的PCI总线树,而每一颗PCI总线树都与一个PCI总线域对应。
与HOST主桥直接连接的PCI总线通常被命名为PCI总线0。考虑到在一个处理器系统中可能有多个主桥,图1-1将HOST主桥x推出的PCI总线命名为x0总线,而将PCI桥x1扩展出的PCI总线称之为x1总线;而将HOST主桥y推出的PCI总线称为y0~yn。分属不同PCI总线树的设备,其使用的PCI总线地址空间分属于不同的PCI总线域空间。
PCI设备
在PCI总线中有三类设备,PCI主设备、PCI从设备和桥设备。其中PCI从设备只能被动地接收来自HOST主桥,或者其他PCI设备的读写请求;而PCI主设备可以通过总线仲裁获得PCI总线的使用权,主动地向其他PCI设备或者主存储器发起存储器读写请求。桥设备的主要作用是管理下游的PCI总线,并转发上下游总线之间的总线事务。
一个PCI设备可以即是主设备也是从设备,但是在同一个时刻,这个PCI设备或者为主设备或者为从设备。PCI总线规范将PCI主从设备统称为PCI Agent设备。在处理器系统中常见的PCI网卡、显卡、声卡等设备都属于PCI Agent设备。
在PCI总线中,HOST主桥是一个特殊的PCI设备,该设备可以获取PCI总线的控制权访问PCI设备,也可以被PCI设备访问。但是HOST主桥并不是PCI设备。PCI规范也没有规定如何设计HOST主桥。
在PCI总线中,还有一类特殊的设备,即桥设备。桥设备包括PCI桥、PCI-to-(E)ISA桥和PCI-to-Cardbus桥。本篇重点介绍PCI桥,而不关心其他桥设备的实现原理。PCI桥的存在使PCI总线极具扩展性,处理器系统可以使用PCI桥进一步扩展PCI总线。
PCI桥的出现使得采用PCI总线进行大规模系统互连成为可能。但是在目前已经实现的大规模处理器系统中,并没有使用PCI总线进行处理器系统与处理器系统之间的大规模互连。因为PCI总线是一个以HOST主桥为根的树型结构,使用主从架构,因而不易实现多处理器系统间的对等互连。
即便如此PCI桥仍然是PCI总线规范的精华所在,掌握PCI桥是深入理解PCI体系结构的基础。PCI桥可以连接两条PCI总线,上游PCI总线和下游PCI总线,这两个PCI总线属于同一个PCI总线域,使用PCI桥扩展的所有PCI总线都同属于一个PCI总线域。
其中对PCI设备配置空间的访问可以从上游总线转发到下游总线,而数据传送可以双方向进行。在PCI总线中,还存在一种非透明PCI桥,该桥片不是PCI总线规范定义的标准桥片,但是适用于某些特殊应用,本篇将在第2.5节中详细介绍这种桥片。在本书中,如不特别强调,PCI桥是指透明桥,透明桥也是PCI总线规范定义的标准桥片。
PCI-to-(E)ISA桥和PCI-to-Cardbus桥的主要作用是通过PCI总线扩展(E)ISA和Cardbus总线。在PCI总线推出之后,(E)ISA总线并没有在处理器系统中立即消失,此时需要使用PCI-(E)ISA桥扩展(E)ISA总线,而使用PCI-to-Cardbus桥用来扩展Cardbus总线,本篇并不关心(E)ISA和Cardbus总线的设计与实现。
HOST处理器
PCI总线规定在同一时刻内,在一颗PCI总线树上有且只有一个HOST处理器。这个HOST处理器可以通过HOST主桥,发起PCI总线的配置请求总线事务,并对PCI总线上的设备和桥片进行配置。
在PCI总线中,HOST处理器是一个较为模糊的概念。在SMP(symmetric multiprocessing)处理器系统中,所有CPU都可以通过HOST主桥访问其下的PCI总线树,这些CPU都可以作为HOST处理器。但是值得注意的是,HOST主桥才是PCI总线树的实际管理者,而不是HOST处理器。
在HOST主桥中,设置了许多寄存器,HOST处理器通过操作这些寄存器管理这些PCI设备。如在x86处理器的HOST主桥中设置了0xCF8和0xCFC这两个I/O端口访问PCI设备的配置空间,而PowerPC处理器的HOST主桥设置了CFG_ADDR和CFG_DATA寄存器访问PCI设备的配置空间。值得注意的是,在PowerPC处理器中并没有I/O端口,因此使用存储器映像寻址方式访问外部设备的寄存器空间。
PCI总线的负载
PCI总线的所能挂接的负载与总线频率相关,其中总线频率越高,所能挂接的负载越少。下文以 PCI总线和PCI-X总线为例说明总线频率、峰值带宽和负载能力之间的关系,如表1-1所示。
表1-1 PCI总线频率、带宽与负载之间的关系
由表1-1所示,PCI总线频率越高,所能挂接的负载越少,但是整条总线所能提供的带宽越大。值得注意的是,PCI-X总线与PCI总线的传送协议略有不同,因此66MHz的PCI-X总线的负载数较大,PCI-X总线的详细说明见第1.5节。当PCI-X总线频率为266MHz和533MHz时,该总线只能挂接一个PCI-X插槽。在PCI总线中,一个插槽相当于两个负载,接插件和插卡各算为一个负载,在表1-1中,33MHz的PCI总线可以挂接4~5个插槽,相当于直接挂接8~10个负载。
PCI总线的信号定义
PCI总线是一条共享总线,在一条PCI总线上可以挂接多个PCI设备。这些PCI设备通过一系列信号与PCI总线相连,这些信号由地址/数据信号、控制信号、仲裁信号、中断信号等多种信号组成。
PCI总线是一个同步总线,每一个设备都具有一个CLK信号,其发送设备与接收设备使用这个CLK信号进行同步数据传递。PCI总线可以使用33MHz或者66MHz的时钟频率,而PCI-X总线可以使用133MHz、266MHz或者533MHz的时钟频率。
除了RST#、INTA~D#、PME#和CLKRUN#等信号之外,PCI设备使用的绝大多数信号需要与CLK信号同步。其中RST#是复位信号,PCI设备使用INTA~D#信号进行中断请求。本篇并不关心PME#和CLKRUN#信号。
地址和数据信号
在PCI总线中,与地址和数据相关的信号如下所示。
(1) AD[31:0]信号
PCI总线复用地址与数据信号。PCI总线事务在启动后的第一个时钟周期传送地址,这个地址是PCI总线域的存储器地址或者I/O地址;而在下一个时钟周期传送数据[1]。传送地址的时钟周期也被称为地址周期,而传送数据的时钟周期也被称为数据周期。PCI总线支持突发传送,即在一个地址周期之后,可以紧跟多个数据周期。
(2) PAR信号
PCI总线使用奇偶校验机制,保证地址和数据信号在进行数据传递时的正确性。PAR信号是AD[31:0]和C/BE[3:0]的奇偶校验信号。PCI主设备在地址周期和数据周期中,使用该信号为地址和数据信号线提供奇偶校验位。
(3) C/BE[3:0]#信号
PCI总线复用命令与字节选通引脚。在地址周期中,C/BE[3:0]信号表示PCI总线的命令。而在数据周期,C/BE[3:0]引脚输出字节选通信号,其中C/BE3、C/BE2、C/BE1和C/BE0与数据的字节3、2、1和0对应。使用这组信号可以对PCI设备进行单个字节、字和双字访问。PCI总线通过C/BE[3:0]#信号定义了多个总线事务,这些总线事务如表1-2所示。
表1-2 PCI总线事务
接口控制信号
在PCI总线中,接口控制信号的主要作用是保证数据的正常传递,并根据PCI主从设备的状态,暂停、终止或者正常完成当前总线事务,其主要信号如下。
(1) FRAME#信号
该信号指示一个PCI总线事务的开始与结束。当PCI设备获得总线的使用权后,将置该信号有效,即置为低,启动PCI总线事务,当结束总线事务时,将置该信号无效,即置为高。PCI设备(HOST主桥)只有通过仲裁获得当前PCI总线的使用权后,才能驱动该信号。
(2) IRDY#信号
该信号由PCI主设备(包括HOST主桥)驱动,该信号有效时表示PCI主设备的数据已经准备完毕。如果当前PCI总线事务为写事务,表示数据已经在AD[31:0]上有效;如果为读事务,表示PCI目标设备已经准备好接收缓冲,目标设备可以将数据发送到AD[31:0]上。
(3) TRDY#信号
该信号由目标设备驱动,该信号有效时表示目标设备已经将数据准备完毕。如果当前PCI总线事务为写事务,表示目标设备已经准备好接收缓冲,可以将AD[31:0]上的数据写入目标设备;如果为读事务,表示PCI设备需要的数据已经在AD[31:0]上有效。该信号可以和IRDY#信号联合使用,在PCI总线事务上插入等待周期,对PCI总线的数据传送进行控制。
(4) STOP#信号
该信号有效时表示目标设备请求主设备停止当前PCI总线事务。一个PCI总线事务除了可以正常结束外,目标设备还可以使用该信号终止当前PCI总线事务。目标设备可以根据不同的情况,要求主设备对当前PCI总线事务进行重试(Retry)、断连(Disconnect),也可以向主设备报告目标设备夭折(Target Abort)。
目标设备要求主设备Retry和Disconnect并不意味着当前PCI总线事务出现错误。当目标设备没有将数据准备好时,可以使用Retry周期使主设备重试当前PCI总线事务。有时目标设备不能接收来自主设备较长的Burst操作时,可以使用Disconnect周期,将一个较长的Burst操作,分解为多个Burst操作。当主设备访问的地址越界时,目标设备可以使用Disconnect周期,终止主设备的越界访问。
而Target Abort表示在数据传送中出现错误。处理器系统必须要对这种情况进行处理。在PCI总线中,出现Abort一般意味着当前PCI总线域出现了较为严重的错误。
(5) IDSEL信号
PCI总线在进行配置读写总线事务时,使用该信号选择PCI目标设备。配置读写总线事务与存储器读写总线事务在实现上略有不同。在PCI总线中,存储器读写总线事务使用地址译码方式访问外部设备。而配置读写总线事务使用“ID译码方式”访问PCI设备,即通过PCI设备的总线号、设备号和寄存器号访问PCI设备的配置空间。
IDSEL信号与PCI设备的设备号相关,相当于PCI设备配置空间的片选信号,这部分内容将在后续详细介绍。
(6) DEVSEL#信号
该信号有效时表示PCI总线的目标设备准备好,该信号与TRDY#信号不同之处在于该信号有效仅表示目标设备已经完成了地址译码。目标设备使用该信号通知PCI主设备,其访问对象在当前PCI总线上,但是并不表示目标设备可以与主设备进行数据交换。而TRDY#信号表示数据有效,PCI主设备可以向目标设备写入或者从目标设备读取数据。
PCI总线规范根据设备进行译码速度的快慢,将PCI设备分为快速、中速和慢速三种设备。在PCI总线上还有一种特殊的设备,即负向译码设备,在一条PCI总线上当快速、中速和慢速三种设备都不能响应PCI总线事务的地址时,负向译码设备将被动地接收这个PCI总线事务。如果在PCI主设备访问的PCI总线上,没有任何设备可以置DEVSEL#信号为有效,主设备将使用Master Abort周期结束当前总线事务。
(7) LOCK#信号
PCI主设备可以使用该信号,将目标设备的某个存储器或者I/O资源锁定,以禁止其他PCI主设备访问此资源,直到锁定这个资源的主设备将其释放。PCI总线使用LOCK#信号实现LOCK总线事务,只有HOST主桥、PCI桥或者其他桥片可以使用LOCK#信号。在PCI总线的早期版本中,PCI Agent设备也可以使用LOCK#信号,而目前PCI总线使用LOCK#信号仅是为防止死锁和向前兼容。LOCK总线事务将严重影响PCI总线的传送效率,在实际应用中,设计者应当尽量避免使用该总线事务。
仲裁信号
PCI设备使用该组信号进行总线仲裁,并获得PCI总线的使用权。只有PCI主设备需要使用该组信号,而PCI从设备可以不使用总线仲裁信号。这组信号由REQ#和GNT#组成。其中PCI主设备的REQ#和GNT#信号与PCI总线的仲裁器直接相连。
PCI主设备的总线仲裁信号与PCI总线仲裁器的连接关系如图1-2所示。值得注意的是,每一个PCI主设备都具有独立的总线仲裁信号,并与PCI总线仲裁器一一相连。而总线仲裁器需要保证在同一个时间段内,只有一个PCI设备可以使用当前总线。
在一个处理器系统中,一条PCI总线可以挂接PCI主设备的数目,除了与负载能力相关之外,还与PCI总线仲裁器能够提供的仲裁信号数目直接相关。
在一颗PCI总线树中,每一条PCI总线上都有一个总线仲裁器。一个处理器系统可以使用PCI桥扩展出一条新的PCI总线,这条新的PCI总线也需要一个总线仲裁器,通常在PCI桥中集成了这个总线仲裁器。多数HOST主桥也集成了一个PCI总线仲裁器,但是PCI总线也可以使用独立的PCI总线仲裁器。
PCI主设备使用PCI总线进行数据传递时,需要首先置REQ#信号有效,向PCI总线仲裁器发出总线申请,当PCI总线仲裁器允许PCI主设备获得PCI总线的使用权后,将置GNT#信号为有效,并将其发送给指定的PCI主设备。而PCI主设备在获得总线使用权之后,将可以置FRAME#信号有效,与PCI从设备进行数据通信。
中断请求等其他信号
PCI总线提供了INTA#、INTB#、INTC#和INTD#四个中断请求信号,PCI设备借助这些中断请求信号,使用电平触发方式向处理器提交中断请求。当这些中断请求信号为低时,PCI设备将向处理器提交中断请求;当处理器执行中断服务程序清除PCI设备的中断请求后,PCI设备将该信号置高[2],结束当前中断请求。
PCI总线规定单功能设备只能使用INTA#信号,而多功能设备才能使用INTB#/C#/D#信号。PCI设备的这些中断请求信号可以通过某种规则进行线与,之后与中断控制器的中断请求信号线相连。而处理器系统需要预先知道这个规则,以便正确处理来自不同PCI设备的中断请求,这个规则也被称为中断路由表,有关中断路由表的详细描述见后续介绍。
PCI总线在进行数据传递过程时,难免会出现各种各样的错误,因此PCI总线提供了一些错误信号,如PERR#和SERR#信号。其中当PERR#信号有效时,表示数据传送过程中出现奇偶校验错(Special Cycle周期除外);而当SERR#信号有效时,表示当前处理器系统出现了三种错误可能,分别为地址奇偶校验错,在Special Cycle周期中出现数据奇偶校验错,或者系统出现其他严重错误。
如果PCI总线支持64位模式,还需要提供AD[63:32]、C/BE[7:4]、REQ64、ACK64和PAR64这些信号。此外PCI总线还有一些与JTAG、SMBCLK以及66MHz使能等信号,本章并不关心这些信号。
[1] 双地址周期在第一、二个时钟周期,都传送地址。
[2] INTx#这组信号为开漏输出,当所有的驱动源不驱动该信号时,该信号由上拉电阻驱动为高。
PCI Express 系列连载篇(二)就到这里结束,明天继续带来第三篇,包括PCI总线的存储器读写总线事务相关内容。各位大侠,明天见!
END
后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。
大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!