2 通用指南

2.1 时钟

从 Xillybus IP 核输入或输出的所有信号必须与 bus_clk 的上升沿同步。该时钟由 IP 核提供。

对于基于 PCIe 的 Xillybus IP 核,此时钟由 PCIe 模块生成。时钟频率取决于平台: 对于基础版 IP 核 (Revision A),bus_clk 的频率为 62.5 MHz、125 MHz 或 250 MHz。这分别对应标称最大带宽 200 MB/s、400 MB/s 或 800 MB/s。

在较新的版本(Revision B、XL 和 XXL)中,bus_clk 的频率为 250 MHz。

基于 Zynq 的平台通常具有 100 MHz 的 bus_clk。XillyUSB 使用 125 MHz 的 bus_clk。

通常可以在有限的选择列表中更改时钟频率。这是通过配置生成时钟的 PCIe 模块或处理器核来实现的。

如果 PCIe 模块的时序约束设置正确(如 demo bundle 中所示),则依赖 bus_clk 的应用逻辑也会受到正确的时序约束覆 盖: 工具会自动基于 PCIe 模块的时序约束为 bus_clk 创建时序约束。这同样适用于基于 Zynq 的平台以及 XillyUSB。

这并不意味着应用逻辑必须与 bus_clk 同步。同样,也不要求数据的源或目的与 bus_clk 同步。当涉及不同时钟时,通常会 将双时钟 FIFO(dual-clock FIFO,常称为“异步 FIFO”)与 IP 核配合使用: FIFO 的一侧连接到 Xillybus IP 核,因此该侧与 bus_clk 同步。 应用逻辑连接到 FIFO 的另一侧,该侧与应用逻辑的时钟同步。因此,FIFO 不仅用作短期临时存储,还用于时钟域跨越。

2.2 数据宽度

每个 FIFO 或存储器接口支持的数据宽度为 8 位、16 位或 32 位。对于基础版 Xillybus IP 核(Revision A)是这样。较新的 版本以及 XillyUSB 则支持更宽的数据接口。

更宽的数据可提供更高的带宽性能,并且在自然传输字宽大于 8 位的应用中也更为方便。另一方面,主机侧固有的数据宽度 仍为 8 位(一个字节),因为 read() 和 write() 函数调用以字节为单位定义长度。

选择数据宽度的考虑因素在 自定义 Xillybus IP 核指南中简要讨论。

2.3 通过 FIFO 进行接口

demo bundle 演示了如何连接 FIFO: 它包含一个两侧均连接到 IP 核的 FIFO,从而实现两个流上的环回。

demo bundle 中的 FIFO 配置为两端共用一个时钟。当 FIFO 用于时钟域跨越时,这不适用。在这种情况下,应使用双时钟 FIFO(“异步 FIFO”)。

当 FIFO 用于从主机到 FPGA 的流时,该 FIFO 的 “full”(满)信号应连接到 Xillybus IP 核。IP 核使用该信号判断是否可以启 动数据突发传输。

同样的原则适用于从 FPGA 到主机的流: “empty”(空)信号应连接到 Xillybus IP 核用于相同目的。IP 核期望常规 FIFO 的 行为(而非 FWFT,即首字直通)。

一旦突发开始,Xillybus IP 核继续依赖这些 “empty”(空)和 “full”(满)信号: 这些信号阻止 IP 核从空 FIFO 读取或向满 FIFO 写入。

然而,即使 FIFO 指示已准备好接收突发数据,Xillybus IP 核也可能不会立即启动突发。即使 FIFO 允许继续突发,IP 核也 可能在中间停止数据突发。数据流的模式看起来随机是正常的。

一般规则是,Xillybus IP 核尝试平等地服务所有连接到它的 FIFO。IP 核向那些更容易变满的 FIFO 授予更长的突发,因为这 些 FIFO 不会频繁激活其 “empty”(空)或 “full”(满)信号。

这种简单的仲裁方法确保了与容易变满的 FIFO 之间的高效通信,同时实现了接收数据速率较低的 FIFO 的低延迟。

至于 FIFO 的深度,Xillybus IP 核原则上适用于任何深度。然而,应选择此属性以应对预期的数据流。对于异步流,2 kBytes 深度的 FIFO 几乎总是正确的选择,即使对于高数据速率也是如此。但这有时需要反复试验。

2 kBytes 的深度通常足够,因为 Xillybus 核不太可能长时间忽略此大小的 FIFO 以至于造成溢出(overflow)或下溢(underflow)。当 然,只要主机上运行的用户应用软件足够快地消耗或提供数据,情况就是如此。如果不是这样,解决方案可能是增大 DMA 缓冲区。尝试用更 大的 FIFO 来解决是不合理的,因为 FPGA 上的内存要少得多。

2.4 “empty”(空)和 “full”(满)信号的行为

在正常运行的 FIFO 中,“empty”(空)信号只能在读使能拉高一个时钟周期后从低变为高。同样,“full”(满)信号只能在写 使能拉高一个时钟周期后从低变为高。

当然,这两个信号可以随时变为低。

Xillybus IP 核依赖此行为: 当 FIFO 指示已准备好进行数据传输(适用时 “empty”(空)或 “full”(满)为低)时,IP 核中的 状态机可能会启动一系列事件,这将导致至少一个数据元素的传输。因此,如果在 IP 核从 FIFO 获取任何数据之前 “empty”(空)信号变为 高,则 IP 核可能会在一个时钟周期内忽略 “empty”(空)信号。这种情况对 IP 核本身的完整性无害,但可能导致意外且不可预测的数据 流。

“full”(满)信号同理: 如果该信号在 IP 核向 FIFO 写入数据字之前从低变为高,则 IP 核可能会在一个时钟周期内忽略 “full”(满)信号。同样,这对 IP 核本身无害,但可能导致丢失一个数据字。

设计良好的 FIFO 只有在与 Xillybus IP 核准备通信时同时被复位,才会产生这种错误情况。无论如何,通常应避免这种情 况。

如果应用逻辑直接与 IP 核连接(无 FIFO),则重要的是模仿标准 FIFO 在 “empty”(空)或 “full”(满)方面的行为。