找回密码
 注册
关于网站域名变更的通知
查看: 5636|回复: 11
打印 上一主题 下一主题

FPGA实现PCIe设备时的一个问题【图已补上】

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2010-8-14 23:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 cuizehan 于 2010-8-15 11:22 编辑
% t7 s6 w) m, A  r! i# _# R2 e4 `' @6 o$ R( B  v- k; K8 ?& d
我用的xilinx v6-lx130t-ff783-2的FPGA,来实现一个PCIe设备,整个系统的结构如下图
4 |5 f" h: a% ]% f( r$ _3 s& E2 Q; y# q3 b5 t) z) L1 h  F4 d; V
0 N) t( J+ E8 \$ x' e3 F& F
FPGA所在的板卡通过一根Cable连到PCIe转接卡,再通过金手指插到主机的PCIe插槽。8 |7 v5 T" [% p
+ V1 j( A  u/ W& B
上图中只画出了PERST#信号的拓扑结构
/ e5 I5 K& H: S7 ~& k% b1 _
. O" y( k) p- t6 u
8 W" n9 b/ y; |! t7 t0 {+ y正常的PCIe设备启动过程如下图, q" E6 f( F* K" u
  ( G" W9 i  Q; s4 K+ L4 {

5 M1 l1 Z1 p! d& F! _3 j& M$ Z预期的正常情况是:
/ b6 x+ ]+ f! }- t2 L
$ ~) j5 h: o6 ?         1. 设备卡先加电,因此电源一直处于稳定状态,初始时PERST#被上拉到高电平。$ V) N6 [* V. b, M& @0 S
         2. 启动主机,在主机POST过程中,PERST#被拉低一段时间,使所有的PCIe设备复位。
5 E9 T* P6 X/ h& }         3. 经过一段时间之后,大于tPVPERL,设备完成复位,准备好传输数据,主机撤去PERST#,设备开始工作。
9 x. J! ~% D+ t( j( D$ t. M5 U" Q6 M' Z" f' V! J' U$ |3 l1 \

: u& Q8 |1 I# \& S但是现在的情况是:
0 g+ y3 S4 \; K2 k
7 O, E3 ^+ |& g1 w8 k% p         1. 如果设备卡不加电,则主机能够正常启动。
7 @3 g. K% Q+ V) ?: d- J         2. 如果设备卡加电,则主机不能启动,显示器没信号,cpu、显卡风扇转速都很低,没有出现滴滴响声。
5 i$ A9 Y( R( _4 M2 k" a, q: t0 Q6 Q+ g2 q6 r1 V

7 a9 S) O! \7 R/ W/ c我通过chipscope抓取了PERST#信号,发现设备卡加电时该信号时高时低,持续时间都不会超过1ms。
$ ]% v: H" l0 U! L. D/ y9 s3 M! O) N1 s3 u# h0 {' ?
我做了如下分析:) @  t, F3 Z" R2 Y2 @" a, s

! I# a! a7 [! p0 ~         1. 通过万用表测量,发现主机上所有的PCI、PCIe插槽的PERST#引脚都是相连的。
3 P9 E8 O- X4 r  z4 I         2. 因此正是PERST#信号的时高时低,使得主机的所有PCIe设备都不能正常工作,包括显卡,因此显示器会没信号,进而不能启动。' ?9 t+ c9 X  G# n9 A, ?! W+ B" C3 Y
2 N4 z7 D1 q1 a  D8 t
但是我不知道是什么原因造成了PERST#信号的时高时低,从系统的拓扑结构来看,当主机撤去PERST#的低电平时,PERST#应该被上拉到高电平才对。
% e1 ?; r1 w% K0 e
; k' n5 a. m/ M3 j6 _! X图中的3.3V - 2.5V电平转换器用的TXB0108芯片,参考的是xilinx ml605的原理图,因为v6的pcie核PERST#要求是2.5V电平的。

该用户从未签到

