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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cuizehan 于 2010-8-15 11:22 编辑 , B/ `8 Q5 c9 o" Z0 K7 @9 i

* i+ i/ P4 G9 {% G* w' Y我用的xilinx v6-lx130t-ff783-2的FPGA,来实现一个PCIe设备,整个系统的结构如下图 ! F- q4 b3 w: M* [- m! ]. o& Z
( p$ {1 E& X0 _
* d3 I( N" a7 V7 E: q7 L0 j4 E# j( L. i
FPGA所在的板卡通过一根Cable连到PCIe转接卡,再通过金手指插到主机的PCIe插槽。3 |2 {" ?9 B' K
+ }7 J. ~: m# t2 U2 ^3 V
上图中只画出了PERST#信号的拓扑结构! M; Y9 U8 U+ e$ {4 P

% t' v" `. Q* o+ ]5 s- k" Y# y2 M- i$ E( j+ x; A" m7 [
正常的PCIe设备启动过程如下图% U3 a4 T: F; S& @5 s
  
! G! k: ~: _2 p
9 X! A) `" h2 m  O( N3 \预期的正常情况是:( _! q1 v# j6 ]# {/ E

$ }+ a% r6 z9 Q' x: t, ?9 s         1. 设备卡先加电,因此电源一直处于稳定状态,初始时PERST#被上拉到高电平。
( h& d) N. V+ L3 x+ V3 @/ O         2. 启动主机,在主机POST过程中,PERST#被拉低一段时间,使所有的PCIe设备复位。
. K4 D# l+ z3 Q+ m" |9 y) P/ H         3. 经过一段时间之后,大于tPVPERL,设备完成复位,准备好传输数据,主机撤去PERST#,设备开始工作。
' d+ w+ `+ Y% E+ d6 b  E# Z. X& R: J4 y! j3 l; d
  r% q' h1 J; a" j. h7 H) k7 T5 v
但是现在的情况是:
6 G5 n- `- }5 L& p9 u" }6 M2 A7 x
$ i) b; {) T8 k& R         1. 如果设备卡不加电,则主机能够正常启动。3 i! K$ Q5 F) c0 F5 i0 I. _
         2. 如果设备卡加电,则主机不能启动,显示器没信号,cpu、显卡风扇转速都很低,没有出现滴滴响声。* g9 E& U2 |+ M- o/ v
) d. I5 Y. Q8 H5 u( F% r

! a* c. @8 h" U8 h! |! L我通过chipscope抓取了PERST#信号,发现设备卡加电时该信号时高时低,持续时间都不会超过1ms。, b' I. z: L2 o' H7 S

% Y; s" ~9 i7 S2 O" O我做了如下分析:7 O- m+ K0 s( A+ N$ k

5 [: d+ }2 G! E8 b  ?8 V         1. 通过万用表测量,发现主机上所有的PCI、PCIe插槽的PERST#引脚都是相连的。3 s: G" J& L3 @$ R) R+ A- [, E. I
         2. 因此正是PERST#信号的时高时低,使得主机的所有PCIe设备都不能正常工作,包括显卡,因此显示器会没信号,进而不能启动。8 R% a) Y3 r7 _& p4 v9 N! \( f1 h  C

. Y/ U$ j* f' u1 l但是我不知道是什么原因造成了PERST#信号的时高时低,从系统的拓扑结构来看,当主机撤去PERST#的低电平时,PERST#应该被上拉到高电平才对。# K2 M7 }3 J/ G; w
. u: i5 G0 V# d7 V
图中的3.3V - 2.5V电平转换器用的TXB0108芯片,参考的是xilinx ml605的原理图,因为v6的pcie核PERST#要求是2.5V电平的。

该用户从未签到

2#
发表于 2010-8-15 00:46 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的Pcie卡的pin map是否有短路的,电源和地。
3 Z9 W! E" W. ]
- u1 l2 J- W; l' v& [- ~或者是你看看你设计的V6子卡的pcie连接器的3.3V/12V的电源情况,通常是主板给子卡供电,但是你设计的子卡的3.3V/12V的pin上可能有电,是来自你子卡自身的电源模块,理解吗?
' H9 }# Z' a3 W. R* V3 n5 F4 F: M9 M7 M
这样3.3V/12V相当于2个源,主板的电源进入保护状态了。

该用户从未签到

3#
 楼主| 发表于 2010-8-15 10:33 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的 ...1 w! n( `6 i5 M8 W' m& x% M
