锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

一文讲述,什么是pci总线原理?

时间:2023-02-05 21:00:00 576kohm电阻8x4电阻器定时器

PCI即Peripheral Component Interconnect,中文的意思是外围器件互联PCISIG (PCI Special Interest Group)推出的一种局部并行总线标准。在现在电子设备中应用非常广泛,下面我详细介绍下PCI总线的工作原理,希望对大家有所帮助。

PCI过去、现在和未来的总线

PCI总线是由ISA(Industy Standard Architecture)总线发展而来。

ISA并行总线有8位16位时钟频率为两种模式8MHz,总线带宽为:8bit*8MHz=64Mbps=8MB/s或 16bit*8MHz= 128Mbps =16MB/s。在计算机出现初期的386/486时代,ISA总线的带宽已经很宽了,满意CPU可以说,需求绰绰有余。

1987年,IBM公司推出32位MAC(MicroChannel Architecture)总线,总线带宽达到40MB/s,迫于IBM的压力,Compaq、AST、Epson、HP、Olivetti和NEL9家公司于1988年9月联合推出EISA(Extended ISA)总线,EISA保持总线ISA总线的8MHz时钟频率,但总线位宽增加到32位,总线带宽为:32bit*8MHz=256Mbps =32MB/s,并且与ISA总线完全兼容。

随着计算机技术的继续发展,CPU处理速度越来越快,EISA总线的32MB/s带宽不再满足CPU的需求,CPU外围总线带宽已成为制约计算机处理能力不断提高的瓶颈。1991年下半年,Intel提出公司的首选PCI和谐总线的概念IBM、Compaq、AST、HP、DEC等100多家公司成立PCISIG组织,联合推出PCI总线。

PCI总线支持32位64位时钟频率为两个位宽33MHz,总线带宽:32bit*33MHz= 1056Mbps =132MB/s或64bit*33MHz=2112Mbps=264MB/s

随着PCI总线的发展,PCI总线又发展到了PCI-X时代,与PCI总线相比,PCI –X总线的位宽没有改变,但是提高时钟频率

PCI-X 1.时钟频率为066MHZ/100MHz/ 133MHz,总线带宽分别为264MB/s, 400MB/s和532MB/s(32位),528MB/s, 800MB/s和1064MB/s(64位);

PCI-X 2.时钟频率为0266MHz/533MHz/1066MHz,总线带宽分别为1064MB/s, 2132MB/s和4264MB/s(32位),2128MB/s, 4264MB/s和8512MB/s(64位),PCI-X与PCI硬件结构上总线完全兼容。

与PCI总线相比,PCI-X除时钟频率高外,传输协议也有所改进,PCI-X采用寄存器到寄存器的新协议。在新协议模式下,发送方发送的数据信号将提前发送到专用寄存器,并在寄存器中保存一个时钟周期。只要接收器在此周期内响应并取走数据。PCI协议中没有缓冲。数据发出后,如果对方因某种原因未能及时接收,数据将被丢弃

如今,PCI总线已到总线PCI-Express时代,这是一个串行高速总线,也是由PCISIG推出,分为X1,X2,X4,X8,X12,X16和X32七种模式,X1模式有2对差分线,1对收1对发,X2模式有4对差分线,2对收2对发,其他类推。PCI-E 1.0的速率为2.5Gbps,PCI-E 2.0的速率为5.0Gbps,PCIE 3.0的速率可达8.0Gbps。PCIE正在替代着PCI/PCI-X相信在不久的将来,PCI/PCI-X总线就如同ISA/EISA进入历史博物馆的总线是一样的。

PCI总线结构

PCI总线是独立于树型结构的树型结构CPU总线,可以和CPU并行运行总线。PCI可挂在总线上PCI设备PCI桥片,PCI总线上只允许一个PCI主设备,其他的均为PCI 从设备上看,读写操作只能在主从设备之间设备之间的数据交换需要进行通过主设备中转

PCI总线管脚功能

PCI主要设备至少需要49线,从设备到剩下的线至少需要47根线。PCI管脚功能前,先说明一下PCI管脚信号的类型。

in:输入信号;

out:输出信号;

t/s:双向三态信号(Tri-state),无效时为高组态

s/t/s:三态信号持续(Sustained Tri-state),每次由且只有一个单元拥有和驱动低有效双向三态信号。驱动一个s/t/s在释放信号浮空之前,信号低的单元必须驱动至少一个高电平周期。这个特性很重要,我们稍后再分析PCI使用信号质量案例;

