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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cuizehan 于 2010-8-15 11:22 编辑
" A3 ^& i: B" f+ t9 Q
0 i, f% q. V2 C) l; z5 Z2 A$ \3 ?+ ]我用的xilinx v6-lx130t-ff783-2的FPGA,来实现一个PCIe设备,整个系统的结构如下图 ' `% c+ ]/ L, t

1 ^& ^: G7 [0 M. a9 `& E2 W
, ~" z( S1 W! h+ Z9 i6 NFPGA所在的板卡通过一根Cable连到PCIe转接卡,再通过金手指插到主机的PCIe插槽。
1 B2 j: D" }( q* L( k
1 Y( W6 i: R1 h3 `上图中只画出了PERST#信号的拓扑结构
' z- X8 `$ T1 x9 ]) a! c9 l* \  _5 q. Y

; l: O8 C4 K9 v" A  k# Q5 [正常的PCIe设备启动过程如下图
, p$ M- A; n4 N9 L) b2 |$ Z$ N" M  
2 f: o3 m6 h$ }
  ?7 S5 d' h+ {; T" o* |0 s预期的正常情况是:, N6 i8 T+ h4 u* v3 o

( A. ?* o" x  M         1. 设备卡先加电,因此电源一直处于稳定状态,初始时PERST#被上拉到高电平。
% U& b% @& T- F         2. 启动主机,在主机POST过程中,PERST#被拉低一段时间,使所有的PCIe设备复位。/ x: H, P7 I3 h+ `1 J$ o
         3. 经过一段时间之后,大于tPVPERL,设备完成复位,准备好传输数据,主机撤去PERST#,设备开始工作。
8 J$ |2 d6 d4 Z  x: z( W: {/ q
; A) `1 u; R! _+ E( _% }2 B
/ ~# g, x* q$ b但是现在的情况是:# ]( v1 L  S/ h5 g2 D. O% B' T

& L9 p! ^8 {' D  b. h         1. 如果设备卡不加电,则主机能够正常启动。
1 W! x+ K. Z% _* b+ {         2. 如果设备卡加电,则主机不能启动,显示器没信号,cpu、显卡风扇转速都很低,没有出现滴滴响声。
( l- L! e; w! i: X% b2 m/ K4 I
- F7 R  k9 h7 x: i. N& c
我通过chipscope抓取了PERST#信号,发现设备卡加电时该信号时高时低,持续时间都不会超过1ms。' S# n7 g/ t- v) r6 @* J0 ~

$ ^! ~& @1 ?6 j4 _' |5 ]8 i我做了如下分析:8 B7 k: X" l: b" W$ Z* J
% H& z1 `2 Z" J4 W7 a
         1. 通过万用表测量,发现主机上所有的PCI、PCIe插槽的PERST#引脚都是相连的。; T3 z/ i) t& g+ L* f3 c8 {
         2. 因此正是PERST#信号的时高时低,使得主机的所有PCIe设备都不能正常工作,包括显卡,因此显示器会没信号,进而不能启动。" k4 l' E& p) n1 }9 w+ U) L9 T% @+ B

* P1 q* P' f/ N7 H, _但是我不知道是什么原因造成了PERST#信号的时高时低,从系统的拓扑结构来看,当主机撤去PERST#的低电平时,PERST#应该被上拉到高电平才对。
4 o) P" e' W7 n1 \1 d+ x
2 D! n6 Q: E: R9 R图中的3.3V - 2.5V电平转换器用的TXB0108芯片,参考的是xilinx ml605的原理图,因为v6的pcie核PERST#要求是2.5V电平的。

该用户从未签到

2#
发表于 2010-8-15 00:46 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的Pcie卡的pin map是否有短路的,电源和地。: d6 y  u, H) F! k

