EDA365电子工程师网

标题: FPGA实现PCIe设备时的一个问题【图已补上】 [打印本页]

作者: cuizehan    时间: 2010-8-14 23:35
标题: FPGA实现PCIe设备时的一个问题【图已补上】
本帖最后由 cuizehan 于 2010-8-15 11:22 编辑
% I9 @! R' u+ q* Q4 Y, b0 q! {$ M: F$ |/ s
我用的xilinx v6-lx130t-ff783-2的FPGA,来实现一个PCIe设备,整个系统的结构如下图 - O  y1 P/ J! g9 k  D

6 f  m, M' K4 l4 Y- n" Y; k& }   d! f: q+ J3 D+ F& Z' X8 G& F% n0 v
FPGA所在的板卡通过一根Cable连到PCIe转接卡,再通过金手指插到主机的PCIe插槽。, P4 v2 P9 z' Q
3 @2 o" D' i/ C0 ?7 n" O7 _$ }2 V2 r
上图中只画出了PERST#信号的拓扑结构+ p& x+ w* y! ?* V* @# p
, T  X$ f7 T: R- t7 C
* [0 n9 Y. o9 ?% N/ y
正常的PCIe设备启动过程如下图& P# `, c! C1 |: A* J9 f6 l
  
2 v( _$ K. T& i, k 2 d( ^' h1 K( |/ I
预期的正常情况是:% g/ X1 V5 s6 {1 e: ~$ g4 f$ @
8 K- Y' a/ w% O0 y, n6 U6 y
         1. 设备卡先加电,因此电源一直处于稳定状态,初始时PERST#被上拉到高电平。( `0 B& _: x! s
         2. 启动主机,在主机POST过程中,PERST#被拉低一段时间,使所有的PCIe设备复位。
3 y( Q1 j1 e2 b& v$ k         3. 经过一段时间之后,大于tPVPERL,设备完成复位,准备好传输数据,主机撤去PERST#,设备开始工作。# j! b) q# Q; K7 |" ]$ l
4 G2 _! d) Q8 C1 H2 x& S
# X3 ~  c! O# _; e6 d  d1 u
但是现在的情况是:
1 x8 L* o" J! V. s- z  w4 ?- ^9 f7 {; w5 O
         1. 如果设备卡不加电,则主机能够正常启动。2 K/ X. }) q* J2 u2 r1 ?
         2. 如果设备卡加电,则主机不能启动,显示器没信号,cpu、显卡风扇转速都很低,没有出现滴滴响声。
: I# }! E7 i4 L+ ~) b, J$ C1 H
  b0 `9 e3 H$ F. G( u
9 ?' ~3 [  ^0 s5 C0 p; Q. ?0 }我通过chipscope抓取了PERST#信号,发现设备卡加电时该信号时高时低,持续时间都不会超过1ms。
& W; v) s8 C$ @9 ]0 {# W& a/ L
; }7 P6 q9 Z+ q  E+ n我做了如下分析:- e' |! U* X3 P( T! Q

0 L% Z. @- X0 F( s- \: e- b         1. 通过万用表测量,发现主机上所有的PCI、PCIe插槽的PERST#引脚都是相连的。
. E+ i1 W9 w' n$ @- b( K         2. 因此正是PERST#信号的时高时低,使得主机的所有PCIe设备都不能正常工作,包括显卡,因此显示器会没信号,进而不能启动。" s7 w  d2 c1 d% X

8 E; H' A  R' t( ?' V2 `但是我不知道是什么原因造成了PERST#信号的时高时低,从系统的拓扑结构来看,当主机撤去PERST#的低电平时,PERST#应该被上拉到高电平才对。
4 O2 Q( M" V- B! G1 G* E- K7 Q  `' w6 b+ k4 F
图中的3.3V - 2.5V电平转换器用的TXB0108芯片,参考的是xilinx ml605的原理图,因为v6的pcie核PERST#要求是2.5V电平的。
作者: liqiangln    时间: 2010-8-15 00:46
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的Pcie卡的pin map是否有短路的,电源和地。( R* K! Z5 a& x7 }/ D
6 b: Y6 ]! D4 h6 x# ^
或者是你看看你设计的V6子卡的pcie连接器的3.3V/12V的电源情况,通常是主板给子卡供电,但是你设计的子卡的3.3V/12V的pin上可能有电,是来自你子卡自身的电源模块,理解吗?
% k* t7 V8 |. N1 ^! _
2 e; z& a: Y( W: L5 W& e这样3.3V/12V相当于2个源,主板的电源进入保护状态了。
作者: cuizehan    时间: 2010-8-15 10:33
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的 ...: e' h7 V+ [, M( n5 w- K# N
liqiangln 发表于 2010-8-15 00:46

/ b" x) v  V' I3 Z
7 A$ N8 `1 ^4 {$ y  G2 `( H8 B+ v: Z) A$ q# K7 s; p$ \
    PCIe连接器并不传送电源,同时PCIe转接卡和FPGA子卡都采用外部电源供电。
9 w; ~8 n2 i1 ]% z8 X4 ]" H4 [6 @* @  |- G
    PCIe插槽上的3.3V/12V电源在接到PCIe转接卡的金手指时就做了开路,因此应该不存在3.3V/12V有两个源的情况。1 y" G# e8 p, a

1 U; `7 X. m8 @+ k这是PERST的拓扑结构图,再补一下6 a3 ^8 B) C3 V/ p

作者: cuizehan    时间: 2010-8-15 11:49
回复 2# liqiangln 3 u1 b. T  h5 D( l4 ^( K/ d- T

& E9 E; ~! E" M* e) z  R9 G: }/ a5 S' b( x3 Q( I# ?- Z
    我怀疑是FPGA子卡的存在干扰了PERST#的正常时序,
0 @, o% l) F. |8 a1 K2 `: w5 W9 D1 c% n+ x
    现在把子卡上4.7K的上拉电阻去掉后,问题还是存在。
作者: liqiangln    时间: 2010-8-15 16:37
其实在电路中说的信号完整性,电源完整性,干扰,仅仅是针对性能谈的,对于基本功能实现没那么大的危害,不要神化了,还是要从基本的方式解决问题。0 d. b9 t3 z+ O5 N2 e. E* s! U  O
比如说你的外部电源和你的主机是否是共地,是否有同样的参考点。5 g, N: ^' w, _8 f2 N
0 s* e5 R4 _/ M! K2 ^
比如说你FPGA(设备卡)的3.3V和主机的3.3V是什么关系,因为你把设备卡链接上去的时候,这个3.3V就传递到主机卡上了,如果这个3.3V先于主机3.3V电源上电,那么可能造成主机的3.3V电源模块没启动。
作者: cuizehan    时间: 2010-8-15 16:38
又做了一个实验:- l& R' @& M( m& O
$ ~' G. `; C, m1 p3 d
    把4.7K电阻焊上,把PCIe转接卡上的0R电阻换成开关。
/ \1 j9 P+ s! m1 b7 Q+ p' h) W1 w1 S/ g, O1 V8 \8 k4 Y+ Y
发现:
! w7 N4 s/ n% d; O4 V6 e6 {" e8 _: ~
   若开关断开,则FPGA侧PERST#为高电平;  J1 P  n. O9 o
   若把开关合上,则PERST#被拉低,FPGA侧PERST#为低电平;
0 A, D7 l; c- Y5 \   若此时再把开关断开,则理论上PERST#应该被拉高,但实际中FPGA侧PERST#为低电平,3.3V-2.5V电平转换器的3.3V一端的PERST#电压为1.57V,2.5V一端为0.2V。
+ g: `  B6 I" w4 w- q' X
! V; f( }$ y) a- U$ @0 n' V推断:
7 H, E; [* y* g: v( f8 s; q6 X# h, y5 @  _" Z1 D' z- v
    可能是电平转换器的输入阻抗不够大,导致上拉能力不够,换一个470R的上拉电阻试一下。
作者: cuizehan    时间: 2010-8-15 16:40
本帖最后由 cuizehan 于 2010-8-15 16:42 编辑 2 M2 B( i6 A! @  `

$ h' Y' C- J9 `& t回复 5# liqiangln 7 W+ _1 m* t% ?- K9 `& c' p
. o4 R* d/ p0 S( [* S% F$ @
: T) @4 a( t. \  x/ K1 T. O+ J
    主机的3.3V电源和设备卡的3.3V电源是隔离的,分别由不同的电源模块产生,且中间没有通路。# m- U- E  E3 R. M
    参考地是一样的。
作者: cuizehan    时间: 2010-8-15 17:12
回复 6# cuizehan
& M# o; G% D0 A4 P4 O
0 d( L& {8 m  F! \/ ^- t# R0 k) \, p+ h4 _4 a" X
    换了470R上拉电阻后,通过开关手工复位,主机可以正常启动,并且也检测到PCIe设备了。
9 l2 V6 f2 j1 n6 s2 @
" H" j7 M# D* A( n    虽然可以了,但是需要手工操作。下面把开关换回0R电阻再试一试。
作者: cuizehan    时间: 2010-8-16 08:57
通过开关手工复位,和0R电阻,主机都可以正常启动,并且通过PCItree都检测到了该设备。& n4 x# u" V' a7 v
9 g! L. h$ w" F3 \
但是,用0R电阻(由主机来实现复位时),PCI配置空间里的BAR寄存器是0,没有分配空间。) k- v2 q$ \  H  I7 h% }% `- ^8 ~

# K& g+ A) a/ @( r5 N# V$ m1 M通过手工开合开关(手工复位),PCI配置空间的BAR寄存器非0.) _7 ]$ Y7 D4 M9 H$ C
2 ?5 s) i  X$ p3 C
还不知道是什么原因造成了这个现象。
作者: liqiangln    时间: 2010-8-16 10:44
你也可以把3.3Vto2.5V的模块,跨过,用分压电阻来实现,看看是否有改善。) y2 U0 a7 a7 T2 F- J; {1 k

2 A( e2 P4 `8 s5 p! I4 }; R  C, ePCIe金手指上出来RST以外,还有在位检测线号我记得也是默认上拉的,你看看是如何处理的?, P+ P8 Y9 ]4 a! D2 n9 Q

4 e; m/ V* Y) ^& \! f! |# e5 G- e如果你的地址空间没有分配,还是不能工作。
作者: cuizehan    时间: 2010-8-17 15:41
回复 10# liqiangln
5 u- \( x" m3 w+ o8 L
  B* c) e6 \3 C& Y6 v5 ]/ O" M; A9 W& i/ P. w6 n3 k
    把3.3V-2.5V模块跨过,这个我还没想好怎么弄,主要是焊接上不好实现。# J8 C4 Z* A+ G, R7 Q* _! L9 p5 z
* C. _( u# `6 [6 M, E( R
    在位检测信号,( `: o' Z2 y: m. ]3 p5 g
          按照PCIe CEM规范上将,应该是讲两个PRSNT#短接,这样主机才能发现设备,提供电源和时钟。+ ^) P( x" |9 Y, m
          实际实现中并没有直接短接,而是用了一个跳线,发现不管有没有短接都没什么影响。
9 z# c0 t" p0 _# j# s- V7 _! x          之前一个做这方面的工程师给讲过,说一般的PC机是没实现这个功能的,直接给所有的插槽提供给电源和时钟,所以这两个信号可以不用管。
作者: liqiangln    时间: 2010-8-18 09:06
不知道你找到原因没呢?




欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/) Powered by Discuz! X3.2