liqiangln 发表于 2010-8-15 00:46

( x2 G) q) p5 u5 o! Q6 z+ J& W
' A- s" P! k4 \. E" k9 [5 I  Y- x& _9 X! J, \& E
    PCIe连接器并不传送电源,同时PCIe转接卡和FPGA子卡都采用外部电源供电。
% L& V9 Q  H. O7 ^" C1 |, j1 |" M" i3 O0 E) R+ a9 a
    PCIe插槽上的3.3V/12V电源在接到PCIe转接卡的金手指时就做了开路,因此应该不存在3.3V/12V有两个源的情况。/ x8 c" g! s+ S  W1 h2 j
5 q$ x+ J" W) ^9 M- B# n
这是PERST的拓扑结构图,再补一下
* H% A$ M1 `+ s

该用户从未签到

4#
 楼主| 发表于 2010-8-15 11:49 | 只看该作者
回复 2# liqiangln
. N) J2 y1 W) A' O& s) Z- r, N1 x, l# O; ~( l: i
: w4 \( V: S1 U5 a- R6 y
    我怀疑是FPGA子卡的存在干扰了PERST#的正常时序,
" B, A. P0 J; a1 {7 |' f3 F
$ n$ ^* H& {8 V* A0 K3 T5 l  \    现在把子卡上4.7K的上拉电阻去掉后,问题还是存在。

该用户从未签到

5#
发表于 2010-8-15 16:37 | 只看该作者
其实在电路中说的信号完整性,电源完整性,干扰,仅仅是针对性能谈的,对于基本功能实现没那么大的危害,不要神化了,还是要从基本的方式解决问题。3 a$ m0 S: ]6 d  N% I4 |; o! h& [
比如说你的外部电源和你的主机是否是共地,是否有同样的参考点。; V, r& [3 W. e, e  H: B

1 U/ u1 o: p* C% ?比如说你FPGA(设备卡)的3.3V和主机的3.3V是什么关系,因为你把设备卡链接上去的时候,这个3.3V就传递到主机卡上了,如果这个3.3V先于主机3.3V电源上电,那么可能造成主机的3.3V电源模块没启动。

该用户从未签到

6#
 楼主| 发表于 2010-8-15 16:38 | 只看该作者
又做了一个实验:% H. |5 b8 y$ z, T. O* S& b

2 z" a% M- \0 F    把4.7K电阻焊上,把PCIe转接卡上的0R电阻换成开关。
% L+ @5 _# I& u: J/ J4 R4 J- F& f% y8 }( w1 B- [7 O4 p
发现:) u- g6 `* U, f8 k( B2 Z, L) {
6 Z( J. w2 C2 v! [
   若开关断开,则FPGA侧PERST#为高电平;$ j; G+ e' H0 d- T! A5 S2 y
   若把开关合上,则PERST#被拉低,FPGA侧PERST#为低电平;# x# v( ]# @# ]! c* y, \
   若此时再把开关断开,则理论上PERST#应该被拉高,但实际中FPGA侧PERST#为低电平,3.3V-2.5V电平转换器的3.3V一端的PERST#电压为1.57V,2.5V一端为0.2V。, q( N( J5 F* M
/ b9 L/ a4 p! E& t$ O5 C
推断:+ J7 A6 k% K9 j( _$ w5 w4 R

) c0 s( F* n" s" K; K    可能是电平转换器的输入阻抗不够大,导致上拉能力不够,换一个470R的上拉电阻试一下。

该用户从未签到

7#
 楼主| 发表于 2010-8-15 16:40 | 只看该作者
本帖最后由 cuizehan 于 2010-8-15 16:42 编辑
0 q$ r! t' N9 q: w% G8 B0 a2 ]
+ l" C6 @4 B' ^" p; f) \- @  P: s回复 5# liqiangln
* V0 u4 I0 _! G: {& B" Z8 a) ~% y) k) ?) X; u; n, g  j  ^1 Z" f; E6 J
8 @6 I5 r9 ^4 P& s( g2 x
    主机的3.3V电源和设备卡的3.3V电源是隔离的,分别由不同的电源模块产生,且中间没有通路。7 Z! l. _1 ]8 I4 Z  _9 K* m% f/ z
    参考地是一样的。

该用户从未签到

8#
 楼主| 发表于 2010-8-15 17:12 | 只看该作者
回复 6# cuizehan
% L7 \, A4 b0 y* C& W. P( U" f: v$ I& `

% j! `. B; s6 b" P9 ]/ U( a    换了470R上拉电阻后,通过开关手工复位,主机可以正常启动,并且也检测到PCIe设备了。, c8 L* w/ |4 K1 a
; L8 i5 J" V9 \6 v
    虽然可以了,但是需要手工操作。下面把开关换回0R电阻再试一试。

该用户从未签到

9#
 楼主| 发表于 2010-8-16 08:57 | 只看该作者
通过开关手工复位,和0R电阻,主机都可以正常启动,并且通过PCItree都检测到了该设备。
1 L0 b# ]  g) {& Z4 S3 Q; ~' t% P& c  X( Z7 j9 W
但是,用0R电阻(由主机来实现复位时),PCI配置空间里的BAR寄存器是0,没有分配空间。
8 l9 T: ^7 o  L; }( j) g) J
/ S7 s3 P' e2 e通过手工开合开关(手工复位),PCI配置空间的BAR寄存器非0.! x& p/ a" |4 @3 D) T+ p* ~
0 I& S; ~6 \1 w. `
还不知道是什么原因造成了这个现象。

该用户从未签到

10#
发表于 2010-8-16 10:44 | 只看该作者
你也可以把3.3Vto2.5V的模块,跨过,用分压电阻来实现,看看是否有改善。
. n8 M! ]1 M+ B* _
3 ?8 C/ w. K( X; `PCIe金手指上出来RST以外,还有在位检测线号我记得也是默认上拉的,你看看是如何处理的?- ?4 E/ N. B. S/ j" y- Q2 v! K3 ^! y
: [( @3 y5 {. j# \$ d: t
如果你的地址空间没有分配,还是不能工作。

该用户从未签到

11#
 楼主| 发表于 2010-8-17 15:41 | 只看该作者
回复 10# liqiangln . s( g- W5 L. @# B  s

# i5 o' z( q+ c4 v7 ?" b& U2 ^9 c! `: ~$ y9 |, r, J" x9 ~9 r
    把3.3V-2.5V模块跨过,这个我还没想好怎么弄,主要是焊接上不好实现。
* a2 I- R* X9 c# \$ B7 Q9 |7 ]/ J
* [/ l2 w6 @3 r) s# D    在位检测信号,
% p# s9 r7 L, X0 ]& h5 _" b% I          按照PCIe CEM规范上将,应该是讲两个PRSNT#短接,这样主机才能发现设备,提供电源和时钟。
: P1 J' e  S9 ^( G          实际实现中并没有直接短接,而是用了一个跳线,发现不管有没有短接都没什么影响。
$ ^5 j6 T# X3 {6 v+ C          之前一个做这方面的工程师给讲过,说一般的PC机是没实现这个功能的,直接给所有的插槽提供给电源和时钟,所以这两个信号可以不用管。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-12 09:45 , Processed in 0.140625 second(s), 27 queries , Gzip On.

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

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

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