o/d:漏极开路输出(Open Drain);

#:该符号表示该信号在低电平时有效。

实际使用中需要上拉的信号有:FRAME#, TRDY#, IRDY#, DEVSEL#, STOP#, PERR#, SERR#, LOCK#, REQ64#, ACK64#, REQ#, GNT#,AD[63:32],C/BE[7:4],PAR64等,上拉电阻一般为10kohm未使用的PCI管脚也要处理,避免悬挂。有信号不需要上拉AD[31:0], C/BE[3:0], PAR, IDSEL, CLK。

1).系统引脚

CLK:in,系统时钟,为所有PCI传输和总线仲裁提供时间顺序。除RST#外,所有PCI信号都在CLK采样沿信号上升

RST#:in,异步复位信号。

2).地址及数据引脚

AD[31:0]:t/s,引脚复用地址数据。FRAME#开始成为一个有效的时钟周期AD[31输在[31:0]上。对于配置空间和存储空间,这是一个双字节地址I/O单字节地址空间。传输数据时,AD[7:0]最低字节数据

C/BE[3:0]#:t/s,总线命令和字节允许重用引脚。在AD[31:0]上传地址时,C[3:0]上传输总线命令AD[31:0]上传数据时,BE[3:0]#允许作为字节使用,通道上的数据是有效的。BE0#对应最低字节。

PAR:t/s,AD[31:0]和C/BE[3:0]#上的数据偶效果。PAR与AD[31:0]时序相同,但延迟一小时,地址段后一个时钟,PAR在写传输中,稳定有效;PAR在IRDT#稳定有效的时钟,在读传输中,PAR在TRDY#时钟周期稳定有效。一旦PAR在当前数据段完成后的一个时钟内,它必须保持有效。主PCI设备驱动PAR,阅读数据段,目标从PCI 设备驱动PAR。

3).接口控制引脚

FRAME#:s/t/s,帧开始信号。由当前总线主设备驱动,说明操作的开始和延续。FRAME#有效性表明,当总线开始传输时,FRAME#保持有效时,说明总线传输继续进行,当FRAME#无效时,表示传输的最后一个字节正在进行中

IRDY#:s/t/s,启动者准备信号(Initiator Ready)。说明传输的启动者完成当前数据传输的能力。在阅读操作中,IRDY#有效说明总线主设备已准备好接收收据它在写作操作中说明AD有效数据[3:0]上有效数据。在IRDY#和TRDY#所有有效的时钟周期都完成数据传输。IRDY#和TRDY#有效前,需要插入等待状态。

TRDY#:s/t/s,准备好目标设备(Target Ready)。说明传输目标设备完成当前数据传输能力。在写作操作中,TRDY目标设备已准备好接收数据它在阅读操作中说明AD有效数据[31:0]

STOP#:s/t/s,停止信号目前的目标设备要求主线设备停止目前的传输

LOCK#:s/t/s,定信号。

IDSEL:in,选择初始化设备(Initialization Device Select)。在配置空间读写操作中片选

DEVSEL#:s/t/s,设备选择。当驱动有效时,表明驱动设备已将其地址解码为当前操作的目标设备。

4).仲裁引脚

REQ#:t/s,申请。向仲裁器解释该单元想使用总线。这是一个点对点信号,每个总线主设备都有自己的信号REQ#。

GNT#:t/s,允许。仲裁器向申请人解释其对总线的操作已被允许。这是一个点对点信号,每个总线主设备都有自己的GNT#。

5).引脚反馈错误

PERR#:s/t/s,奇偶校验错误(Parity Error)。引脚用于反馈除特殊周期外其他传输过程中的数据奇偶校验错误。PERR#维持三态,检测到奇偶校验错误后,数据结束后的两个时钟周期由接收数据的单元驱动PERR#有效。并且至少持续一个时钟周期只有发出DEVSEL#单元可以发出PERR#

SERR#:o/d,系统错误(System Error)。用于反馈地址奇偶校验错误、特殊周期命令中的数据奇偶校验错误等灾难性系统错误。

6).中断引脚

INTA#, INTB#, INTC#, INTD#:o/d,中断输出。

7).高速缓存支持引脚

能高速缓存的PCI存储器必须使用这两个高速缓存支持引脚作为输入支持写通(write-through)回写(write-back)。可高速缓存的存储器位于PCI高速连接回写存到PCI的桥路必须利用这两条引脚,且作为输出。连接写通高速缓存的桥路可以只使用一条引脚SDONE。

