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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cuizehan 于 2010-8-15 11:22 编辑 9 A1 k) ?" r3 L' ]" W3 n( w
8 @7 ^0 \( N3 ?( Y, N. F+ o( ?% D$ r. ]
我用的xilinx v6-lx130t-ff783-2的FPGA,来实现一个PCIe设备,整个系统的结构如下图 " N3 g* q+ n+ y

) V$ w1 U. s: {' c( K( z 7 q' Q! y$ `" Z" M
FPGA所在的板卡通过一根Cable连到PCIe转接卡,再通过金手指插到主机的PCIe插槽。
* n% C" R5 Q! v2 x# q6 |* ~9 G
! k& m! k+ V* B+ Y" ^" h! a上图中只画出了PERST#信号的拓扑结构
, E( F* w* V0 ]! }2 _, Q% O
7 Z7 u4 @+ ?9 T( d# h& G& W9 x& G7 U6 H+ l
正常的PCIe设备启动过程如下图
5 y+ p4 f. X1 n* B, Z  7 ^  _) J. x3 ?4 y7 _
( |' y! K% W5 L: U1 l
预期的正常情况是:6 A( j8 U' X! x6 M+ f
; c: A1 A( [% t% F' V" I; L- @) C
         1. 设备卡先加电,因此电源一直处于稳定状态,初始时PERST#被上拉到高电平。- B9 B0 p2 i& \& D
         2. 启动主机,在主机POST过程中,PERST#被拉低一段时间,使所有的PCIe设备复位。0 f6 d- R" F2 D9 }) t
         3. 经过一段时间之后,大于tPVPERL,设备完成复位,准备好传输数据,主机撤去PERST#,设备开始工作。
; k3 T6 u' W4 c' d) h4 z4 v
( N) I3 v9 L+ ~
5 D" g: J1 L- e: V但是现在的情况是:
$ O1 V+ d; \. w7 n" }% c& Q
: P% R" b( }7 G2 q7 _( V6 |         1. 如果设备卡不加电,则主机能够正常启动。
$ _7 K" V3 N% t) ]7 U/ y         2. 如果设备卡加电,则主机不能启动,显示器没信号,cpu、显卡风扇转速都很低,没有出现滴滴响声。
$ q/ y8 M: |. v4 S4 D2 s( h
) i5 z' s8 E9 V1 e! \% L' L4 M0 M5 w4 j
我通过chipscope抓取了PERST#信号,发现设备卡加电时该信号时高时低,持续时间都不会超过1ms。" j& v' e$ V# K2 l4 v$ Y* K
, W( P. o5 z5 m7 e6 c/ r
我做了如下分析:
: s/ [, k1 [( D* ~
0 w4 ^& ^9 @& ~/ H  F, R         1. 通过万用表测量,发现主机上所有的PCI、PCIe插槽的PERST#引脚都是相连的。) L) H* `! }3 r0 B7 A
         2. 因此正是PERST#信号的时高时低,使得主机的所有PCIe设备都不能正常工作,包括显卡,因此显示器会没信号,进而不能启动。
1 u" a0 e5 z  {3 |/ t. A- {4 g9 ~  W" Y9 B; A
但是我不知道是什么原因造成了PERST#信号的时高时低,从系统的拓扑结构来看,当主机撤去PERST#的低电平时,PERST#应该被上拉到高电平才对。
, ^# D/ N( L3 f& \7 S% X
# K+ q$ H# _& \* w图中的3.3V - 2.5V电平转换器用的TXB0108芯片,参考的是xilinx ml605的原理图,因为v6的pcie核PERST#要求是2.5V电平的。

该用户从未签到

2#
发表于 2010-8-15 00:46 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的Pcie卡的pin map是否有短路的,电源和地。
2 R# q5 ~( b( f1 O8 }9 E* z! G$ G+ a% n. X; ?; p. g* u
或者是你看看你设计的V6子卡的pcie连接器的3.3V/12V的电源情况,通常是主板给子卡供电,但是你设计的子卡的3.3V/12V的pin上可能有电,是来自你子卡自身的电源模块,理解吗?5 l# J' ^/ ^" g$ z

5 ]4 q( k+ t  L. Z0 O这样3.3V/12V相当于2个源,主板的电源进入保护状态了。

该用户从未签到

3#
 楼主| 发表于 2010-8-15 10:33 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的 ...4 N* v1 R: u" W: s5 [* e
liqiangln 发表于 2010-8-15 00:46
; u3 U, h: h) m$ R

; W* O( _% A$ {3 @  m0 R' G% {
" J7 ~# H; U) E  P% C7 f+ d+ z( g    PCIe连接器并不传送电源,同时PCIe转接卡和FPGA子卡都采用外部电源供电。% G6 h, j/ Z4 V- Q

8 p) N- Q* t3 R, {    PCIe插槽上的3.3V/12V电源在接到PCIe转接卡的金手指时就做了开路,因此应该不存在3.3V/12V有两个源的情况。4 C3 H" |4 h/ U8 z- O$ |' _

3 w0 Y9 W8 K4 _5 V这是PERST的拓扑结构图,再补一下  S' p7 k0 n" ^4 H4 P% L3 `7 |+ i

该用户从未签到

4#
 楼主| 发表于 2010-8-15 11:49 | 只看该作者
回复 2# liqiangln
6 v  c6 U, v6 |8 K8 A% A. Q2 F6 q" G2 ]4 {1 Z4 c

; a5 b" r& ?2 ^) q( R! e! l2 d- ]7 r    我怀疑是FPGA子卡的存在干扰了PERST#的正常时序,
) W/ k1 D2 y" |8 R' ~8 m- ~3 H9 g' O+ a4 R% O( I8 ^7 d
    现在把子卡上4.7K的上拉电阻去掉后,问题还是存在。

该用户从未签到

5#
发表于 2010-8-15 16:37 | 只看该作者
其实在电路中说的信号完整性,电源完整性,干扰,仅仅是针对性能谈的,对于基本功能实现没那么大的危害,不要神化了,还是要从基本的方式解决问题。
" e# w- ]3 J$ ?  R, l. l比如说你的外部电源和你的主机是否是共地,是否有同样的参考点。. L7 o- T& G' B9 W
  V, A* e6 r8 g% j) |) t/ z
