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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cuizehan 于 2010-8-15 11:22 编辑
7 [$ [0 X% ~8 }: g8 V1 J  X& J+ y
我用的xilinx v6-lx130t-ff783-2的FPGA,来实现一个PCIe设备,整个系统的结构如下图 ( p% P% l" `# l3 A

. @5 L, P; O1 _* ?- b
0 w' @' P3 U& \) ]9 ]3 ZFPGA所在的板卡通过一根Cable连到PCIe转接卡,再通过金手指插到主机的PCIe插槽。  p0 |, s4 ~; n: a
; H- d, o0 ]# o. i
上图中只画出了PERST#信号的拓扑结构( _6 h: n1 _7 P6 d

% q- K* `. m2 Q* W. `) K2 Z8 O: }/ w
正常的PCIe设备启动过程如下图
7 T* X4 S0 Z$ G9 `% ^  
1 ]9 L, r" F% k6 a ! c0 s* m  w7 r9 {/ M
预期的正常情况是:0 h9 ]* [" O5 s( k/ y" T& z
2 t" e5 L2 i) U  ?2 F' c& s
         1. 设备卡先加电,因此电源一直处于稳定状态,初始时PERST#被上拉到高电平。
( P7 m9 S( a, w3 t7 }         2. 启动主机,在主机POST过程中,PERST#被拉低一段时间,使所有的PCIe设备复位。
9 u) W3 Z/ I6 S* e3 w         3. 经过一段时间之后,大于tPVPERL,设备完成复位,准备好传输数据,主机撤去PERST#,设备开始工作。
4 d& [2 S* [  L2 G
4 i; e( o( R* X8 d( k# b* d& J! {, @( b3 Q9 }7 y. y
但是现在的情况是:
1 i0 k2 F; e% p+ k# p$ o) m9 C' ?( A, t5 Q4 H- B( P8 H4 j$ l
         1. 如果设备卡不加电,则主机能够正常启动。
: |/ t- ^' m: e         2. 如果设备卡加电,则主机不能启动,显示器没信号,cpu、显卡风扇转速都很低,没有出现滴滴响声。
# ?9 b/ Q' @$ [% G9 T6 F' V$ Y5 {* b: h  B$ n. t$ N( {: n

$ `! |- ~" N( o" s2 g% b我通过chipscope抓取了PERST#信号,发现设备卡加电时该信号时高时低,持续时间都不会超过1ms。
( q& s7 i; a$ k
2 ^2 P+ y# M( M# W' w5 k我做了如下分析:: t9 S: \  e$ K2 p

9 Y) z9 `* r% r* ^         1. 通过万用表测量,发现主机上所有的PCI、PCIe插槽的PERST#引脚都是相连的。
7 `! E5 j' T# @         2. 因此正是PERST#信号的时高时低,使得主机的所有PCIe设备都不能正常工作,包括显卡,因此显示器会没信号,进而不能启动。: w$ k& B: M: m1 u) }
( N/ m+ l7 N/ U7 P
但是我不知道是什么原因造成了PERST#信号的时高时低,从系统的拓扑结构来看,当主机撤去PERST#的低电平时,PERST#应该被上拉到高电平才对。- S1 z( u  P! J6 k$ }( u4 f
1 }2 w+ ~. B: s& S& F: l2 K3 H
图中的3.3V - 2.5V电平转换器用的TXB0108芯片,参考的是xilinx ml605的原理图,因为v6的pcie核PERST#要求是2.5V电平的。

该用户从未签到

2#
发表于 2010-8-15 00:46 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的Pcie卡的pin map是否有短路的,电源和地。. `2 Y% C0 {7 s0 H) k. ?2 h
: M. c6 G2 W4 `" ?/ c* @( a5 R
或者是你看看你设计的V6子卡的pcie连接器的3.3V/12V的电源情况,通常是主板给子卡供电,但是你设计的子卡的3.3V/12V的pin上可能有电,是来自你子卡自身的电源模块,理解吗?
# r& y+ C: X/ J# [1 Q3 P. N2 z
5 V) }1 G  I; K* `/ X! i这样3.3V/12V相当于2个源,主板的电源进入保护状态了。

该用户从未签到

3#
 楼主| 发表于 2010-8-15 10:33 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的 ...$ Z9 t- _, P, w  y  [: O& B/ a
liqiangln 发表于 2010-8-15 00:46
* S1 Q$ x, Y! e9 ^2 |& _

' l9 O8 ~2 ]7 t" o; r; A  L: e, v' e8 a3 m# L
    PCIe连接器并不传送电源,同时PCIe转接卡和FPGA子卡都采用外部电源供电。
" ~1 t' A. N" \& \
$ W8 H+ ?2 f$ L) D    PCIe插槽上的3.3V/12V电源在接到PCIe转接卡的金手指时就做了开路,因此应该不存在3.3V/12V有两个源的情况。5 D* b( z9 c2 v
: [5 N. W9 W( f' {9 Z
这是PERST的拓扑结构图,再补一下
  U4 e2 c( ]+ H$ N: S) }

该用户从未签到

4#
 楼主| 发表于 2010-8-15 11:49 | 只看该作者
回复 2# liqiangln , w4 P7 P/ u* k7 U) h7 P) }
5 y; }2 E( x* l' b% D/ A

* i- T( R1 H6 l- V& n* ^    我怀疑是FPGA子卡的存在干扰了PERST#的正常时序,
/ m) L( A* g  F" K" h
8 a4 W* ^" l2 H. U4 D: B( r" A    现在把子卡上4.7K的上拉电阻去掉后,问题还是存在。

该用户从未签到

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

该用户从未签到

6#
 楼主| 发表于 2010-8-15 16:38 | 只看该作者
又做了一个实验:3 Q( u- e: }; K5 U: F, G5 `. Q
7 c: E$ u; {: g# x, q
    把4.7K电阻焊上,把PCIe转接卡上的0R电阻换成开关。
# B2 u. [3 G+ w! F2 C; J$ n4 p- H) F' c6 ^* z% ?: x
发现:
  @$ J  f4 j, Q& l# f/ |7 ]: h5 L( D: w- P5 K$ Z/ E3 ~* K
   若开关断开,则FPGA侧PERST#为高电平;
: P7 w! A  p" |7 G& `   若把开关合上,则PERST#被拉低,FPGA侧PERST#为低电平;) Y  O" X+ ]# P& ^9 O" `3 \
   若此时再把开关断开,则理论上PERST#应该被拉高,但实际中FPGA侧PERST#为低电平,3.3V-2.5V电平转换器的3.3V一端的PERST#电压为1.57V,2.5V一端为0.2V。; T# e8 ^7 K% q% n1 e
