EDA365电子论坛网

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

作者: cuizehan    时间: 2010-8-14 23:35
标题: FPGA实现PCIe设备时的一个问题【图已补上】
本帖最后由 cuizehan 于 2010-8-15 11:22 编辑
; H: {3 y1 h/ y4 C- y. }. e, s4 I  D
我用的xilinx v6-lx130t-ff783-2的FPGA,来实现一个PCIe设备,整个系统的结构如下图 0 s. E! w. ]- W

! B" q; r) D* Z0 M; ^/ M( Q) p+ r
7 I5 |- d: S9 Y8 B1 j9 BFPGA所在的板卡通过一根Cable连到PCIe转接卡,再通过金手指插到主机的PCIe插槽。
0 B" B' z" d  `2 C( s7 S/ y1 n& [/ t4 J* ^% P
上图中只画出了PERST#信号的拓扑结构  ]3 u; ^& H( ~! A. k+ Q
* o- y2 s" `5 J4 G) P

# i2 Z, W+ e) i正常的PCIe设备启动过程如下图. U: r% x6 q8 y& a; P1 x+ E6 k3 A# X, f
  
4 K  O- N" s* z6 s( T9 b+ f 3 c8 u' r  z* Y6 z' ]8 Q
预期的正常情况是:8 n4 }7 m2 E+ L# Q7 }9 o+ n: x
! [7 c1 k0 m: N. i& o/ f
         1. 设备卡先加电,因此电源一直处于稳定状态,初始时PERST#被上拉到高电平。
+ ?: N% v& V" ^0 k         2. 启动主机,在主机POST过程中,PERST#被拉低一段时间,使所有的PCIe设备复位。
! _% x' [- e( Z7 _         3. 经过一段时间之后,大于tPVPERL,设备完成复位,准备好传输数据,主机撤去PERST#,设备开始工作。
* f' z5 j* i0 S1 {5 W
* L) \0 y4 R) U& j2 {9 O9 g( z, v+ x  _; s, }
但是现在的情况是:
7 n' @) n- j: C# t5 v1 k0 a: A( q1 L5 P8 [
         1. 如果设备卡不加电,则主机能够正常启动。
  X  q0 ?2 \; e' F' x5 v         2. 如果设备卡加电,则主机不能启动,显示器没信号,cpu、显卡风扇转速都很低,没有出现滴滴响声。
# y, R- ]7 H8 {9 \
1 Q0 ~2 R& b0 K+ J% k( C7 z# `/ E$ C6 H. Q7 u: }$ G: v& p
我通过chipscope抓取了PERST#信号,发现设备卡加电时该信号时高时低,持续时间都不会超过1ms。3 C8 V' I+ `% Z" U: ~( t

3 A: G5 l1 G0 f  s' B1 Y8 e我做了如下分析:
# |9 Z1 j- q/ y" n7 y  B
2 J3 r7 x" \6 @0 k' {         1. 通过万用表测量,发现主机上所有的PCI、PCIe插槽的PERST#引脚都是相连的。
! C% Z2 Y$ v/ g/ s2 {! t         2. 因此正是PERST#信号的时高时低,使得主机的所有PCIe设备都不能正常工作,包括显卡,因此显示器会没信号,进而不能启动。% Q. ^. F6 a! |5 T4 _) P' b% z
7 s' W8 ~2 K5 k- ^& O3 c/ @
但是我不知道是什么原因造成了PERST#信号的时高时低,从系统的拓扑结构来看,当主机撤去PERST#的低电平时,PERST#应该被上拉到高电平才对。
$ }& L5 H+ M4 N3 x: H) H/ U( B1 `+ P: }8 Y, y" ~6 r* M; I
图中的3.3V - 2.5V电平转换器用的TXB0108芯片,参考的是xilinx ml605的原理图,因为v6的pcie核PERST#要求是2.5V电平的。
作者: liqiangln    时间: 2010-8-15 00:46
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的Pcie卡的pin map是否有短路的,电源和地。
  H8 M% Y: m2 `% y' W, g
) p  O2 h' Y3 Q* ^5 l1 k$ Y或者是你看看你设计的V6子卡的pcie连接器的3.3V/12V的电源情况,通常是主板给子卡供电,但是你设计的子卡的3.3V/12V的pin上可能有电,是来自你子卡自身的电源模块,理解吗?% {9 T4 N9 v& Q; N, D
5 c. d: [; C. @, @# g4 B
这样3.3V/12V相当于2个源,主板的电源进入保护状态了。
作者: cuizehan    时间: 2010-8-15 10:33
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的 ...2 ~+ O/ B. l7 x6 W% x+ W
liqiangln 发表于 2010-8-15 00:46

3 ?: W0 n% N. i- e4 k8 B
0 @; g6 a3 ^4 J6 a) J9 C% i0 `, C7 N# W! R
    PCIe连接器并不传送电源,同时PCIe转接卡和FPGA子卡都采用外部电源供电。" G' Q# m3 V& u. f, H4 k
" f  n: l/ E: l) o
    PCIe插槽上的3.3V/12V电源在接到PCIe转接卡的金手指时就做了开路,因此应该不存在3.3V/12V有两个源的情况。
* Z* @% C& J* Z% A7 V, }1 R" [% L1 ]" t0 W
这是PERST的拓扑结构图,再补一下
- d" O! I# s2 `5 v8 l# A
作者: cuizehan    时间: 2010-8-15 11:49
回复 2# liqiangln ( n" I1 j9 f1 U- x( H8 J) B
+ C9 y1 I0 ?& j. G7 a8 m8 r

7 G2 d# x/ x  m4 x    我怀疑是FPGA子卡的存在干扰了PERST#的正常时序,, }. }4 {8 y( a: A( F; m2 d) W
: O) y  j1 I  V" L0 _% g9 S
    现在把子卡上4.7K的上拉电阻去掉后,问题还是存在。