2#
发表于 2010-8-15 00:46 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的Pcie卡的pin map是否有短路的,电源和地。
- I" ?& I3 \1 h  m+ V/ P
( N$ y& @0 b& l- T& ]或者是你看看你设计的V6子卡的pcie连接器的3.3V/12V的电源情况,通常是主板给子卡供电,但是你设计的子卡的3.3V/12V的pin上可能有电,是来自你子卡自身的电源模块,理解吗?  k! `7 D& u5 V& l0 F/ N
1 ]) [0 T" P1 M
这样3.3V/12V相当于2个源,主板的电源进入保护状态了。

该用户从未签到

3#
 楼主| 发表于 2010-8-15 10:33 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的 ...
- l" s7 X3 R  N& h( Rliqiangln 发表于 2010-8-15 00:46

9 l/ O8 I9 }' F% I
' U8 K1 [  F1 J- O0 z3 t# ?7 H+ o( S$ W0 d
    PCIe连接器并不传送电源,同时PCIe转接卡和FPGA子卡都采用外部电源供电。
& W0 K7 R' A* h4 Q' n, v  c4 g8 q/ r; i$ C9 I$ s+ _* C
    PCIe插槽上的3.3V/12V电源在接到PCIe转接卡的金手指时就做了开路,因此应该不存在3.3V/12V有两个源的情况。: a5 i& R; w. Q! e* M/ x9 ]8 K; h
6 o. H& J: ]' y! L+ c  y; J% ^7 D
这是PERST的拓扑结构图,再补一下' m) T; V9 M- a; @0 F

该用户从未签到

4#
 楼主| 发表于 2010-8-15 11:49 | 只看该作者
回复 2# liqiangln & Z4 p; w6 U% w3 D, C
4 p4 x" u! B/ i- r- W

( C# `* d/ n( u9 Y    我怀疑是FPGA子卡的存在干扰了PERST#的正常时序,
! Z/ T& v( q! I* G; P5 D4 `
) E. N$ y. T: @$ r    现在把子卡上4.7K的上拉电阻去掉后,问题还是存在。

该用户从未签到

5#
发表于 2010-8-15 16:37 | 只看该作者
其实在电路中说的信号完整性,电源完整性,干扰,仅仅是针对性能谈的,对于基本功能实现没那么大的危害,不要神化了,还是要从基本的方式解决问题。
, ]  J+ s: Z+ q, Y比如说你的外部电源和你的主机是否是共地,是否有同样的参考点。- c: @6 y6 d  q7 l

0 `: o7 y6 P$ j: {比如说你FPGA(设备卡)的3.3V和主机的3.3V是什么关系,因为你把设备卡链接上去的时候,这个3.3V就传递到主机卡上了,如果这个3.3V先于主机3.3V电源上电,那么可能造成主机的3.3V电源模块没启动。

该用户从未签到

6#
 楼主| 发表于 2010-8-15 16:38 | 只看该作者
又做了一个实验:
; p  F8 J. N* `; t- I- C
5 R' ~: @1 |" c6 G) J9 t    把4.7K电阻焊上,把PCIe转接卡上的0R电阻换成开关。2 s% J7 _( Q& o+ X' U' k
( n+ k$ a% G( u
发现:
: c6 M6 s, w/ U8 _2 n+ t9 v) k, z
   若开关断开,则FPGA侧PERST#为高电平;+ q/ `; E, K4 T2 _! i) Y
   若把开关合上,则PERST#被拉低,FPGA侧PERST#为低电平;7 k" ~7 R8 n$ J
   若此时再把开关断开,则理论上PERST#应该被拉高,但实际中FPGA侧PERST#为低电平,3.3V-2.5V电平转换器的3.3V一端的PERST#电压为1.57V,2.5V一端为0.2V。8 g& i2 c/ b, K- y( j" r

3 z+ f$ U/ C  y3 C! ?; B4 y: u推断:/ k: D5 v3 Q1 c1 e* r9 L
" j9 z5 ^' Q) T* {5 f8 c) V4 i
    可能是电平转换器的输入阻抗不够大,导致上拉能力不够,换一个470R的上拉电阻试一下。

该用户从未签到

7#
 楼主| 发表于 2010-8-15 16:40 | 只看该作者
本帖最后由 cuizehan 于 2010-8-15 16:42 编辑
1 q! r! y9 _* o* d4 _. O: [% A, c- x( e/ U: Z; u/ z8 }8 w
回复 5# liqiangln
1 s) `% A( T2 U$ R$ G& Z3 ~9 }# f" F: ~4 O* C
0 z3 l) y1 U- c7 q8 a$ l
    主机的3.3V电源和设备卡的3.3V电源是隔离的,分别由不同的电源模块产生,且中间没有通路。
# e9 f4 s" s% c+ S, E( L    参考地是一样的。

该用户从未签到

8#
 楼主| 发表于 2010-8-15 17:12 | 只看该作者
回复 6# cuizehan . C3 h) A/ f7 t+ F

3 P' Q" ^  j! G3 i  }5 n0 Z" U+ H9 i: ]; Q0 O
    换了470R上拉电阻后,通过开关手工复位,主机可以正常启动,并且也检测到PCIe设备了。
% U! j" f/ `$ F: T1 e# r
0 z8 I  p9 }8 k* \) Q    虽然可以了,但是需要手工操作。下面把开关换回0R电阻再试一试。

