流水线是一种可用于增强FPGA VI时钟速率和吞吐量的技术。在流水线设计中,用户可利用FPGA的并行处理特性提高顺序代码的有效性。如要实现流水线,必须将代码拆分为不同的级并连线每级的输入和输出端至循环中的反馈节点或移位寄存器。

下文介绍了FPGA VI在单周期定时循环内的标准执行和流水线执行。

单周期定时循环中的标准执行

在下列程序框图中,子VI ABC在单周期定时循环内顺序执行。因此,单周期定时循环的时钟速率必须设置为满足上述三个个运行子VI的运行时间的和值。

单周期定时循环中的流水线执行,使用反馈节点

在下列程序框图中,由于子VI的输入和输出连线至反馈节点,LabVIEW流水线处理子VI。在该FPGA VI中,子VI在单周期内并行执行,且最大时钟速率仅受具有最长组合路径的子VI的限制。

单周期定时循环中的流水线执行,使用移位寄存器

移位寄存器也可用于实现流水线代码,如下列程序框图所示。

实现流水线代码

实现流水线代码时考虑下列操作:

  • 最后一级的输出滞后输入的值等于流水线的级数。
  • 流水线填满前,时钟周期的输出无效。
  • 流水线的级数称为流水线深度。
  • 流水线延迟(以时钟周期为单位)对应其深度。流水线深度为N时,第N个时钟周期前的输出无效,且每个有效时钟周期的输出比输入端延迟N-1个时钟周期。

请参考以下范例。

在该范例中,三个独立的执行步骤分别执行子VI ABC,即流水线深度为3。由于该代码需要三个执行步骤,输出要到时钟周期3才有效。每个有效时钟周期C的输出总是对应时钟周期C – (N – 1)的输入。

时钟周期 说明
时钟周期 1 时钟周期1中,子VI A处理第一个测量值(Meas1),而子VI B子VI C都处理移位寄存器的默认值(Default),产生无效输出。
时钟周期 2 时钟周期2中,子VI A处理第二个测量值(Meas2),子VI B处理时钟周期1子VI A的输出,子VI C处理来自子VI B的无效输入,从而产生无效输出。
时钟周期 3 时钟周期3期间,由于所有输入都有效,并且子VI C的输出首次有效,流水线最终填满。子VI A处理第三次测量(Meas3),子VI B处理时钟周期2子VI A的输出,而子VI C处理时钟周期2子VI B的输出,从而产生与第一次测量(Meas1)相对应的输出。流水线填满后,全部后续时钟周期均生成有效的输出,常量延迟为两个时钟周期。
提示 考虑使用条件结构避免无效输出导致的未预期的操作,并确保控制算法在N个时钟周期后启用执行器。

使用流水线增加吞吐量

使用流水线可增加吞吐量,因为流水线可在单周期定时循环内以更快的时钟域内运行。

非流水线 (40 MHz)

示意图顶部为非流水线循环的执行时间。该代码包含三个子VI,每个需要12.5 ns的传播延迟。子VI A子VI C的全部延迟为37.5 ns,相对于40 MHz编译频率,延迟时间过长。

流水线 (40 MHz)

示意图的中部给出了流水线处理代码将传播延时减少至12.5 ns,从而循环可在40 MHz进行编译。

流水线 (80 MHz)

示意图底部为使用高达80 MHz时钟速率编译的循环,因为流水线循环的传播延迟仅为12.5 ns。

注: 流水线设计相对于非流水线设计,增加了时钟周期延迟。但由于流水线能够降低单个时钟周期的时间,因此总的时间延时不会发生显著变化。