2

我已经编写了一些 Linux 设备驱动程序,但我仍然处于新手 hack 的水平。我可以让他们工作,但这就是我所能声称的。到目前为止,我已经能够将它们变成使用 write() 写入数据和使用 read() 读取数据的模型。我偶尔会使用 ioctl 进行更精细的控制。

现在我想在 FPGA 逻辑中构建一个协处理块,并在同一个 FPGA 中为 ARM 处理器编写一个设备驱动程序,以将工作从 ARM 卸载到 FPGA。我很难弄清楚如何最好地设计这个界面。

如果对协处理器的访问是独占的,则可以将数据写入驱动程序,处理将在 FPGA 架构中进行,并通过调用读取来检索数据。然而,对协处理硬件的独占访问将是一种浪费。理想情况下,任何用户空间进程都可以使用可用的硬件。我相信如果政策要求用户空间进程打开设备、写入数据、读取结果然后关闭文件,它会起作用。似乎每次需要访问协处理器时打开和关闭文件的开销抵消了首先卸载工作的好处。

我知道在设备驱动程序代码中需要处理很多问题,以安全地处理对硬件的多次访问。但从高层次来看,我希望看到一个概念可以使这个接口工作并遵守 Linux 设备驱动程序的良好实践。

暂时抛开所有复杂性,理想的系统似乎是一个任何进程都可以打开设备并具有将数据写入设备的访问点,也许是在阻塞调用中,并且在协处理器完成后读取数据,这很神奇。驱动程序将处理硬件访问,调用进程可以在需要时保持设备文件打开。绝对任何见解或指导将不胜感激!

如果有人关心或者它在某种程度上有用或有趣,这些都是额外的信息:

这个特殊的 FPGA 是 Xilinx 的 Zynq 器件。它在与 FPGA 结构(基于其 Kintex 系列)相同的硅片上具有双核 Cortex ARM A9。该系统正在运行用于 ARM 的 Arch Linux,并且已经运行一年了。我使用通用名称“协处理器硬件”,因为这个想法是随着时间的推移,这块硬件将获得能力,而它的设备驱动程序的用户空间接口保持相当稳定。例如,您将能够编写 1024 个样本并让该模块执行低通滤波操作、FFT 等,并比处理器本身更快地获得结果。

谢谢!这是我在这里的第一个问题,因此我为违反协议和固有的无知道歉。

--蒂姆

4

1 回答 1

2

我的团队已经在这类事情上工作了几年。为了使 CPU 和可编程逻辑之间的延迟最低,我们将硬件映射到应用程序进程中,以便它可以直接与硬件通信。这消除了初始连接后的操作系统开销。

尽管如此,我们发现 CPU -> 加速器和返回至少是 1 微秒。这导致我们卸载更大的工作块或使用此路径来配置将结果直接写入系统 DRAM 的数据采集操作。

根据工作的组合,您可以通过多种方式安排共享加速器。

  1. 您可以拥有一个保护硬件的互斥锁,以便使用它的每个进程都具有独占访问权限。

  2. 您可以拥有一个具有独占访问权限的守护进程,并让它多路复用请求和多路分解响应。

  3. 您的加速器可以提供多个独立端口,可供不同进程同时使用。您需要一种将端口分配给进程并在之后回收它们的方法。

如果您的加速器具有请求和响应队列,它们可以通过编程的 IO(内存映射硬件寄存器)或系统 DRAM 中的共享内存队列(以及进出可编程逻辑的 DMA)来访问。

有关这些方法的更多讨论,请参阅我们的 FPGA 2015 论文:http: //www.connectal.org/connectal-fpga2015.pdf

于 2015-05-06T13:28:05.450 回答