SBO#:in/out,监视补偿。当其有效时,说明对某条变化线的一次命中。当SBO#无效而SDONE有效时,说明了一次“干净”的监视结果。

SDONE: in/out,监视进行。表明对当前操作的监视状态。当其无效时,说明监视结果仍未定。当有效时,说明监视已有结果。

8).64位总线扩充引脚

AD[63:32]:t/s,地址数据复用引脚提供32个附加位。在一个地址段,传送64位地址的高32位。在数据段,传送64位中的高32位。

C/BE[7:4]#:t/s,总线命令和字节允许复用引脚。

REQ64#:s/t/s,请求64位传输。当其被当前总线主设备有效驱动时,说明总线主设备想作64位传输。

ACK#:s/t/s,应答64位传送。在当前操作所寻址的目标设备有效驱动该信号时,说明目标设备能够进行64位传输,ACK#和DEVSEL#有相同的时序。

PAR64:t/s,高双字偶校验。

PCI总线上IDSEL管脚的处理方式

主PCI桥片的IDSEL管脚一般通过电阻下拉到地,从PCI设备的IDSEL 管脚和AD[11:31]相连每个PCI从设备连接其中的一根,且不能重复。如下图所示。

PCI信号的驱动方式

PCI信号为半波驱动方式,为了更好的说明什么是半波驱动方式,下面我用一个仿真实例来说明。下图为仿真链路。

  PCI_OUT_3.3V输出先是以大约2.3V的半幅度来驱动总线,经过大约2ns延迟后,信号到达接收端,接收端阻抗不匹配,将信号反射回始端,反射信号经过2ns的延迟后到达始端,驱动信号与反射信号在始端出现叠加,使PCI_OUT_3.3V在大约4ns的位置达到全幅度3.3V。之后经过短暂振荡后趋于平衡。由于大多数PCI器件片内都内置了限幅器件,所以PCI信号在不在始端添加串行匹配电阻都可以使PCI信号很快平稳。只是加串阻后,信号幅度更低,使PCI器件的使用寿命更长。

PCI仲裁器工作原理

  假设PCI仲裁器上接三个PCI设备

  假定PCI1,PCI2,PCI3三个设备的优先级相同,上电后,PCI总线仲裁器会将PCI1设备的GNT1信号驱动为低电平(有效)。即PCI1占用PCI总线。如果此时PCI1上没有数据传输,但PCI2上有数据要传输,PCI2设备就会驱动REQ2为低电平来向仲裁器发出PCI总线使用请求。仲裁器在时钟的上升沿采样到REQ2信号,在下一个时钟沿,PCI2将FRAME和IRDY驱动为低电平(FRAME和IRDY是所有PCI设备共用的),仲裁器在时钟的上升沿采样到这两个信号后,就将GNT2驱动为低电平,应答PCI2的请求,这样,PCI2就拥有了PCI总线的使用权。

  这里有一个问题,为什么PCI总线仲裁器不在采样到REQ2信号有效后立即将GNT2置低,将PCI总线的使用权交给PCI2设备,而是要等到PCI2设备的FRAME和IRDY信号有效后才执行呢?

  这主要是仲裁器避免某些PCI设备申请总线使用权而实际上不使用,所以要等到FRAME和IRDY信号有效后(表示数据传输准备就绪)才授权使用总线。如果仲裁器在采样到REQ2有效后,一直没有采样到FRAME和IRDY信号有效,仲裁器会不会一直等待下去呢?答案是不会,仲裁器内部有一个定时器,等到定时器超时后,仲裁器就不再等了。

  仲裁规则:优先级高设备抢占优先级低设备资源

  假设三个PCI设备的优先级顺序为:PCI3>PCI2>PCI1。

  某个时刻,PCI1正在使用PCI总线传输数据,如果此时PCI2想要使用PCI总线,于是将REQ2驱动为低,向PCI总线仲裁器申请PCI总线的使用权,此时REQ1和REQ2都处于有效状态,虽然PCI2的优先级高于PCI1,但是总线仲裁器不会马上响应PCI2的请求。而是等待PCI1完成一次操作(注意:是一次操作,不是全部)后,PCI1将FRAME和IRDY总线驱动为高(每完成一次操作都需要进行此操作的)。

  PCI2探测到PCI总线空闲后,将FRAME和IRDY信号驱动为低。总线仲裁器采样到这两个信号有效后,将GNT1驱动为高,同时将GNT2驱动为低,将总线的使用权转交给PCI2。

  此时,如果PCI1完成了全部传输,会将REQ1驱动为高。

