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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cuizehan 于 2010-8-15 11:22 编辑 4 X! _5 G* x4 ]' m
4 w( r9 h7 K' s+ R$ d' k
我用的xilinx v6-lx130t-ff783-2的FPGA,来实现一个PCIe设备,整个系统的结构如下图 5 @+ b7 Z5 H2 c( G4 |: r; K: n1 A
0 e7 I# P& l6 ?
' r7 W. |5 P7 r( f, T2 x* H
FPGA所在的板卡通过一根Cable连到PCIe转接卡,再通过金手指插到主机的PCIe插槽。
! y; Q/ H7 ]! R
, R; j5 c  E+ d上图中只画出了PERST#信号的拓扑结构! f( r4 I3 |* n  ~) d1 }  J: y
! {7 H  K# [  g7 a/ c/ o2 j

  z. H+ W" x: Z5 ^! n正常的PCIe设备启动过程如下图
' S5 F5 J9 k  ?+ k& K  0 o( Z, M- _* z8 [& f+ c6 s0 ]

2 {7 m  v2 n) i5 Z( _预期的正常情况是:  K" _! X5 y/ y0 u& ~& x3 J
9 b* V8 s  T0 t. m; r1 `: M' q+ M4 o
         1. 设备卡先加电,因此电源一直处于稳定状态,初始时PERST#被上拉到高电平。, k% \# u- ?, c' K! b* R: N
         2. 启动主机,在主机POST过程中,PERST#被拉低一段时间,使所有的PCIe设备复位。
3 q& w4 w8 X7 B         3. 经过一段时间之后,大于tPVPERL,设备完成复位,准备好传输数据,主机撤去PERST#,设备开始工作。5 a- [! p7 ?3 J! ?

4 x# u+ n, A. s3 E* |5 I* P2 M1 T
但是现在的情况是:
" K0 A/ K% R6 h) g$ H+ F/ O7 R7 q
. f, i- m1 ^& @8 j7 M0 Y) N         1. 如果设备卡不加电,则主机能够正常启动。. v" m! F* x  w; o! m9 u$ B
         2. 如果设备卡加电,则主机不能启动,显示器没信号,cpu、显卡风扇转速都很低,没有出现滴滴响声。
7 {& U( A$ y* v" q0 l* K5 N+ K
$ ~/ Y* L; N. f7 U, C
% F' `" l+ y7 M2 @5 I* F; H4 W( T我通过chipscope抓取了PERST#信号,发现设备卡加电时该信号时高时低,持续时间都不会超过1ms。
- _+ G6 |% z; _) D* _  U, M' S; i( w9 \) z  M
我做了如下分析:
7 U; F- [0 q, u
* q- R: \$ l+ I7 R) I4 G. ?         1. 通过万用表测量,发现主机上所有的PCI、PCIe插槽的PERST#引脚都是相连的。
% I4 R; v6 r/ ?5 i         2. 因此正是PERST#信号的时高时低,使得主机的所有PCIe设备都不能正常工作,包括显卡,因此显示器会没信号,进而不能启动。) m4 ~$ N6 P/ M" T- |, Y
6 k8 t1 I( T# B+ [% S' j6 Y1 y+ c
但是我不知道是什么原因造成了PERST#信号的时高时低,从系统的拓扑结构来看,当主机撤去PERST#的低电平时,PERST#应该被上拉到高电平才对。6 i0 ^: Y! x) V2 a- Y

  W; {7 U: ?5 k4 X0 z+ ~% T图中的3.3V - 2.5V电平转换器用的TXB0108芯片,参考的是xilinx ml605的原理图,因为v6的pcie核PERST#要求是2.5V电平的。

该用户从未签到

2#
发表于 2010-8-15 00:46 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的Pcie卡的pin map是否有短路的,电源和地。
6 ~0 k) E/ {0 ^# d2 _) d5 R* @3 e1 m/ u9 P. J7 l8 |
或者是你看看你设计的V6子卡的pcie连接器的3.3V/12V的电源情况,通常是主板给子卡供电,但是你设计的子卡的3.3V/12V的pin上可能有电,是来自你子卡自身的电源模块,理解吗?
( t% ?5 H7 ~% c% V" C9 k- p; B
. }" z7 k7 O6 }: O- M这样3.3V/12V相当于2个源,主板的电源进入保护状态了。

该用户从未签到

3#
 楼主| 发表于 2010-8-15 10:33 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的 ..., R5 ]* r0 D6 I3 t0 n5 G
liqiangln 发表于 2010-8-15 00:46

+ o8 H0 D2 }( `1 s5 h: g* r, v/ s+ R$ R
6 A1 C, U% E% h: l/ h+ h! a( y1 @4 P/ ?9 o. L+ U
    PCIe连接器并不传送电源,同时PCIe转接卡和FPGA子卡都采用外部电源供电。0 j7 \/ S7 Z8 I8 o7 d

4 x5 A$ Z$ O$ B    PCIe插槽上的3.3V/12V电源在接到PCIe转接卡的金手指时就做了开路,因此应该不存在3.3V/12V有两个源的情况。$ C) g  Y8 X/ F7 [
' E- y- ]9 E. O- p
这是PERST的拓扑结构图,再补一下
6 [1 s) k& x% Z, r

该用户从未签到

4#
 楼主| 发表于 2010-8-15 11:49 | 只看该作者
回复 2# liqiangln 6 T* K* v9 x/ r

' |! C1 J) e  e1 l; v
2 A3 W+ F! M, l+ K1 o; |& K    我怀疑是FPGA子卡的存在干扰了PERST#的正常时序,
) b# k7 S# `& M
9 W1 V$ Y) \+ V( V( R7 q% Z# N9 W    现在把子卡上4.7K的上拉电阻去掉后,问题还是存在。

该用户从未签到

5#
发表于 2010-8-15 16:37 | 只看该作者
其实在电路中说的信号完整性,电源完整性,干扰,仅仅是针对性能谈的,对于基本功能实现没那么大的危害,不要神化了,还是要从基本的方式解决问题。
7 ]" a0 `# M$ S比如说你的外部电源和你的主机是否是共地,是否有同样的参考点。% H" ?( }3 x  d6 [9 j, }1 M  `
/ ?$ M: w! k! ^
比如说你FPGA(设备卡)的3.3V和主机的3.3V是什么关系,因为你把设备卡链接上去的时候,这个3.3V就传递到主机卡上了,如果这个3.3V先于主机3.3V电源上电,那么可能造成主机的3.3V电源模块没启动。

该用户从未签到

6#
 楼主| 发表于 2010-8-15 16:38 | 只看该作者
又做了一个实验:! u' C- [0 Z! R

; ~% V% o9 V# W3 ^+ {6 S' G) m    把4.7K电阻焊上,把PCIe转接卡上的0R电阻换成开关。
  J* w& a- T7 t/ R; r6 J0 L- S: [6 f0 o
发现:8 o5 J0 ^& w9 _: f; _9 B' T( p* Y
, t. g: X% S0 b
   若开关断开,则FPGA侧PERST#为高电平;8 K& j5 U2 N/ c- Q$ S  X8 t* S
   若把开关合上,则PERST#被拉低,FPGA侧PERST#为低电平;; {! [$ Z) A- b# h& Y
   若此时再把开关断开,则理论上PERST#应该被拉高,但实际中FPGA侧PERST#为低电平,3.3V-2.5V电平转换器的3.3V一端的PERST#电压为1.57V,2.5V一端为0.2V。. Y$ Z' }6 b, }+ Z1 E4 D* q
/ L: ?6 w7 q" Z' ~" O
推断:
4 F9 n3 X1 K" m* ?" |% z
! i8 l2 A# e, N3 _. |6 P    可能是电平转换器的输入阻抗不够大,导致上拉能力不够,换一个470R的上拉电阻试一下。

该用户从未签到

7#
 楼主| 发表于 2010-8-15 16:40 | 只看该作者
本帖最后由 cuizehan 于 2010-8-15 16:42 编辑
# t; M4 d/ s7 O8 k7 a$ y5 {0 v) F) t; i1 M8 E
回复 5# liqiangln
8 X7 |  N# C4 {) D  j
. @5 g, A1 y4 X9 |. ^0 Y# m) a* p) j9 W& ?$ t: T' j0 v$ G
    主机的3.3V电源和设备卡的3.3V电源是隔离的,分别由不同的电源模块产生,且中间没有通路。: n- l- f, ?$ x
    参考地是一样的。

该用户从未签到

8#
 楼主| 发表于 2010-8-15 17:12 | 只看该作者
回复 6# cuizehan 9 E" H( @2 q8 T- ?7 y# ^

( s# d, l7 j( S: r
9 B  W/ Q9 }$ o    换了470R上拉电阻后,通过开关手工复位,主机可以正常启动,并且也检测到PCIe设备了。+ d( d* T* X/ T* v
: u" l, U' J/ M
    虽然可以了,但是需要手工操作。下面把开关换回0R电阻再试一试。

该用户从未签到

9#
 楼主| 发表于 2010-8-16 08:57 | 只看该作者
通过开关手工复位,和0R电阻,主机都可以正常启动,并且通过PCItree都检测到了该设备。! H  I/ _6 a- [6 ]; ]! j: _% W

8 Q9 j! z. g$ u7 }" k! l但是,用0R电阻(由主机来实现复位时),PCI配置空间里的BAR寄存器是0,没有分配空间。
- d- A: }9 x. H4 G1 O( t; @6 A6 {% ?" i' n4 k: T
通过手工开合开关(手工复位),PCI配置空间的BAR寄存器非0.: K& i: Y6 [8 H! v1 o" k7 p

& q' d+ k& ^( B4 C2 w- Q' r, p& k还不知道是什么原因造成了这个现象。

该用户从未签到

10#
发表于 2010-8-16 10:44 | 只看该作者
你也可以把3.3Vto2.5V的模块,跨过,用分压电阻来实现,看看是否有改善。5 @/ C7 B6 F0 G: z- L2 C& A
9 q+ d) o: t9 o8 y) w
PCIe金手指上出来RST以外,还有在位检测线号我记得也是默认上拉的,你看看是如何处理的?& m2 o# Z/ e5 k! p2 @
5 @$ m. U5 F: K* x
如果你的地址空间没有分配,还是不能工作。

该用户从未签到

11#
 楼主| 发表于 2010-8-17 15:41 | 只看该作者
回复 10# liqiangln
' K0 W' v4 D* U, L( M) Q. R( v' Q! F

4 u/ b% {  E! E" D" L6 X    把3.3V-2.5V模块跨过,这个我还没想好怎么弄,主要是焊接上不好实现。: T0 q. V5 s0 ^+ r5 f' O' h0 {

" p5 s% ^) V3 ]2 Y, O    在位检测信号,5 u8 W+ i9 q. O9 v  T
          按照PCIe CEM规范上将,应该是讲两个PRSNT#短接,这样主机才能发现设备,提供电源和时钟。
  p1 k+ k! r/ _8 `8 Y+ r8 N          实际实现中并没有直接短接,而是用了一个跳线,发现不管有没有短接都没什么影响。/ [5 I* e3 w; H
          之前一个做这方面的工程师给讲过,说一般的PC机是没实现这个功能的,直接给所有的插槽提供给电源和时钟,所以这两个信号可以不用管。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-19 07:36 , Processed in 0.140625 second(s), 27 queries , Gzip On.

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

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

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