8 w" ^% W6 T$ e/ q9 p; [/ f; J6 s或者是你看看你设计的V6子卡的pcie连接器的3.3V/12V的电源情况,通常是主板给子卡供电,但是你设计的子卡的3.3V/12V的pin上可能有电,是来自你子卡自身的电源模块,理解吗?3 f" l4 N/ R/ C

8 ?8 p: L6 e) N+ e" X( y( Y这样3.3V/12V相当于2个源,主板的电源进入保护状态了。

该用户从未签到

3#
 楼主| 发表于 2010-8-15 10:33 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的 ...
4 P: b- \! u. B4 n1 a2 Sliqiangln 发表于 2010-8-15 00:46
2 f! `( @2 }! H& r

. g$ ]- [" @$ d! N" x5 F+ U) W8 F9 a9 T3 m4 G+ G
    PCIe连接器并不传送电源,同时PCIe转接卡和FPGA子卡都采用外部电源供电。
! h8 R2 {. C/ b2 b1 F
" [) B' T9 ~3 ?5 \& Z6 P! N& W    PCIe插槽上的3.3V/12V电源在接到PCIe转接卡的金手指时就做了开路,因此应该不存在3.3V/12V有两个源的情况。( L/ G: t* x! f9 [
' k2 i" K; l* q
这是PERST的拓扑结构图,再补一下- t; X( n2 @, e. o; F3 L7 `

该用户从未签到

4#
 楼主| 发表于 2010-8-15 11:49 | 只看该作者
