1 引言
Xillybus 的设计旨在向 Linux 主机提供一个简单且广为人知的接口,其行为自然、符合预期。主机驱动会生成行为类似于命名管道 (named pipe)的设备文件。这些设备文件可以像普通文件一样被打开、读取和写入,但其行为更像是进程间管道或 TCP/IP 流。对于主机 上运行的程序而言,区别在于流的另一端并非另一个进程(无论通过网络还是同一台计算机),而是 FPGA 中的 FIFO。与 TCP/IP 流类 似,Xillybus 流既适用于高速数据传输,也适用于偶尔到达或发送的单个字节。
由于与 Xillybus 的交互完全通过访问方式与普通文件无异的设备文件进行,因此通常任何实用的编程语言都可以使用,无需 特殊的模块、扩展或其他适配。只要所选语言能够打开文件,就可以通过 Xillybus 访问 FPGA。
同一个驱动二进制文件支持任意 Xillybus IP 核配置:驱动在初始化设备时会自动检测流及其属性,并据此创建设备文件。这 些设备文件通过 /dev/xillybus_something (使用 XillyUSB 时则为 /dev/xillyusb_something)进行访问。
在运行过程中,FPGA 与主机之间的握手协议营造出一种连续数据流的假象。在幕后,驱动的缓冲区被填充并处理。类似于 TCP/IP 流的技术被用于确保缓冲区的高效利用,同时保持对小数据块的快速响应。
由于 Xillybus 的 I/O 操作与 Linux 中任何设备文件的 I/O 操作完全相同,因此表面上并不需要编程指南——可以沿用常见的 编程实践。
即便如此,与 FPGA 的通信往往涉及文件 I/O 中不典型的任务。本指南介绍了实现常见 FPGA 相关项目的方法,以及如何获 得最佳性能。经验丰富的程序员可以选择其他同样有效的方法。
本指南的大部分内容仅为 UNIX 系统中如何实现稳健高效 I/O 的概要。熟悉此类技术的读者可能会觉得其中若干部分多 余——确实如此;Xillybus 的设计初衷并非发明任何新的 API,而是表现得如经验丰富的程序员所预期的那样。
本指南中的示例采用纯 C 语言编写,以求清晰明了,并且因为 C 语言拥有一组已知与底层系统调用密切相关的函数。所描 述的技术也可以在多种其他语言中实现,包括脚本语言(如 Perl 和 Python),尤其是在主机与 FPGA 之间的性能与同步要求不那么严格 时。
某些 I/O 甚至可以通过 shell 脚本或单行命令完成。