- m7 t3 {- a2 ~" \7 ~; \9 {8 @
推断:, W, z# d3 b& c3 d
) j: K% s+ `* `% L$ Q% }
    可能是电平转换器的输入阻抗不够大,导致上拉能力不够,换一个470R的上拉电阻试一下。

该用户从未签到

7#
 楼主| 发表于 2010-8-15 16:40 | 只看该作者
本帖最后由 cuizehan 于 2010-8-15 16:42 编辑
1 s- W) l+ z/ l7 D
) [9 t1 {6 C; Q2 p9 w5 o- A8 x回复 5# liqiangln
$ i0 ]# ]3 \8 _! l% l  R  a. u
1 T; j$ h" ~9 I, L) `* e. D/ l! ?- @, o% C0 o3 k1 `3 {
    主机的3.3V电源和设备卡的3.3V电源是隔离的,分别由不同的电源模块产生,且中间没有通路。
  q9 H; s) i) O8 f4 X& L$ i* F  a' F    参考地是一样的。

该用户从未签到

8#
 楼主| 发表于 2010-8-15 17:12 | 只看该作者
回复 6# cuizehan
; v3 g' @; S  M- S& C
3 A4 S5 R% x( }8 N% W/ P
1 w8 x- Z0 S7 r4 r0 v* B    换了470R上拉电阻后,通过开关手工复位,主机可以正常启动,并且也检测到PCIe设备了。1 K, n' G4 `" V0 v+ f

8 b5 U% j( l7 V9 ~- N    虽然可以了,但是需要手工操作。下面把开关换回0R电阻再试一试。

该用户从未签到

9#
 楼主| 发表于 2010-8-16 08:57 | 只看该作者
通过开关手工复位,和0R电阻,主机都可以正常启动,并且通过PCItree都检测到了该设备。
" N! |. U8 _5 D( U# C
/ `  M8 {/ k( ^, p但是,用0R电阻(由主机来实现复位时),PCI配置空间里的BAR寄存器是0,没有分配空间。
- s( V& e& l7 O! D% s# P4 H5 F: j) l
通过手工开合开关(手工复位),PCI配置空间的BAR寄存器非0.) a3 n# F5 T, z
4 s# \- C) I4 r3 x  J/ a: k
还不知道是什么原因造成了这个现象。

该用户从未签到

10#
发表于 2010-8-16 10:44 | 只看该作者
你也可以把3.3Vto2.5V的模块,跨过,用分压电阻来实现,看看是否有改善。4 X% f: \8 v) k& d9 \/ b6 J
$ V* P& F) N/ o* U
PCIe金手指上出来RST以外,还有在位检测线号我记得也是默认上拉的,你看看是如何处理的?
$ \$ r- N' K. q' A# {3 \; `2 j$ b9 q9 d  ?% U0 x" A7 `
如果你的地址空间没有分配,还是不能工作。

该用户从未签到

11#
 楼主| 发表于 2010-8-17 15:41 | 只看该作者
回复 10# liqiangln
& K& z/ w: M) p" x  }
* @9 h  F& q$ ?' e* t; L
% P& B7 k# X* O7 r/ i# w    把3.3V-2.5V模块跨过,这个我还没想好怎么弄,主要是焊接上不好实现。  V" u) ~8 @6 C0 y- h

/ }. `/ Y, F  ], h3 W    在位检测信号,
! {2 t0 @5 c" N/ b          按照PCIe CEM规范上将,应该是讲两个PRSNT#短接,这样主机才能发现设备,提供电源和时钟。
# b0 g" s4 s/ _9 f          实际实现中并没有直接短接,而是用了一个跳线,发现不管有没有短接都没什么影响。
; @# U1 f/ D5 q- }/ _9 n% N          之前一个做这方面的工程师给讲过,说一般的PC机是没实现这个功能的,直接给所有的插槽提供给电源和时钟,所以这两个信号可以不用管。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-22 16:15 , Processed in 0.187500 second(s), 27 queries , Gzip On.

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

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

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