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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cuizehan 于 2010-8-15 11:22 编辑
' G  P5 l1 Z4 g4 h# Q3 s
' ?* B' M- I3 `# f) r# z8 f我用的xilinx v6-lx130t-ff783-2的FPGA,来实现一个PCIe设备,整个系统的结构如下图 7 J1 O: h. k: Q

3 M9 F% w; r" ^
4 e. m* |# u3 ]3 {9 }1 gFPGA所在的板卡通过一根Cable连到PCIe转接卡,再通过金手指插到主机的PCIe插槽。
0 W( H( E0 c1 _$ o. J- }4 ]5 l( ?; P6 u8 c9 W+ @( N) q8 C! `
上图中只画出了PERST#信号的拓扑结构
( B0 T. c8 u, {
* W5 \% R8 K7 ?+ X# m# N1 i# P' g3 T7 |: W+ S+ E( C
正常的PCIe设备启动过程如下图- a$ ^' M- d6 G
  * y0 ^0 A. p% K* \% ]) ]3 \
! I" j2 ^# M% i* M% e- E6 w# o
预期的正常情况是:, C2 O& b/ H+ B! k, f7 O
/ v% g/ s1 Z/ t- v& o+ P5 N
         1. 设备卡先加电,因此电源一直处于稳定状态,初始时PERST#被上拉到高电平。$ U) c7 j/ C9 V2 _$ E: x
         2. 启动主机,在主机POST过程中,PERST#被拉低一段时间,使所有的PCIe设备复位。
3 L% K. E- e+ A# p/ W! J, h         3. 经过一段时间之后,大于tPVPERL,设备完成复位,准备好传输数据,主机撤去PERST#,设备开始工作。& |, G& G5 N9 ~, [( ]. {$ M
- r' B: M6 Z8 s+ r
8 j' q+ |. D0 q( x" L- u
但是现在的情况是:
; ^, f& r; K+ d+ O) H" d0 N, q6 h# |1 L' ]. p
         1. 如果设备卡不加电,则主机能够正常启动。
