可停止与不可停止的数据流#
关键术语
不可暂停流会持续运行。不可暂停源无法被生成的 FPGA 设计的流控制逻辑暂停。典型的例子是不断发送像素的相机。相比之下,当下一个算子尚未准备好时,可暂停流可以暂停。相机与下游处理之间的缓冲区通常会将不可暂停流转换为可暂停流。
因此,请在相机之后放置一个缓冲区。为了吸收相机突发数据,首选 DRAM 算子: LineBuffer 在 imaFlex 上,或 ImageBuffer 在 microEnable 5 上。仅将 ImageFifo (FPGA 内部内存)用于小型解耦,例如 SYNC之前的短延迟 ImageFifo 。如果在不可暂停流上使用 Overflow ,请将其与 ImageFlowControl 取而代之。请参见 Memory 元素 教程主题。
有关链路连接背后的形式规则,请参见《用户手册》中的 Infinite Sources / Connecting Cameras。有关算子形状以及模块如何暂停或阻断数据流,请参见 Operator Types and Synchronization 教程主题。
可暂停和不可暂停流#
生成的 FPGA 流水线用于控制模块之间的数据流。当模块尚未准备好接收更多数据时,它可以暂停其输入。因此,下游模块可以在有限时间内降低数据流速度。VisualApplets 不会在编辑器中应用此流控,而是由 FPGA 上构建的 Applet 来实现。
当流控制能够在不破坏设计的情况下阻断流时,该流就是可暂停的。当源无法被流控制停止时,该流就是不可暂停的。即使下一个模块忙碌,源也会不断传输数据。
不可暂停流也称为无限源。此名称指的是流控制,而不是指无限的图像大小。该流没有内部缓冲区来允许生成的 FPGA 设计暂停源。
VisualApplets 设计中的不可暂停源#
Camera operators是最常见的不可停止源。它们从相机接收像素并通过输出链路转发。它们没有可以吸收背压的缓冲区,也无法命令相机停止传输。
相比之下,可暂停源包括诸如以下项的算子: CreateBlankImage 和 CoefficientBuffer.
连接不可暂停源#
所有 O-type 和 P-type 算子都可以位于不可停止源的下游。无限源属性会在设计中的这些算子之间传播,直到某个模块将流转换为可控制的流。
只有部分 M 型 算子直接接受不可停止源。这些主要是 memory operators 例如 LineBuffer, ImageBuffer, ImageFifo和 FrameBuffer。特定的 M-type 算子是否接受无限源记录在算子帮助文档以及 Operator Reference.
如果您将不可停止源连接到不接受无限源的 M-type 算子上,则 Design Rules Check Level 2 会报告 infinite source 错误。请在构建 applet 之前修复该错误。
有关 M-type、O-type 和 P-type 的行为以及流控制规则,请参阅 Operator Types and Synchronization 教程主题。
您有两个选项来控制无限源:
- 配合使用缓冲算子,例如
LineBuffer,ImageBuffer或ImageFifo - 通过
Overflow算子。
对于相机路径,Basler 建议将 DRAM 缓冲区(LineBuffer 或 ImageBuffer)作为默认选择。使用 ImageFifo 仅适用于小型解耦任务。请参阅本主题开头的“关键术语”框以及 Memory 元素 教程主题。
信息
即: Overflow 运算符位于 同步方式 库会裁剪无法处理的帧。这会导致帧长度不同,并且下游并非所有算子都能处理这种情况。请勿将此算子与 算术溢出 (结果不再符合 Bit Width;请参阅 位算术 教程主题)或与 Overflow 状态参数 在缓冲区算子上(缓冲区已满;请参阅 Memory 元素 教程主题)。
即: Overflow 算子本身不缓存数据。因此,Basler 建议您始终将 Overflow 算子与 buffer 算子结合使用。
使用缓冲区算子#
缓冲算子将不可停止的数据流转换为可控数据流。即使下游模块尚未准备好接收更多数据,它们也能够接收输入端的数据。它们会在内部存储数据,并在下游模块准备就绪时将其转发。
典型的解耦算子包括 LineBuffer, ImageBuffer, ImageFifo以及支持无限源的其他 memory operators。当您需要吸收相机突发数据且下游处理或LineBuffer 或 ImageBuffer(DRAM) DmaToPC 必须应用流控制时,请在不可停止源之后直接放置一个 DRAM 缓冲区( ImageFifo 仅当所需的缓冲区较小时。
信息
即: ImageFifo 算子仅缓冲图像的一小部分。因此,存在发生 FIFO 溢出的重大风险,该风险不会在内部被检测到或处理。
如果您想使用 ImageFifo 算子来缓存不可停止的数据流,Basler 建议您使用 ImageFifo 以及前置的 Overflow 算子结合使用。这可以确保正确处理传入的数据并防止出现失控的溢出情况。
作为将 Overflow 算子与内存算子相结合的替代方案,您可以使用 ImageFlowControl 算子,可实现更安全、更稳健的处理。它结合了以下算子的缓冲功能: ImageFifo 并集成了溢出处理。
典型的采集路径如下:
Camera → LineBuffer 或 ImageBuffer (DRAM) → 进一步处理 → DmaToPC
仅对于小型解耦,您可以使用 ImageFifo 代替 DRAM 缓冲区,最好与 Overflow 结合使用,或者使用 ImageFlowControl。

如果没有缓冲区,DmaToPC 或其他暂停其输入的算子将无法调节相机流。设计将无法通过 DRC 或在硬件上产生死锁风险。
使用缓冲区算子来控制无限数据源时,必须将缓冲区算子的 InfiniteSource 参数设置为 ENABLED.

如果将 InfiniteSource 如果缓冲区算子的参数设置为 DISABLED,DRC Level 2 失败:

有关缓冲区大小、 FillLevel以及 RAM 使用情况,请参阅 Memory 元素 教程主题。
设置 InfiniteSource 参数#
许多缓冲区算子公开了 InfiniteSource参数。当算子输入连接到不可停止的数据源时,将其设置为 ENABLED DISABLED 。当输入来自可停止的数据流时,将其设置为
请遵循以下规则:
- 设置
InfiniteSource更改为ENABLED仅当模块输入实际连接到不可停止的数据源时。 - 设置
InfiniteSource更改为DISABLED在接收来自可停止数据流的数据的缓冲区算子上。 - 如果不确定,请首先设置
DISABLED首先。运行 设计规则检查 2 级 并调整带有检查标记的模块。
若要更改模块参数,请双击模块以打开Module Properties。使用Apply应用参数更改。有关链接属性和模块参数的详细信息,请参阅Parameterization教程主题。
当下游处理可以暂停时使用 Overflow 算子#
即: Overflow 算子将不可停止的传入 2D 数据流与可能暂时阻塞的处理解耦。它本身没有内部 buffer,因此 Basler 建议您始终将 Overflow 算子与 buffer 算子结合使用。当由于输出数据被阻塞而导致 buffer Fill 时, Overflow 算子会裁剪当前帧,将其标记为损坏,并且可以跳过后续帧,直到输出重新接受数据。
使用 Overflow 当源无法停止且下游算子暂停数据流的时间超过了行或帧缓冲区所能容纳的范围时。

当您将 Overflow 算子放置在不可停止的源与诸如 FrameBuffer,将 InfiniteSource 等 Memory 算子之间时, DISABLED。该 Overflow operator 已经处理了来自不可停止流的溢出。在此拓扑中启用 InfiniteSource 该拓扑中的内存模块上的参数设置错误,从而触发 DRC 错误。
即: Overflow operator 在切割帧时可能会产生非矩形帧。请验证下游 operator 是否能接受缩短的最后一行。请参阅 operator 描述 Overflow 中的 Operator Reference。
信息
作为将 Overflow 算子与内存算子相结合的替代方案,您可以使用 ImageFlowControl 算子,可实现更安全、更稳健的处理。它结合了以下算子的缓冲功能: ImageFifo 并集成了溢出处理。
使用 DRC 验证您的设计#
在连接数据源、Buffer 和 DMA 路径后,运行 Analysis → Design Rules Check Level 2。Level 1 也会在仿真和生成前自动运行。
DRC Level 2 将检查扩展规则并估算 FPGA 资源。当不可停止的数据源馈送给不接受无限数据源的 M 型 operator 时,或者当 InfiniteSource 设置与实际连接不匹配时,它会报告无限源错误。
阅读 DRC log 并修复突出显示的模块或链接。有关完整的工作流程,请参阅 From Empty Design to Running Applet 教程主题。
典型流水线示例#
通过缓冲区从相机到 DMA#
- 放置一个 camera operator 作为数据源。
- 插入
LineBuffer或ImageBuffer位于图像路径上(或ImageFifo仅用于小型解耦;参见上文)。 - 设置
InfiniteSource更改为ENABLED在缓冲区上。 - 连接处理算子和
DmaToPC. - 运行 DRC Level 1 和 Level 2,然后进行仿真或构建。
如果没有第 2 步和第 3 步,DRC Level 2 将针对该非法连接报告无限源错误。
带有 Overflow 和缓冲区的不可暂停源#
- 将不可停止的源连接到
Overflow. - 连接
Overflow更改为ImageFifo,LineBuffer,或其他缓冲区算子。 - 设置
InfiniteSource更改为DISABLED在Overflow. - 连接后续处理并运行 DRC Level 2。确认没有残留的无限源或
InfiniteSource不匹配。

Overflow 当其输出被抑制时,会裁剪或跳过帧。以下缓冲区用于存储可能会暂停的下游处理的数据。如果没有该缓冲区, Overflow 单独使用无法将不可停止的源与暂停的下游模块解耦。
相关主题#
- User Manual 中的 Rules of Links — Infinite Sources / Connecting Cameras — 正式连接规则
- Operator Types and Synchronization 教程主题 — M 型 operator 与阻塞
- Memory 元素 教程主题 — buffer operator 和
InfiniteSource - 参数化 教程主题 —
InfiniteSource及相关模块参数 - Pipeline Concept 教程主题 — 流控制、阻塞和反压
- 从空白设计到运行 Applet教程主题 — DRC、仿真和生成