数据流

在“基本原理”中,已经解释了 VisualApplets 使用算子和连接构建 FPGA 应用的概念。本章将介绍基于 FPGA 的数据处理中所使用的数据流模型。

FPGA 实现与在微处理器(CPU)上运行的软件程序有所不同。CPU 只能在图像完全传输完毕后才能开始处理,而 FPGA 则可以同时进行图像的传输与处理。

FPGA 与 CPU 传输/处理性能对比

图 31. FPGA 与 CPU 传输/处理性能对比


FPGA 实现中的所有功能都可以同时(即并行)运行,而微处理器则是顺序执行程序指令的。这是一个非常重要的区别,也是 FPGA 实现的巨大优势之一。由于所有部件都在并行工作,数据将以流水线结构进行处理。各个模块(即实例化的算子)通过连接相互连通。每个模块只要有数据可用,就会立即开始处理图像或信号数据。处理结果随后会通过连接转发给下一个模块。大多数模块不会对输入的图像数据进行缓冲,而是在信息可用时立即输出计算结果。在设计中,数据传输的具体形式如下:

在 VisualApplets 数据流水线中传输和处理图像

图 32. 在 VisualApplets 数据流水线中传输 and 处理图像


设计中的数据传输图示如下:

简单的 VisualApplets 设计

图 33. 简单的 VisualApplets 设计


该项目由三个模块组成:相机、缓冲区和 DMA 算子。相机算子是一个图像源模块。它接收来自相机的图像。但该模块不会收集完整帧并在采集完成后才输出图像,而是一旦像素到达就会立即将其转发给下一个模块。ImageBuffer 缓冲区模块是一个可以存储图像数据的缓冲区,但只要输出端未被阻塞,它就会立即输出可用数据。DMA 模块负责将图像传输到宿主 PC。

这种流水线结构的结果是,当同一图像的其他像素仍在从相机传输时,图像像素就已经被传输到宿主 PC 了。因此,模块内部不会存储任何图像。这种非缓冲流水线的优势在于所有模块都可以并行运行并得到高效利用。此外,延迟(像素从输入到完全处理完毕所需的时间)被降到了最低。

有关流水线模型的实际指导,请参阅流水线概念教程主题。有关如何在流水线中处理延迟的信息,请参阅延迟教程主题。

[注意] 注意

请始终牢记:所有模块都可以并行运行,并在数据可用且输出端未被阻塞时立即输出结果。可以将流水线想象成带有阀门、分支以及粗细管道的水管系统。

与微处理器程序不同,操作的数量(即算子的数量)不会影响处理速度,因为所有内容都是并行运行的。然而,Applet 中使用的算子越多,所需的硬件资源也就越多。

无 DMA 进程 / 触发进程

只有在启动了相应进程的所有 DMA 之后,Applet 进程才能在硬件上使用。不过,如果某个进程不包含任何 DMA 通道,它将在 Applet 初始化后立即启动。这对于在图像采集开始前使用的触发和信号处理应用非常有用。

要详细了解 VisualApplets Applet 在硬件上的初始化和使用,请参阅“在硬件上运行您的 Applet”章节和/或Framegrabber SDK 文档。

进程间通信

进程之间的图像数据无法直接交换。不过,通过使用算子 TxSignalLinks 和 RxSignalLinks,可以建立用于信号的进程间通信。

Applet 的带宽

Applet 中流水线的带宽取决于算子的处理速度以及连接线。连接具有多个 “连接属性”(请参阅“连接属性”)。其中之一便是决定带宽的 Parallelism。Parallelism 定义了在一个设计时钟周期内,两个算子之间并行传输多少像素。Parallelism 越高,带宽就越大。算子会自动调整以满足连接所需的带宽;如果无法做到这一点,它们将重新定义带宽。有关 Parallelism 的实际指导,请参阅Parallelism教程主题。

125 MHz 时钟频率下的 Parallelism

图 34. 125 MHz 时钟频率下的 Parallelism


让我们假设一个简单的例子。Parallelism 为 4 将导致四个像素被并行传输。这意味着图像的前四个连续像素从相机模块并行传输到其后续模块(在我们的例子中是缓冲区)。接着,接下来的四个像素从相机模块传输到缓冲区模块。与此同时,前四个像素已在缓冲区模块中处理完毕,并被转发到图像处理链中的下一个模块。

如前所述,Parallelism 定义了在设计时钟频率的一个时钟周期内并行传输的像素数量。该频率取决于所使用的硬件设备。例如,microEnable IV 系列采集卡使用的是 62.5MHz 的设计时钟频率。

[提示] 计算带宽

连接的带宽 b 由 Parallelism p 与频率 f 的乘积决定:

因此,Parallelism 为 4 将产生如下带宽 .如果假定每个像素的 Bit Width 为 8 bit,这将产生 250MB/s 的带宽。所有硬件平台的基础设计时钟频率列表可在 设备资源.

Operators 可能会改变输入与输出 link 之间的 Parallelism。因此,整个设计中的带宽并不是恒定的。这是因为所需带宽可能会发生变化。假设某个 operator 减小了图像尺寸,从而所需的输出带宽也随之减小。

通过上述公式计算出的带宽是一个理论值。实际带宽略低于理论值。

[重要] 重要提示