2 H9 w1 [8 n1 f9 i# _- ?         2. 如果设备卡加电,则主机不能启动,显示器没信号,cpu、显卡风扇转速都很低,没有出现滴滴响声。3 R* }: A, D) K$ {$ o0 ?
- V7 O3 J; ?5 @( R, K% x
8 c8 g/ V: K- l9 N
我通过chipscope抓取了PERST#信号,发现设备卡加电时该信号时高时低,持续时间都不会超过1ms。" g5 H/ w, O' M5 I, j8 c* y
2 u$ M2 Q7 p2 I: ~
我做了如下分析:
6 f: t2 c- J7 D$ R& a/ i
, f/ q0 C5 J" z1 V1 h         1. 通过万用表测量,发现主机上所有的PCI、PCIe插槽的PERST#引脚都是相连的。
# i5 R" J" u, g+ ]2 @6 K         2. 因此正是PERST#信号的时高时低,使得主机的所有PCIe设备都不能正常工作,包括显卡,因此显示器会没信号,进而不能启动。
& u, a* _9 X+ v0 g/ _; ^; {$ }" i5 [" o8 x, m8 R& r& t
但是我不知道是什么原因造成了PERST#信号的时高时低,从系统的拓扑结构来看,当主机撤去PERST#的低电平时,PERST#应该被上拉到高电平才对。
* z2 U& g# _9 F3 N1 E/ q
9 o! K  p1 X6 v' I图中的3.3V - 2.5V电平转换器用的TXB0108芯片,参考的是xilinx ml605的原理图,因为v6的pcie核PERST#要求是2.5V电平的。

该用户从未签到

2#
发表于 2010-8-15 00:46 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的Pcie卡的pin map是否有短路的,电源和地。
* N# N% S6 }6 p  t" t0 Z# y) z. v8 M. e# _+ t% Q7 v+ W
或者是你看看你设计的V6子卡的pcie连接器的3.3V/12V的电源情况,通常是主板给子卡供电,但是你设计的子卡的3.3V/12V的pin上可能有电,是来自你子卡自身的电源模块,理解吗?
7 P5 b# d. k8 C4 L5 j2 I
% Y$ Q* E% W5 u这样3.3V/12V相当于2个源,主板的电源进入保护状态了。

该用户从未签到

3#
 楼主| 发表于 2010-8-15 10:33 | 只看该作者
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的 .../ F+ P# A4 @, S- p* j
liqiangln 发表于 2010-8-15 00:46

/ f" Q; P% Q( V& Z& e# T3 r& ~! J) A4 u  u$ G. D  F
' x; b6 K+ x: n7 R8 _# W. H
    PCIe连接器并不传送电源,同时PCIe转接卡和FPGA子卡都采用外部电源供电。' p) F5 k1 p  I, M& R
2 \( [2 C5 H8 D! J
    PCIe插槽上的3.3V/12V电源在接到PCIe转接卡的金手指时就做了开路,因此应该不存在3.3V/12V有两个源的情况。
- @3 b2 H: w# G5 M; ?
4 A) P, n4 a0 f$ W( e3 f. K$ K这是PERST的拓扑结构图,再补一下, ~$ O& M9 G* G5 I5 {  F

该用户从未签到

4#
 楼主| 发表于 2010-8-15 11:49 | 只看该作者
回复 2# liqiangln
" a; e$ T* c+ p2 n1 c& I' k5 B" l' C" E, x; X+ G. @; |2 e
: ?6 E8 V8 e) O  T% ~8 X
    我怀疑是FPGA子卡的存在干扰了PERST#的正常时序,; x( p% K. _9 f* l" ^% M1 S- p+ e

5 w' E* G* s8 ~% X$ V    现在把子卡上4.7K的上拉电阻去掉后,问题还是存在。

该用户从未签到

5#
发表于 2010-8-15 16:37 | 只看该作者
其实在电路中说的信号完整性,电源完整性,干扰,仅仅是针对性能谈的,对于基本功能实现没那么大的危害,不要神化了,还是要从基本的方式解决问题。
4 }( r2 p* F9 C5 I  x比如说你的外部电源和你的主机是否是共地,是否有同样的参考点。
  ?8 T' S$ i$ `" z' W/ b1 E4 x+ Q8 n$ ?& o  J8 a  t
比如说你FPGA(设备卡)的3.3V和主机的3.3V是什么关系,因为你把设备卡链接上去的时候,这个3.3V就传递到主机卡上了,如果这个3.3V先于主机3.3V电源上电,那么可能造成主机的3.3V电源模块没启动。

该用户从未签到

6#
 楼主| 发表于 2010-8-15 16:38 | 只看该作者
又做了一个实验:
5 |1 P- O' I! u' c3 y# J, p7 t3 S/ n
) P6 |0 f+ m8 R1 }, }2 w# z# u* ~    把4.7K电阻焊上,把PCIe转接卡上的0R电阻换成开关。3 `8 e7 D" h5 B& L- O
" v# Y$ U! h( O4 N7 s! x* s
发现:
$ B+ Y2 v- ?& ?4 M5 N. d! ^( h5 o9 v: U# S- K
   若开关断开,则FPGA侧PERST#为高电平;
( }& ]5 C5 i& J: Z   若把开关合上,则PERST#被拉低,FPGA侧PERST#为低电平;( Y9 D+ _4 |" [! X' Q, ]
   若此时再把开关断开,则理论上PERST#应该被拉高,但实际中FPGA侧PERST#为低电平,3.3V-2.5V电平转换器的3.3V一端的PERST#电压为1.57V,2.5V一端为0.2V。
- w  {, K6 q2 r' V# b+ v8 H, U, p5 t" z/ H
推断:7 b3 W% g7 p. c* O% f

3 t2 T7 B9 S( H% i: W& T    可能是电平转换器的输入阻抗不够大,导致上拉能力不够,换一个470R的上拉电阻试一下。

该用户从未签到

7#
 楼主| 发表于 2010-8-15 16:40 | 只看该作者
本帖最后由 cuizehan 于 2010-8-15 16:42 编辑 3 i# @: m/ f0 @5 h+ H4 n8 q6 i  z" t

# |" G8 X( Z, H' j) H( _# F: r回复 5# liqiangln 9 j2 Y  A4 m3 o1 F! v8 v& R; x
' U6 `! j2 b! Y- R8 L

: U! b3 e2 q8 T; n) y* o    主机的3.3V电源和设备卡的3.3V电源是隔离的,分别由不同的电源模块产生,且中间没有通路。: H2 T0 l* }% f4 m$ q; V, P) P
    参考地是一样的。