比如说你FPGA(设备卡)的3.3V和主机的3.3V是什么关系,因为你把设备卡链接上去的时候,这个3.3V就传递到主机卡上了,如果这个3.3V先于主机3.3V电源上电,那么可能造成主机的3.3V电源模块没启动。

该用户从未签到

6#
 楼主| 发表于 2010-8-15 16:38 | 只看该作者
又做了一个实验:
2 t) F5 G3 V* S) J/ B1 j3 ~* s/ S/ z% B: Y& L* W1 w
    把4.7K电阻焊上,把PCIe转接卡上的0R电阻换成开关。
* Q7 U9 e$ ]" C! I( ]* m) y; u0 O4 o, X
发现:
; |. o0 t, J4 t) N3 n1 `; X2 e' d0 \- ~, E+ X' H4 O+ `
   若开关断开,则FPGA侧PERST#为高电平;& Q: z! Y  d# c
   若把开关合上,则PERST#被拉低,FPGA侧PERST#为低电平;; h2 j2 ~* s/ ]
   若此时再把开关断开,则理论上PERST#应该被拉高,但实际中FPGA侧PERST#为低电平,3.3V-2.5V电平转换器的3.3V一端的PERST#电压为1.57V,2.5V一端为0.2V。
# I! b9 a  ^& `4 P2 ]& o9 h" w* a* D4 d4 G* c0 D
推断:
: f0 T6 J! j. b( v% m1 }: e
  _! W2 R! {8 G& K    可能是电平转换器的输入阻抗不够大,导致上拉能力不够,换一个470R的上拉电阻试一下。

该用户从未签到

7#
 楼主| 发表于 2010-8-15 16:40 | 只看该作者
本帖最后由 cuizehan 于 2010-8-15 16:42 编辑 0 c+ K% ^( U7 d9 a5 [& ^) z- i& q

2 I% ^( Y% b7 E8 W4 b8 x回复 5# liqiangln 3 Q: Q) l' ?5 E$ E9 h; l

0 F! O( V% `4 f/ [+ P; f/ o, l+ ]8 E5 z
    主机的3.3V电源和设备卡的3.3V电源是隔离的,分别由不同的电源模块产生,且中间没有通路。
) U" d- _; P1 D- l    参考地是一样的。

该用户从未签到

8#
 楼主| 发表于 2010-8-15 17:12 | 只看该作者
回复 6# cuizehan 5 _( V8 c  W/ Y1 Y) Q- y
2 J9 Y. `* {& h5 r/ j- K6 ?7 [6 ?
3 t* e4 Q6 x- z* o) f+ D$ s
    换了470R上拉电阻后,通过开关手工复位,主机可以正常启动,并且也检测到PCIe设备了。9 U; T( _$ w# u2 s1 b0 L5 M' _) k
4 d* Z/ l5 @7 n- `/ G% L3 f" ^  |
    虽然可以了,但是需要手工操作。下面把开关换回0R电阻再试一试。

该用户从未签到

9#
 楼主| 发表于 2010-8-16 08:57 | 只看该作者
通过开关手工复位,和0R电阻,主机都可以正常启动,并且通过PCItree都检测到了该设备。/ b% J0 \' N' t1 C0 k; I

. ~+ _# C$ @% F- ]; Q: m  M但是,用0R电阻(由主机来实现复位时),PCI配置空间里的BAR寄存器是0,没有分配空间。% A/ Z8 T0 y- \& R
5 c+ ~& z  `; @2 O
通过手工开合开关(手工复位),PCI配置空间的BAR寄存器非0.
1 b# A% K/ [( ?+ X( N- r
' \' t& n- |2 u0 h还不知道是什么原因造成了这个现象。

该用户从未签到

10#
发表于 2010-8-16 10:44 | 只看该作者
你也可以把3.3Vto2.5V的模块,跨过,用分压电阻来实现,看看是否有改善。
" j* W9 F$ ^. q% e5 P# d8 n) D6 U, l0 [- Q& v3 x% [) Y' s! z
PCIe金手指上出来RST以外,还有在位检测线号我记得也是默认上拉的,你看看是如何处理的?
5 {7 `9 H) l4 v: E' R5 g0 E0 b& w/ m8 Y- w$ ?9 v/ j9 n0 g
如果你的地址空间没有分配,还是不能工作。

该用户从未签到

11#
 楼主| 发表于 2010-8-17 15:41 | 只看该作者
回复 10# liqiangln
3 Q1 H) j! f- ~2 g
7 L1 n3 y3 ~% Z* {* L( _+ ?, j. _( l1 a0 H, N
    把3.3V-2.5V模块跨过,这个我还没想好怎么弄,主要是焊接上不好实现。3 _4 s# B4 f* j6 \4 d: Q
  u$ X4 @! O7 k& X3 Z
    在位检测信号,# `9 ^/ H& H+ _1 s. d, i$ m2 A7 B( }
          按照PCIe CEM规范上将,应该是讲两个PRSNT#短接,这样主机才能发现设备,提供电源和时钟。5 S/ X' o3 W  G; i' c
          实际实现中并没有直接短接,而是用了一个跳线,发现不管有没有短接都没什么影响。
# J$ P0 t' c$ T, [* Y          之前一个做这方面的工程师给讲过,说一般的PC机是没实现这个功能的,直接给所有的插槽提供给电源和时钟,所以这两个信号可以不用管。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-11 13:04 , Processed in 0.125000 second(s), 27 queries , Gzip On.

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

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

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