3 “Hello, world”测试
3.1 目标
Xillybus 是一种旨在作为逻辑设计构建块的工具。因此,了解 Xillybus 功能的最佳方式是将它与您自己的用户应用逻辑集成。demo bundle(演示包)的用途是作为使用 Xillybus 的起点。
因此,demo bundle 中实现了一个最简单的应用: 在两个设备文件之间进行回环(loopback)。这是通过将 FIFO 的两端连接到 FPGA 内部的 Xillybus IP 核来实现的。结果是,当主机向一个设备文件写入数据时,FPGA 通过另一个设备文件将相同 的数据返回给主机。
下面几节将说明如何测试这一简单功能。此测试是验证 Xillybus 是否正常工作的一种简单方法: FPGA 中的 IP 核按预期工 作,主机正确检测到 PCIe 外设,并且驱动程序已正确安装。除此之外,此测试还提供了通过对 FPGA 中的逻辑设计进行微小修改来了解 Xillybus 工作原理的机会。
作为第一步,建议对 demo bundle 进行简单的实验,以了解 FPGA 中的逻辑与设备文件如何协同工作。仅此一点通常就能 阐明如何根据您自己的应用需求使用 Xillybus。
除了上面提到的回环之外,demo bundle 还实现了一个 RAM 以及另一个回环。下面简要讨论这个额外的回环。关于 RAM, 它演示了如何访问存储器阵列或寄存器。有关此方面的更多信息,请参见第 4.4 节。
3.2 准备工作
执行“Hello, world”测试需要做一些准备工作:
-
计算机上已安装 Xillybus 驱动程序,如第 2 节所述。
-
FPGA 必须加载从 demo bundle(未修改)创建的比特流(bitstream)。如何实现这一点在 AMD FPGA 演示套件入门 或 Altera FPGA 演示套件入门中有说明。
使用 Xillinux(搭配 Zynq 或 Cyclone V SoC)的用户,请参阅 Zynq-7000 的 Xillinux 入门 或 Cyclone V SoC (SoCKit) 的 Xillinux 入门: demo bundle 默认已包含在此系统中。
-
仅适用于 PCIe: 计算机启动时,FPGA 已在 PCIe 总线上被检测到。可以使用“lspci”命令进行验证。
-
仅适用于 USB: FPGA 通过 USB 端口连接到计算机,并且计算机已将 FPGA 检测为 USB 设备。可以使用“lsusb”命令进行 验证。
-
您应熟悉使用 Linux 命令行。附录 A 可能对此有所帮助。
如果这些准备工作已正确完成,则 Xillybus 设备文件应该可用。例如,应该存在名为 /dev/xillybus_read_8 的文件。
3.3 简单的回环测试
执行此测试的最简单方法是使用名为“cat”的 Linux 命令行实用程序:
打开两个终端窗口。在某些计算机上,可以通过双击名为“Terminal”的图标来实现。如果没有此类图标,请在桌面的菜单中 搜索。
在第一个终端窗口中,在命令提示符下输入以下命令(不要输入美元符号,它是提示符):
$ cat /dev/xillybus_read_8
这将使“cat”程序打印出从 xillybus_read_8 设备文件中读取的所有内容。在此阶段,预计不会发生任何事情。
使用 XillyUSB 的用户会发现设备文件是 xillyusb_00_read_8。前缀“xillyusb”很明显,索引“00”允许将多个 USB 设备连接 到同一台主机。本指南中使用了 PCIe 和 AXI 的命名约定。
在第二个终端窗口中,输入
$ cat > /dev/xillybus_write_8
注意 > 字符。它告诉“cat”将控制台上输入的所有内容发送到 xillybus_write_8(重定 向)。
现在在第二个终端上输入一些文本,然后按 ENTER 键。相同的文本将出现在第一个终端上。在按下 ENTER 键之前,不会 向 xillybus_write_8 发送任何内容。这是 Linux 计算机上的常见约定。
这两个“cat”命令都可以通过 CTRL-C 停止。
如果在尝试这两个“cat”命令时遇到错误消息,请首先验证设备文件是否已创建(即 /dev/xillybus_read_8 和 /dev/xillybus_write_8 是否存在)。同时验证没有拼写错误。
如果错误是“permission denied”,可以按照第 2.7 节所示的方法修复。但是请 注意,udev 文件仅在内核模块加载到内核后才生效。请参考第 2.8 节了解如何重新加载内核模 块。或者,重新启动计算机。
另一种解决“permission denied”错误的方法是以 root 用户身份使用 Xillybus 设备文件。在桌面计算机上不太推荐这样做(但 在嵌入式平台上很常见)。更多信息请参见附录第 A.4 节。
对于其他错误,请遵循第 2.8 节中的指南,在 /var/log/syslog 中查找更多信息,或使用“dmesg”命令(或其他获取内核日志的类似方法)。
也可以执行简单的文件操作。例如,在第一个终端中不停止“cat”命令的情况下,在第二个终端中输入:
$ date > /dev/xillybus_write_8
请注意,FPGA 内部的 FIFO 不存在溢出(overflow)或下溢(underflow)的风险:内核会尊重 FPGA 内部的 ’full’(满)和 ’empty’(空)信号。必要时,Xillybus 驱动程序会强制计算机程序等待,直到 FIFO 准备好进行 I/O 操作。这称为阻塞(blocking),即强制 用户空间程序进入休眠状态。
还有另一对设备文件之间存在回环: /dev/xillybus_read_32 和 /dev/xillybus_write_32。 这些设备文件使用 32 位字,FPGA 内部的 FIFO 也是如此。因此,使用这些设备文件的“hello world”测试将产生类似的行为,但有一个区别: 所有 I/O 操作都以 4 字节为一组进行。因此,当输入未达到 4 字节的边界时,输入的最后几个字节将无法传输。
