2

我在系统中插入了多个相同的板。设备 PCIe 使用 Xilinx IP 内核实现。每个FPGA程序烧写好后,手动刷新设备管理器,检查设备和驱动是否正常工作。

我的困惑是,这种方法似乎只能同时在两个板上工作。第三块板烧好后,刷新任务管理器,系统提示资源不足,“此设备找不到足够的可用资源(代码12)”

我试图禁用其他两个板,但设备仍然提示冲突。我不知道如何查询冲突资源。

我的电路板有 2 个 BAR(BAR0:2KB,BAR1:16MB)和 1 个 IRQ。 在此处输入图像描述

做了几个实验,感觉是内存资源冲突造成的。冲突的一方是主板附带的 AMD 集成显卡。1st, 2nd, 3rd 都是我的板号。 在此处输入图像描述

3rd 由于冲突而无法识别。

关闭后,我将所有三个板子都插上电源,然后再次打开。结果,在启动过程中,系统突然断电后又重新启动,然后三块板子都正常了。这时候发现显卡的内存地址变了

在此处输入图像描述

我想知道如何解决冲突?修改我的驱动程序代码或 FPGA 配置?

4

1 回答 1

2

PCIe 枚举应该解决内存分配问题,但是有几个实现问题需要注意。例如,我使用了具有 2GB 大小的 64 位 BAR 的 Xilinx XDMA,并且我实际上已经将 DELL XPS 主板变砖了。但我在 IBM 系统上也做过同样的事情,而且效果很好。这里的重点是枚举可以通过固件、硬件或操作系统驱动的事件来完成。如果您在做硬件管理器,那听起来像是操作系统驱动的,但是当我为 XPS 板敬酒时,这是某种与 BAR 大小有关的固件问题,导致永久性故障。16MB 并不大,应该不是问题,但我建议先使用 Xilinx 默认值,并在那里显示可靠性。我认为这是 1M 时的一个 BAR。我已经以 1MB 的速度运行了 3 个 64 位 BARS,没有问题,但要保持简单并显示可靠性。然后向上移动。这将有助于隔离它是否是系统脆弱性。

我已经看到一些系统使用基于固件的枚举,在配置 FPGA 之前非常快,在这种情况下,没有 PCIe 目标来识别。如果您经常发现上电时未检测到您的 FPGA,但在重新扫描时检测到,这可能是一种症状。如何解决这个问题有点痛苦。我们最终使用了部分重新配置。从 PCIe 接口开始,然后重新配置以加载剩余的图像。希望不是这个问题

接下来要注意的是 FPGA 中的复位机制。您可能将 PCIe IP 重置与总线重置挂钩,这很棒,但是,我过去也将该重置与可能未启动的内部 PLL 锁定信号挂钩。出于故障排除的目的,请保持重置简单并去掉其他所有内容,以表明只有 PCIe IP 本身首先是可靠的。

你也必须在这里小心。如果你把东西拆掉,确保它是干净的。如果您忽略 PLL 锁定并尝试使用 Xilinx 驱动程序,例如 XDMA 驱动程序,它有一个例程,它会尝试通过数据事务来识别 XDMA。它一次寻找一个 BAR 的 DMA BAR。但是当它这样做时,如果 BAR 不是 XDMA 控制 BAR,它尝试的事务可能会在 AXI 总线上发出。如果发生这种情况时 AXI 总线没有退出复位或计时,您将锁定 AXI 总线,我曾多次以这种方式锁定 Linux 机器。AXI 要求事务完成,否则它只是坐在那里等待。

顺便说一句,在 Linux 机器上,您可以查看内核日志中的枚举输出。我不确定 Windows 是否向您显示相同的内容。但是,如果您看到设备最初被探测过,但随后在配置寄存器中检测到无效的东西,而不是根本看不到,这会很有帮助。

所以有几件事要看。

于 2020-10-30T06:56:45.913 回答