作者: liqiangln    时间: 2010-8-15 16:37
其实在电路中说的信号完整性,电源完整性,干扰,仅仅是针对性能谈的,对于基本功能实现没那么大的危害,不要神化了,还是要从基本的方式解决问题。
, X$ a( U% Q( L5 K$ i3 L; q比如说你的外部电源和你的主机是否是共地,是否有同样的参考点。
7 v3 U; A7 R/ Q
' M* _( N* S$ L% Y0 c! i5 H比如说你FPGA(设备卡)的3.3V和主机的3.3V是什么关系,因为你把设备卡链接上去的时候,这个3.3V就传递到主机卡上了,如果这个3.3V先于主机3.3V电源上电,那么可能造成主机的3.3V电源模块没启动。
作者: cuizehan    时间: 2010-8-15 16:38
又做了一个实验:5 I+ v, J" X7 k) D) T% a  t' e, J
1 S" N0 \" }$ }, Q4 e1 u4 [
    把4.7K电阻焊上,把PCIe转接卡上的0R电阻换成开关。2 }/ u# L! v( \

. e" U+ m+ }3 I6 d6 W+ c$ O" A发现:  K# |3 x0 {: H( }0 [

( Z8 b9 D  \; J8 R3 T, L   若开关断开,则FPGA侧PERST#为高电平;
8 a' C: C) E) d2 R1 a3 v- _0 ]# p   若把开关合上,则PERST#被拉低,FPGA侧PERST#为低电平;5 F* _+ E$ ~3 `
   若此时再把开关断开,则理论上PERST#应该被拉高,但实际中FPGA侧PERST#为低电平,3.3V-2.5V电平转换器的3.3V一端的PERST#电压为1.57V,2.5V一端为0.2V。# {7 ~3 ?' C0 n$ B  Z8 o0 }

0 [; F5 x6 j4 l) I2 {" \推断:3 a  Y) T# i& N- e3 \* Z, f

6 g& Y+ z# |8 H7 Y5 ~    可能是电平转换器的输入阻抗不够大,导致上拉能力不够,换一个470R的上拉电阻试一下。
作者: cuizehan    时间: 2010-8-15 16:40
本帖最后由 cuizehan 于 2010-8-15 16:42 编辑
9 l1 E6 k$ e) Y* g/ o  ~) ~# t
* V! n3 ]  e; ?回复 5# liqiangln
1 a/ H; w4 s  y" b. B3 `2 D; D- t5 ]8 A7 |
! @% C. Q$ i0 z8 w6 M! Y# q
    主机的3.3V电源和设备卡的3.3V电源是隔离的,分别由不同的电源模块产生,且中间没有通路。- X$ o0 k# L8 p1 ~! W
    参考地是一样的。
