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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cuizehan 于 2010-8-15 11:22 编辑 % w0 p0 i4 L% u: e; i, e: k1 w

4 o1 j) _* m/ v9 I" `2 O* \我用的xilinx v6-lx130t-ff783-2的FPGA,来实现一个PCIe设备,整个系统的结构如下图
8 v( d0 A$ d4 ^; l8 p
$ F. f* P: m& _ 5 L# ^: Z, k& _
FPGA所在的板卡通过一根Cable连到PCIe转接卡,再通过金手指插到主机的PCIe插槽。; c- F  i' Y# n; {

, }* ?' M1 o* v! H9 K上图中只画出了PERST#信号的拓扑结构
. T  D& ]6 J) ~( Q; m: F3 O, `, s. H5 }% B5 Z# w# M5 l
( d) E' R+ y0 R% X
正常的PCIe设备启动过程如下图( o& a2 S6 \7 ?; I
  
  c# c2 C2 K2 v" A5 p# ^& s ! x9 J3 A2 q1 t& E
预期的正常情况是:5 @! _+ P7 P0 L7 V2 L9 v
% ^( z1 r8 }3 l+ z+ v9 s) l% }
         1. 设备卡先加电,因此电源一直处于稳定状态,初始时PERST#被上拉到高电平。9 v4 t. M; m/ c! I0 f
         2. 启动主机,在主机POST过程中,PERST#被拉低一段时间,使所有的PCIe设备复位。
% t: w* a, V. C  C8 F$ Q         3. 经过一段时间之后,大于tPVPERL,设备完成复位,准备好传输数据,主机撤去PERST#,设备开始工作。9 N0 ]( {6 `6 N; H. a# K6 g: j0 f8 R
" F6 ]3 g. {2 F- r0 h

8 w! r# C, I0 ]# Y但是现在的情况是:
$ |8 o1 c+ A# D# y9 M) Z3 d/ u: ]0 m* C- f* ^
         1. 如果设备卡不加电,则主机能够正常启动。
& u8 P3 j! e( r% m         2. 如果设备卡加电,则主机不能启动,显示器没信号,cpu、显卡风扇转速都很低,没有出现滴滴响声。
6 d) s1 ?+ P( Y$ n2 T' r" R: p7 {: r# v, g+ j6 P
+ y: e$ c' M* ^1 f9 F
我通过chipscope抓取了PERST#信号,发现设备卡加电时该信号时高时低,持续时间都不会超过1ms。4 ]0 k; W  r% }

3 g  M* v# c3 U: O; q我做了如下分析:! t9 X. q' c" L' x% l  D$ B

" O  r7 L* J% c, \, M8 g/ ]         1. 通过万用表测量,发现主机上所有的PCI、PCIe插槽的PERST#引脚都是相连的。
. Q) K; g  F5 p  |1 {6 K         2. 因此正是PERST#信号的时高时低,使得主机的所有PCIe设备都不能正常工作,包括显卡,因此显示器会没信号,进而不能启动。* }1 x6 Y1 Z; ~+ x7 n0 n
! H7 l4 x1 i) `/ X  L4 G$ v7 |
但是我不知道是什么原因造成了PERST#信号的时高时低,从系统的拓扑结构来看,当主机撤去PERST#的低电平时,PERST#应该被上拉到高电平才对。! }; D9 x0 Q3 Z5 _9 b  j3 Q
/ y# _5 L- m" p$ q6 N. q: B% D
图中的3.3V - 2.5V电平转换器用的TXB0108芯片,参考的是xilinx ml605的原理图,因为v6的pcie核PERST#要求是2.5V电平的。

该用户从未签到

12#
发表于 2010-8-18 09:06 | 只看该作者
不知道你找到原因没呢?

该用户从未签到

11#
 楼主| 发表于 2010-8-17 15:41 | 只看该作者
回复 10# liqiangln " ?$ q2 \# d# Z# U5 p# T
$ f8 M5 W. G; ?. `* G4 S, w( N
1 A  F6 h8 N* B9 Z
    把3.3V-2.5V模块跨过,这个我还没想好怎么弄,主要是焊接上不好实现。% Z0 @, x! l0 \( t7 O# Q

1 |" r8 o( E  y; y7 y9 l5 P    在位检测信号,: n8 U( [; _( Z" j+ w- v: C$ H
          按照PCIe CEM规范上将,应该是讲两个PRSNT#短接,这样主机才能发现设备,提供电源和时钟。
  N& N( D/ Z& N- @          实际实现中并没有直接短接,而是用了一个跳线,发现不管有没有短接都没什么影响。
+ T# J. h4 `3 j: c          之前一个做这方面的工程师给讲过,说一般的PC机是没实现这个功能的,直接给所有的插槽提供给电源和时钟,所以这两个信号可以不用管。

该用户从未签到

10#
发表于 2010-8-16 10:44 | 只看该作者
你也可以把3.3Vto2.5V的模块,跨过,用分压电阻来实现,看看是否有改善。
/ W/ h' c+ }4 T1 V- q5 Q9 F$ G0 L: s/ P- ], Y% j0 [2 q5 W+ o& l( Z
PCIe金手指上出来RST以外,还有在位检测线号我记得也是默认上拉的,你看看是如何处理的?5 {. W% }0 R( I* _
4 M6 C; v+ C: `' t# @7 x
如果你的地址空间没有分配,还是不能工作。

该用户从未签到

9#
 楼主| 发表于 2010-8-16 08:57 | 只看该作者
通过开关手工复位,和0R电阻,主机都可以正常启动,并且通过PCItree都检测到了该设备。, q  w' C' _' p% @# a; ]5 o; l

/ R. @) q4 l9 I7 Q  R但是,用0R电阻(由主机来实现复位时),PCI配置空间里的BAR寄存器是0,没有分配空间。
7 v, A( m1 K7 E: |& T4 @: J
8 H$ W1 m$ V- a% _通过手工开合开关(手工复位),PCI配置空间的BAR寄存器非0.& a( p" x5 I# A+ U- @
7 O/ f$ o/ h' H1 G
还不知道是什么原因造成了这个现象。

该用户从未签到

8#
 楼主| 发表于 2010-8-15 17:12 | 只看该作者
回复 6# cuizehan ( n7 m1 S9 [& k2 f# o: I
9 n6 U/ L# \* X; q0 [  L

7 w/ f! [( \9 x( I    换了470R上拉电阻后,通过开关手工复位,主机可以正常启动,并且也检测到PCIe设备了。
% @- h8 G+ }7 `9 c/ h5 V6 K, G8 ]
    虽然可以了,但是需要手工操作。下面把开关换回0R电阻再试一试。

该用户从未签到

7#
 楼主| 发表于 2010-8-15 16:40 | 只看该作者
本帖最后由 cuizehan 于 2010-8-15 16:42 编辑
( @( i: Y( J' {& U6 J. F  T+ ?& L/ H. G& V! V5 P
回复 5# liqiangln
! p1 R- a* A7 V/ t
1 n! h3 d2 r+ q& s& l) \* ~% j4 F
3 r: k! k8 S* r    主机的3.3V电源和设备卡的3.3V电源是隔离的,分别由不同的电源模块产生,且中间没有通路。( |" O: y7 o1 q# j& U$ W2 b7 s, T
    参考地是一样的。

该用户从未签到

6#
 楼主| 发表于 2010-8-15 16:38 | 只看该作者
又做了一个实验:; i. M) C2 c9 ?, y
0 g, N' j& h# t: H* h' w& r8 _
    把4.7K电阻焊上,把PCIe转接卡上的0R电阻换成开关。
+ q, f7 r# R& c& Z. [; w+ @# P% {. d- `. R# g  S. _9 \
发现:) ^9 r0 Q6 l2 G
$ r( |% u$ ~4 p* I
   若开关断开,则FPGA侧PERST#为高电平;
3 e/ {8 F; R7 @# ~1 x; e   若把开关合上,则PERST#被拉低,FPGA侧PERST#为低电平;3 w- N, b, ^9 n) }0 Z" ~' B
   若此时再把开关断开,则理论上PERST#应该被拉高,但实际中FPGA侧PERST#为低电平,3.3V-2.5V电平转换器的3.3V一端的PERST#电压为1.57V,2.5V一端为0.2V。
5 _# h* g! {. b! t( `& t8 r2 U4 G- K! }
推断:
  }* D% D# q1 N, @0 }; \% ~( V- E3 Z) W
    可能是电平转换器的输入阻抗不够大,导致上拉能力不够,换一个470R的上拉电阻试一下。

该用户从未签到

5#
发表于 2010-8-15 16:37 | 只看该作者
其实在电路中说的信号完整性,电源完整性,干扰,仅仅是针对性能谈的,对于基本功能实现没那么大的危害,不要神化了,还是要从基本的方式解决问题。, M' L3 z; X+ n. n0 G" e
比如说你的外部电源和你的主机是否是共地,是否有同样的参考点。
) p' B8 {- d& }2 j
2 v* w" H2 [3 [8 V; Z比如说你FPGA(设备卡)的3.3V和主机的3.3V是什么关系,因为你把设备卡链接上去的时候,这个3.3V就传递到主机卡上了,如果这个3.3V先于主机3.3V电源上电,那么可能造成主机的3.3V电源模块没启动。

该用户从未签到

4#
 楼主| 发表于 2010-8-15 11:49 | 只看该作者
回复 2# liqiangln
8 u# m* E0 [3 o7 B1 |
3 T( r3 [# F3 z- L  ?' q  S; D* L* C4 x% o3 t& l
    我怀疑是FPGA子卡的存在干扰了PERST#的正常时序,
  j7 @, o) ~2 ~8 X
8 l) T$ @/ S' }( l! t    现在把子卡上4.7K的上拉电阻去掉后,问题还是存在。

该用户从未签到

3#
 楼主| 发表于 2010-8-15 10:33 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的 ...
. Z" I3 m/ _. x5 A  T! q% P7 s+ Kliqiangln 发表于 2010-8-15 00:46

8 ~! t( Y" @; c8 G
. P/ u( ?% B6 N$ Z; n5 c0 h  @8 A" {, V- y: ?2 z' h9 i! n
    PCIe连接器并不传送电源,同时PCIe转接卡和FPGA子卡都采用外部电源供电。- x: @* K+ V8 y: b  [
; u+ n; m( l0 ~% F/ _; L. v3 m
    PCIe插槽上的3.3V/12V电源在接到PCIe转接卡的金手指时就做了开路,因此应该不存在3.3V/12V有两个源的情况。. h; B4 N' _' s% U

: n6 f: C6 }: V- z0 g这是PERST的拓扑结构图,再补一下
/ x" [! V1 z) d2 [

该用户从未签到

2#
发表于 2010-8-15 00:46 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的Pcie卡的pin map是否有短路的,电源和地。
' Q# ?; h& b+ m+ }" \) c  y/ H8 l1 h% o" X% F1 W( c1 q
或者是你看看你设计的V6子卡的pcie连接器的3.3V/12V的电源情况,通常是主板给子卡供电,但是你设计的子卡的3.3V/12V的pin上可能有电,是来自你子卡自身的电源模块,理解吗?
/ g( Z! H1 P% Z/ a/ ~4 X% m" y" W- k- t0 a$ I
这样3.3V/12V相当于2个源,主板的电源进入保护状态了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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