该用户从未签到

9#
 楼主| 发表于 2010-8-16 08:57 | 只看该作者
通过开关手工复位,和0R电阻,主机都可以正常启动,并且通过PCItree都检测到了该设备。6 T/ C* b' b( J6 d5 {# }# Q

, s- y& q& M4 u! @) j- [: l7 H但是,用0R电阻(由主机来实现复位时),PCI配置空间里的BAR寄存器是0,没有分配空间。* Q) r8 {( F5 Y: z5 J# {2 X0 M

$ [$ k. [6 @: e  _" Z. l3 \通过手工开合开关(手工复位),PCI配置空间的BAR寄存器非0.
7 _4 n, w% j& t2 [' V& l
/ q3 Z* E! \0 S还不知道是什么原因造成了这个现象。

该用户从未签到

10#
发表于 2010-8-16 10:44 | 只看该作者
你也可以把3.3Vto2.5V的模块,跨过,用分压电阻来实现,看看是否有改善。
3 {3 |/ S5 \: H( j" B" D* l9 k7 q$ L
PCIe金手指上出来RST以外,还有在位检测线号我记得也是默认上拉的,你看看是如何处理的?
7 r* }5 R1 q4 P9 r8 r3 k; ?
- f5 Z  p" M9 F. I  H5 |8 [. m如果你的地址空间没有分配,还是不能工作。

该用户从未签到

11#
 楼主| 发表于 2010-8-17 15:41 | 只看该作者
回复 10# liqiangln
& ~8 [' @6 C4 e7 I- E" v* |/ |4 }+ }+ u+ U# ?# s$ r3 X

9 ~& F3 ~+ P) L    把3.3V-2.5V模块跨过,这个我还没想好怎么弄,主要是焊接上不好实现。9 Q5 e1 M9 i2 o0 @$ q

, V0 Y9 U4 ?$ m, i4 J    在位检测信号,! |8 u) L0 j7 j0 h& O
          按照PCIe CEM规范上将,应该是讲两个PRSNT#短接,这样主机才能发现设备,提供电源和时钟。  M0 n/ O: _6 P9 ?- X
          实际实现中并没有直接短接,而是用了一个跳线,发现不管有没有短接都没什么影响。
' f/ p  x. a1 F- c7 ~          之前一个做这方面的工程师给讲过,说一般的PC机是没实现这个功能的,直接给所有的插槽提供给电源和时钟,所以这两个信号可以不用管。

该用户从未签到

12#
发表于 2010-8-18 09:06 | 只看该作者
不知道你找到原因没呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-22 09:44 , Processed in 0.171875 second(s), 28 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表