某些 operators 无法处理输入 link 提供的完整带宽。您可以在 Operator Reference 中找到所有相关 operators 的详细信息。

请注意带宽与延迟之间的区别。延迟由每个 operator 单独定义,且主要取决于算法实现。

[提示] GUI 上的可视化

为了可视化相应的 link properties,VisualApplets 在程序窗口的工具栏中提供了两个 GUI 按钮:

Display Link Info 显示图表中每个 link 的 Bit Width 和 Parallelism:

Display Link Throughput 显示图表中每个 link 的最大像素吞吐量(以兆像素每秒为单位):

像素顺序

如前所述,在 VisualApplets 中,像素在管道中依次传输。如果 link 的 Parallelism 大于 1,则会并行传输多个像素。图像或行中像素的传输顺序如下:通常,来自相机的帧(二维图像)像素传输从左上角的第一个像素开始,到右下角的最后一个像素结束。如果 VisualApplets operators 在处理时需要像素位置,则预期采用相同的顺序,即从左到右、从上到下。下图阐明了此顺序:

像素顺序

图 35. 像素顺序


然而,某些源(例如相机)不遵循此顺序。在这种情况下,可以使用 VisualApplets operators 和 designs 来纠正像素顺序。为此,您应该对像素传输协议有一定了解。您可以在 'Image Protocols, Image Dimensions and Data Structure' 一节中获取相关信息。

图像协议、图像尺寸与数据结构

Image Protocol 定义了传输的像素和数据的图像尺寸与数据结构。Image Protocol 是除了前面提到的 link property Parallelism 之外的另一个 link property。

有三种类型的图像协议:

  • “2D” VALT_IMAGE2D

    2D 图像协议用于图像传输,通常用于面阵相机。一个 link 传输以下信息

    • 传输像素时(pixel valid 信号)

    • 完成一行时(end-of-line 信号)

    • 完成一帧时(end-of-frame 信号)

    因此,2D 图像可以具有:

    • 行中任意数量的像素

    • 任意图像高度

    2D 图像协议模型

    图 36. 2D Image Protocol 模型


    不会传输行或列中的像素位置本身。该位置由当前行中先前行的数量以及先前像素的数量得出。行中的像素之间不可能存在间隙。行长度可以任意。一行可以没有像素,即可以存在空行。一帧至少必须由一个空行组成。

  • “1D” VALT_LINE1D

    1D image protocol 用于传输行,通常用于线阵相机。链路传输信息

    • 传输像素时(pixel valid 信号)

    • 当一行完成时(行结束信号)

    因此,1D 图像可以具备:

    • 行中任意数量的像素

    • 无限的图像高度

    1D Image Protocol 模型

    图 37. 1D Image Protocol 模型


    同样,不会传输行中的像素位置本身。该位置由当前行中先前行的数量以及先前像素的数量得出。行中的像素之间不可能存在间隙。行长度可以任意。一行可以没有像素,即可以存在空行。

  • “0D” VALT_PIXEL0D

    在 0D image protocol 中,不保留图像尺寸信息。它只是一串像素流。不过,像素之间可能存在时间间隔,即像素带有有效信号。0D 协议通常用于数据传输,例如测量结果。

    0D Image Protocol 模型

    图 38. 0D Image Protocol 模型


  • “Signal” VALT_SIGNAL

    在信号协议中,传输简化为始终有效(在每个时钟周期都有效)的单比特数据传输。因此,该协议不包含任何控制信号,例如 pixel valid 或 line/frame completed。该信号协议用于触发和信号处理系统中的信号运算符。

图像协议是一种 Link Property。每个 operator 都会单独决定其输入接受哪些 Link Property 并可在其输出上提供这些属性。有关 Link 参数化的更多信息,请参见 'Link Properties'。

流控制

在前面的部分中,我们解释了 VisualApplets 设计的流水线结构。如前所述,项目模块之间通过 Link 传输数据。一旦模块处理完一个输入像素并计算完输出值,结果就会从输出 Link 输出。但是,下一个模块可能无法处理该数据,因为它仍在处理另一个像素。在这种情况下,将应用 VisualApplets 的流量控制,并且流水线将被阻塞。因此,模块可以阻塞其输入。在这种情况下,先前的模块将不会输出其结果,并将阻塞状态向流水线后方传播。

让我们看一看 Figure 33, 'Simple VisualApplets Design' 中所示的简单示例。假设使用的是一台无法处理相机所产生带宽的慢速 PC。在这种情况下,DmaToPC 模块将无法将数据传输到主机 PC。因此,它会不时阻塞其输入。阻塞信号会在设计中一直传播到图像缓冲区模块。现在,在阻塞激活期间,图像缓冲区将不会输出任何数据。由于 ImageBuffer 模块是一个缓冲区,所有后续传入的数据都将被缓冲,并且缓冲区的 Fill 级别将会增加。当相机停止发送数据时,将不会向缓冲区传输新的输入数据,并且数据将持续输出,直到缓冲区变空。

[提示] 提示

再次说明,您可以将流量控制想象成输水管道。如果阀门关闭,则无法再输送水。缓冲区 operator 就像一个水库,如果排水口无法消耗输入流,水库就会积水。

另请参阅 Stoppable and Non-Stoppable Data Streams 教程主题。