如果PCI1还有数据等待传输,那么它会将REQ1一直保持为低电平,一直进行总线申请。一直等待到PCI2完成所有操作后,还会将PCI总线的使用权释放给PCI1。

PCI操作类型

  前面已经说过了,在FRAME信号有效后的第一时钟周期,AD[31:0]总线上传输的是目标PCI器件的地址,C/BE[3:0]上传输的操作命令类型。

PCI总线的读写时序

  如上图所示,在FRAME#有效后的第一个时钟周期内,AD上传输的是要写入目标PCI设备的地址信息,C/BE#上传输的是命令类型(I/O写命令为0011),DEVSEL#信号有效后,表明目标PCI设备已经被选择到,IRDY#和TRDY#同时有效后,主PCI设备向目标PCI设备中传输要写入的数据,在第5个时钟周期时,IRDY#和TRDY#同时变为无效状态,AD总线上被插入一个等待周期,第6和第7个时钟周期时,IRDY#有效,但是TRDY#无效,传输仍然不能有效进行,总线上被继续插入两个等待周期,第8个时钟周期时,IRDY#和TRDY#都有效,数据传输继续。

  读操作同写操作类似,只是在FRAME#有效后的第一个时钟周期内,C/BE#上传输的是读操作命令而已(I/O读操作命令为0010)。

PCI设备的配置空间

  所有除主桥之外的设备功能,必须实现配置地址空间,目前有三种类型的首部格式:首部类型0,用于全部除PCI桥之外的设备;首部类型1,用于PCI-PCI桥;首部类型2,用于Card Bus桥。

  每个PCI设备的配置空间大小为256字节,用来存放PCI配置文件,其中文件头标识区占64字节,下图为Type0类型首部。

  1).厂家ID(Vender ID):用来区别每个PCI设备生产商,由PCI-SIG组织分配,0xFFFF表示无效。

  2).设备ID:用来标识设备类型。

  3).命令寄存器:为发出PCI和响应PCI总线命令提供粗略控制。

  4).状态寄存器:用于记录PCI总线的事件状态信息。

  5).版本标识:标识PCI设备的版本。

  6).分类代码:用来表示PCI设备的功能分类和特定的编程接口,为只读存储器。

  7).Cache行大小:指定系统中高速缓存cache一行的长度,以Dword为单位,可读写。

  8).持有定时器:指定PCI总线主设备的延时计时值,以PCI总线的时钟为单位。

  9).配置类型:表示头标区类型,以及是否为多功能设备。

  10).自测能力BIST:Built-In self test,支持自测的PCI设备为1,不支持的为0。

  11).基地址0~5:实现PCI设备所有使用地址空间的再定位。

  12).扩展ROM基地址:表示ROM再内存中的起始地址,执行其中代码完成PCI初始化。

  13).中断线: 报告PCI设备与系统中断连接情况。

  14).中断引脚:表示PCI设备使用了哪些中断引脚。

  15).最短获准时间:指定PCI设备对延时计数器的设定值。

  16).最大等待时间:指定PCI设备对延时计数器的设定值。

PCI总线小案例

问题描述:

  在测试PCI总线的TRDY信号时,发现该信号从低电平拉升到高电平时太缓慢,

问题分析:

  TRDY是s/t/s信号,在前面已经讲过了,s/t/s信号有如下特点:

  1).在某一个时刻只能由一个设备驱动;

  2).在释放之前必须将该信号驱动到高电平,并且至少保持一个时钟周期;

  3).其它设备必须等到该信号释放至少一个时钟周期后才能重新驱动它。

  4).该信号必须进行外部上拉处理。

  经过分析该PCI总线的逻辑代码得知,该逻辑在处理s/t/s 信号时没有完全按照规范要去来做,在将TRDY信号置为低电平有效后直接释放到高阻态,没有将它驱动到高电平后再释放,因此,TRDY在低电平位置被释放到高阻态后,完全依靠外部的上拉电阻将其拉到高电平位置,由于外部上拉比较弱,导致我们上面见到的TRDY电平上升缓慢现象。修改逻辑代码后,问题消失。

 【文章福利】小生推荐自己的Linux后台/内核技术交流群【 318652197】整理了一些个人觉得比较好的学习书籍,视频资料共享在群文件里面,有需要的自行添加哦!!!前100名进群领取,额外赠送一份价值699的内核资料包(含视频、电子书、实战项目及代码)

资料免费领

学习直通车

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章