作者: cuizehan    时间: 2010-8-15 17:12
回复 6# cuizehan 7 f7 f, Z  c9 ^- F0 Q. a

7 k$ C3 V* j6 f  k; p" x7 j1 j1 R- w! _5 S& T
    换了470R上拉电阻后,通过开关手工复位,主机可以正常启动,并且也检测到PCIe设备了。
0 M0 y( n, d5 h$ C0 ?: ]: \2 r/ Q+ N7 R" H4 w
    虽然可以了,但是需要手工操作。下面把开关换回0R电阻再试一试。
作者: cuizehan    时间: 2010-8-16 08:57
通过开关手工复位,和0R电阻,主机都可以正常启动,并且通过PCItree都检测到了该设备。
1 U+ k' h  r# f6 _) j+ I6 r( ]4 G- G$ L, Y* t7 [# T6 z1 t- _
但是,用0R电阻(由主机来实现复位时),PCI配置空间里的BAR寄存器是0,没有分配空间。8 c; `  J' Q# Z  E- h- T3 @
! Q; t2 a/ \" _. c: L* m
通过手工开合开关(手工复位),PCI配置空间的BAR寄存器非0.7 l' D! O9 N; P; s. y* }
( r9 S& A& }  q
还不知道是什么原因造成了这个现象。
作者: liqiangln    时间: 2010-8-16 10:44
你也可以把3.3Vto2.5V的模块,跨过,用分压电阻来实现,看看是否有改善。6 q; |" D1 r% W1 d
# e/ Y4 _* _7 M" p8 I6 c3 h
PCIe金手指上出来RST以外,还有在位检测线号我记得也是默认上拉的,你看看是如何处理的?
3 k1 ?( h- G7 f( ^; w! }2 P* v# U! ^% P! q1 F8 U5 h4 V; l  y2 i+ _
如果你的地址空间没有分配,还是不能工作。
作者: cuizehan    时间: 2010-8-17 15:41
回复 10# liqiangln
! L& G6 @: }) Y2 _& p3 R/ y
2 Z. M( E+ ~  v+ m4 @- C( ]8 @* L( _
    把3.3V-2.5V模块跨过,这个我还没想好怎么弄,主要是焊接上不好实现。
: Y: a7 k+ h1 D! q* O; p. F: b9 h7 l) y/ x7 B% L
    在位检测信号,) D6 Y$ z' E3 N: }0 z2 }
          按照PCIe CEM规范上将,应该是讲两个PRSNT#短接,这样主机才能发现设备,提供电源和时钟。
" y' }+ c+ U/ r8 _5 d0 g/ |' q          实际实现中并没有直接短接,而是用了一个跳线,发现不管有没有短接都没什么影响。
# R# V6 F- p5 `" k& |4 a          之前一个做这方面的工程师给讲过,说一般的PC机是没实现这个功能的,直接给所有的插槽提供给电源和时钟,所以这两个信号可以不用管。
作者: liqiangln    时间: 2010-8-18 09:06
不知道你找到原因没呢?




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2