回复 2# liqiangln ; J2 w) ^$ U/ I* x: I- @
$ o. t3 {$ G' S8 u+ X% x+ G/ U
5 g: O9 T! R  [$ t9 M6 q. `
    我怀疑是FPGA子卡的存在干扰了PERST#的正常时序,
2 b; T# l3 }' J8 d( r2 K
0 y% m' r" v% q) J    现在把子卡上4.7K的上拉电阻去掉后,问题还是存在。

该用户从未签到

5#
发表于 2010-8-15 16:37 | 只看该作者
其实在电路中说的信号完整性,电源完整性,干扰,仅仅是针对性能谈的,对于基本功能实现没那么大的危害,不要神化了,还是要从基本的方式解决问题。( l6 M  M) r" r8 y- ~7 K
比如说你的外部电源和你的主机是否是共地,是否有同样的参考点。6 H6 L; W4 }' |8 E- t- U

' y9 g5 w( S/ k比如说你FPGA(设备卡)的3.3V和主机的3.3V是什么关系,因为你把设备卡链接上去的时候,这个3.3V就传递到主机卡上了,如果这个3.3V先于主机3.3V电源上电,那么可能造成主机的3.3V电源模块没启动。

该用户从未签到

6#
 楼主| 发表于 2010-8-15 16:38 | 只看该作者
又做了一个实验:/ s. m; _% w6 M2 V& A

: a( H0 T* w' v$ S    把4.7K电阻焊上,把PCIe转接卡上的0R电阻换成开关。; y$ X* ~* `& n. M1 `( O

$ A; n( c) }( m7 v$ F" \4 z( l发现:4 D; d0 P8 n" R  H9 F; T

+ c4 |* h* [# T7 y   若开关断开,则FPGA侧PERST#为高电平;, d; f7 m; W0 }* N8 s0 y( K( H+ U
   若把开关合上,则PERST#被拉低,FPGA侧PERST#为低电平;" n- l8 i/ T( ~* @' ^
   若此时再把开关断开,则理论上PERST#应该被拉高,但实际中FPGA侧PERST#为低电平,3.3V-2.5V电平转换器的3.3V一端的PERST#电压为1.57V,2.5V一端为0.2V。$ f1 |3 p5 _8 t9 E& Z

0 ]* k  Q" A# z$ J3 A9 H. E4 U' G推断:
" Y9 a( i6 Q) ^- w% M$ k& ]8 T  _" J/ L( B9 w
    可能是电平转换器的输入阻抗不够大,导致上拉能力不够,换一个470R的上拉电阻试一下。

该用户从未签到

7#
 楼主| 发表于 2010-8-15 16:40 | 只看该作者
本帖最后由 cuizehan 于 2010-8-15 16:42 编辑 * _' E  B0 l% Q8 m

0 R; c1 {% q, p4 P/ X% Y% @4 z8 C回复 5# liqiangln . S* |0 _3 B* b% ^' u
/ p2 z: c) u8 O2 [
0 u& o( W* i, _6 E. i
    主机的3.3V电源和设备卡的3.3V电源是隔离的,分别由不同的电源模块产生,且中间没有通路。" G8 U" h& f' x* ^
    参考地是一样的。

该用户从未签到

8#
 楼主| 发表于 2010-8-15 17:12 | 只看该作者
回复 6# cuizehan
) G: {" o" j: k1 y+ }+ O
$ Y4 w# p- o; H* i& b* d8 j8 ~+ ?+ Z  C" Q+ i0 A2 }
    换了470R上拉电阻后,通过开关手工复位,主机可以正常启动,并且也检测到PCIe设备了。$ _$ `5 I7 Q7 \- r$ _
: R, p/ f, R5 V% f& I3 \
    虽然可以了,但是需要手工操作。下面把开关换回0R电阻再试一试。

该用户从未签到

9#
 楼主| 发表于 2010-8-16 08:57 | 只看该作者
通过开关手工复位,和0R电阻,主机都可以正常启动,并且通过PCItree都检测到了该设备。" W' q! [5 g$ O# ^. v! ^; H& _0 a

- w- a/ j2 a% r% Y- r0 }但是,用0R电阻(由主机来实现复位时),PCI配置空间里的BAR寄存器是0,没有分配空间。
6 A0 M7 b0 A/ g0 E6 V
* c* Z. Q! X8 I+ D' D通过手工开合开关(手工复位),PCI配置空间的BAR寄存器非0.
8 _  {. j0 u; u% U
6 h6 D# x; y, V, ]$ a1 h% {7 Y$ M还不知道是什么原因造成了这个现象。

该用户从未签到

10#
发表于 2010-8-16 10:44 | 只看该作者
你也可以把3.3Vto2.5V的模块,跨过,用分压电阻来实现,看看是否有改善。0 P2 I3 t  @4 l0 I1 Q
" f' x4 n5 {$ p
PCIe金手指上出来RST以外,还有在位检测线号我记得也是默认上拉的,你看看是如何处理的?
3 M8 K+ g0 n0 o0 |/ t; @
+ X% F, x$ i1 W如果你的地址空间没有分配,还是不能工作。

该用户从未签到

11#
 楼主| 发表于 2010-8-17 15:41 | 只看该作者
回复 10# liqiangln , Q" F5 k! T: z% B$ t2 ]4 \
' [8 g$ @) x7 I6 f! u

$ Y. B, m, E, v: b8 y# k2 ^/ H    把3.3V-2.5V模块跨过,这个我还没想好怎么弄,主要是焊接上不好实现。
/ e/ Z  k% f' v5 ]8 b- m* U/ v+ ~$ W, A2 i% `4 e, [: a% L3 y3 k
    在位检测信号,
  F2 W5 f8 h6 T+ E0 v9 {( \          按照PCIe CEM规范上将,应该是讲两个PRSNT#短接,这样主机才能发现设备,提供电源和时钟。
6 D, q2 g' J, G: x          实际实现中并没有直接短接,而是用了一个跳线,发现不管有没有短接都没什么影响。
7 ]& r: [3 ^' W# |/ Z2 v7 `          之前一个做这方面的工程师给讲过,说一般的PC机是没实现这个功能的,直接给所有的插槽提供给电源和时钟,所以这两个信号可以不用管。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-22 12:30 , Processed in 0.156250 second(s), 28 queries , Gzip On.

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

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

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