该用户从未签到

8#
 楼主| 发表于 2010-8-15 17:12 | 只看该作者
回复 6# cuizehan ! C( P( P4 M; I8 A# c

# B6 \) S6 o+ G- z- A
; f- \# H% g7 ^, x: v- Z    换了470R上拉电阻后,通过开关手工复位,主机可以正常启动,并且也检测到PCIe设备了。
1 Y! T1 o' C4 f2 V3 ~8 m" T' ?# X) t3 U" w1 i7 k
    虽然可以了,但是需要手工操作。下面把开关换回0R电阻再试一试。

该用户从未签到

9#
 楼主| 发表于 2010-8-16 08:57 | 只看该作者
通过开关手工复位,和0R电阻,主机都可以正常启动,并且通过PCItree都检测到了该设备。
& l6 I& _7 ]9 M! ]6 A% D9 \9 \3 V/ m  K  ^
但是,用0R电阻(由主机来实现复位时),PCI配置空间里的BAR寄存器是0,没有分配空间。6 i1 ^# {+ K, t3 e% l; h3 d2 Y6 X

* l. T1 m' {$ U0 n# N通过手工开合开关(手工复位),PCI配置空间的BAR寄存器非0.
- Z5 T' N8 h" ^+ O- H+ v' X3 |6 I% I3 u. o: |+ Y- h0 r& w
还不知道是什么原因造成了这个现象。

该用户从未签到

10#
发表于 2010-8-16 10:44 | 只看该作者
你也可以把3.3Vto2.5V的模块,跨过,用分压电阻来实现,看看是否有改善。8 l6 f7 d" m/ s% Z9 j

% k/ w. A) t4 J5 NPCIe金手指上出来RST以外,还有在位检测线号我记得也是默认上拉的,你看看是如何处理的?
- a: I! R; u1 A$ b- p2 V! |8 D1 E2 Z1 s8 R
如果你的地址空间没有分配,还是不能工作。

该用户从未签到

11#
 楼主| 发表于 2010-8-17 15:41 | 只看该作者
回复 10# liqiangln $ `5 x% b& B6 u4 f
2 j8 C; Q& w0 Y' |

; c2 s* P  ?5 e4 h    把3.3V-2.5V模块跨过,这个我还没想好怎么弄,主要是焊接上不好实现。
1 n% @; w6 Y1 e; G7 r0 ]
  m8 F# B  L; q. ?: m    在位检测信号,. j) t7 [, b) K2 s: p. k; y9 ?" c
          按照PCIe CEM规范上将,应该是讲两个PRSNT#短接,这样主机才能发现设备,提供电源和时钟。
8 o5 S$ F7 |1 K* s* k          实际实现中并没有直接短接,而是用了一个跳线,发现不管有没有短接都没什么影响。
! @$ f: C0 m8 i: ]7 ]0 H          之前一个做这方面的工程师给讲过,说一般的PC机是没实现这个功能的,直接给所有的插槽提供给电源和时钟,所以这两个信号可以不用管。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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