FPGA实现PCIe设备时的一个问题
我用的xilinx v6-lx130t-ff783-2的FPGA,来实现一个PCIe设备,整个系统的结构如下图

FPGA所在的板卡通过一根Cable连到PCIe转接卡,再通过金手指插到主机的PCIe插槽。
上图中只画出了PERST#信号的拓扑结构。
正常的PCIe设备启动过程如下图

预期的正常情况是:
1. 设备卡先加电,因此电源一直处于稳定状态,初始时PERST#被上拉到高电平。
2. 启动主机,在主机POST过程中,PERST#被拉低一段时间,使所有的PCIe设备复位。
3. 经过一段时间之后,大于tPVPERL,设备完成复位,准备好传输数据,主机撤去PERST#,设备开始工作。
但是现在的情况是:
1. 如果设备卡不加电,则主机能够正常启动。
2. 如果设备卡加电,则主机不能启动,显示器没信号,cpu、显卡风扇转速都很低,没有出现滴滴响声。
我通过chipscope抓取了PERST#信号,发现设备卡加电时该信号时高时低,持续时间都不会超过1ms。
我做了如下分析:
1. 通过万用表测量,发现主机上所有的PCI、PCIe插槽的PERST#引脚都是相连的。
2. 因此正是PERST#信号的时高时低,使得主机的所有PCIe设备都不能正常工作,包括显卡,因此显示器会没信号,进而不能启动。
但是我不知道是什么原因造成了PERST#信号的时高时低,从系统的拓扑结构来看,当主机撤去PERST#的低电平时,PERST#应该被上拉到高电平才对。
图中的3.3V - 2.5V电平转换器用的TXB0108芯片,参考的是xilinx ml605的原理图,因为v6的pcie核PERST#要求是2.5V电平的。
图形我看不到,不过PERST#时高时低,看情况是主机的电源在进行保护,导致PERST#上拉电源在复位,你看看你的Pcie卡的pin map是否有短路的,电源和地。
或者是你看看你设计的V6子卡的pcie连接器的3.3V/12V的电源情况,通常是主板给子卡供电,但是你设计的子卡的3.3V/12V的pin上可能有电,是来自你子卡自身的电源模块,理解吗?
这样3.3V/12V相当于2个源,主板的电源进入保护状态了。
PCIe连接器并不传送电源,同时PCIe转接卡和FPGA子卡都采用外部电源供电。
PCIe插槽上的3.3V/12V电源在接到PCIe转接卡的金手指时就做了开路,因此应该不存在3.3V/12V有两个源的情况。
这是PERST的拓扑结构图,再补一下
我怀疑是FPGA子卡的存在干扰了PERST#的正常时序,
现在把子卡上4.7K的上拉电阻去掉后,问题还是存在。
其实在电路中说的信号完整性,电源完整性,干扰,仅仅是针对性能谈的,对于基本功能实现没那么大的危害,不要神化了,还是要从基本的方式解决问题。
比如说你的外部电源和你的主机是否是共地,是否有同样的参考点。
比如说你FPGA(设备卡)的3.3V和主机的3.3V是什么关系,因为你把设备卡链接上去的时候,这个3.3V就传递到主机卡上了,如果这个3.3V先于主机3.3V电源上电,那么可能造成主机的3.3V电源模块没启动。
又做了一个实验:
把4.7K电阻焊上,把PCIe转接卡上的0R电阻换成开关。
发现:
若开关断开,则FPGA侧PERST#为高电平;
若把开关合上,则PERST#被拉低,FPGA侧PERST#为低电平;
若此时再把开关断开,则理论上PERST#应该被拉高,但实际中FPGA侧PERST#为低电平,3.3V-2.5V电平转换器的3.3V一端的PERST#电压为1.57V,2.5V一端为0.2V。
推断:
可能是电平转换器的输入阻抗不够大,导致上拉能力不够,换一个470R的上拉电阻试一下。
主机的3.3V电源和设备卡的3.3V电源是隔离的,分别由不同的电源模块产生,且中间没有通路。
参考地是一样的。
换了470R上拉电阻后,通过开关手工复位,主机可以正常启动,并且也检测到PCIe设备了。
虽然可以了,但是需要手工操作。下面把开关换回0R电阻再试一试。
通过开关手工复位,和0R电阻,主机都可以正常启动,并且通过PCItree都检测到了该设备。
但是,用0R电阻(由主机来实现复位时),PCI配置空间里的BAR寄存器是0,没有分配空间。
通过手工开合开关(手工复位),PCI配置空间的BAR寄存器非0.
还不知道是什么原因造成了这个现象。
你也可以把3.3Vto2.5V的模块,跨过,用分压电阻来实现,看看是否有改善。
PCIe金手指上出来RST以外,还有在位检测线号我记得也是默认上拉的,你看看是如何处理的?
如果你的地址空间没有分配,还是不能工作。
把3.3V-2.5V模块跨过,这个我还没想好怎么弄,主要是焊接上不好实现。
在位检测信号,
按照PCIe CEM规范上将,应该是讲两个PRSNT#短接,这样主机才能发现设备,提供电源和时钟。
实际实现中并没有直接短接,而是用了一个跳线,发现不管有没有短接都没什么影响。
之前一个做这方面的工程师给讲过,说一般的PC机是没实现这个功能的,直接给所有的插槽提供给电源和时钟,所以这两个信号可以不用管。
不知道你找到原因没呢?
