握手是指建立了用于持续通信的参数的两个节点间的通信。对于给定程序框图的单周期定时循环中的节点F,握手机制确定发生下列动作的时间:

  • F 丢弃来自上方数据流节点的数据。上方数据流节点是指发送数据至F的节点。
  • F 接收来自上方数据流节点的数据。
  • 下方数据流节点丢弃来自F的数据。下方数据流节点是指接收来自F的数据的节点。
  • 下方数据流的节点接收来自F的数据。

在单周期定时循环中,握手是非常必要的。因为多个周期节点需要不止一个周期来计算有效的数据,但单周期定时循环强制这些节点在每个时钟周期内返回数据。因此,多周期节点不能在每个时钟周期返回有效的数据。为了确保算法的数值精确性,依赖于此数据的节点必须了解该数据为有效数据还是无效数据。

NI已经建立了可与单周期定时循环内的特定节点配合使用的握手协议。协议包含下列接线端:

  • 输入有效-指定下一个数据已经到达并等待处理。
  • 输出有效-指示节点当前处理的数据有效,且准备用于下方数据流节点。
  • 准备输出-指定数据流节点是否接收新的数据。
  • 准备输入-指示节点在下一个时钟周期是否接收新的数据。
注: 由于该协议包含4个接线端。FPGA VI中的握手机制常被称为4线协议。

确保单输入节点使用有效的数据

假设在单周期定时循环中有3个单输入函数:上方数据流函数U、函数F及下方数据流函数D。这些函数的输入值为x,并在指定时钟周期后产生输出数据。下图给出了使用NI建议的握手协议连线UFD的方法。

在上图中,连线端的数值取决于下列步骤:

  1. U发送有效数据至F时,F输入有效接线端的值变为TRUE。TRUE表示U已经产生了有效的输出值,并已发送该值至F。如要使用该逻辑,连线U输出有效接线端至F输入有效接线端。即F能够获知U何时产生有效的输出值。
  2. F输入有效接线端接收到TRUE值后,F开始计算结果。F计算结果时,F输出有效接线端返回FALSE。当下列2个标准均满足时,输出有效接线端返回TRUE。
    • F开始计算结果以来,至少已经过L f个时钟周期,其中L fF的延迟时间。在函数的配置对话框中可查看函数的延迟。双击函数可打开函数配置对话框。
    • F准备输出接线端为TRUE。该接线端通知F,何时D已经准备好从F接收输入值。如要使用该逻辑,可通过反馈节点将D准备输入接线端连线至F准备输出接线端。由于反馈节点默认情况下需要一个执行时间周期,F将在D发送数据后的一个时钟周期接收到该值。
  3. 如果将F输出有效接线端连线至D输入有效接线端,D就会知道F何时生成了有效值,并将该值发送给D。此逻辑与步骤1中的逻辑类似。除F变为上面数据流函数外,D执行的进程均相同。
  4. 如在下一个时钟周期,F可接收另一个有效输入数据点,F输入就绪接线端会返回TRUE。如要使用该逻辑,通过反馈节点连线F准备输入接线端至U准备输出接线端。即U可获知F何时准备好接收新的输入值。由于反馈节点默认情况下需要一个执行时间周期,U将在F发送数据后的一个时钟周期接收到该值。
提示如要获取高吞吐率,请在F吞吐率输入控件中输入较小的值。F接收到有效输入并开始计算结果后,在F可接收下一个有效输入前至少已经经过了T f个时钟周期,其中T f为F的吞吐率控件值。因此,吞吐率控件的较小的值意味着相对于较大的吞吐率值,F能够更快的接收到下一个有效输入数据。小吞吐率值还意味着相对于较大的吞吐率值,F准备输入接线端能够更早的返回TRUE。

确保多输入节点使用有效的数据

“高吞吐率加”函数为多输入函数,因此此函数有2个输入端xy。在单周期定时循环中,必须确保在同一个时钟周期内的xy均有效。如仅一个输入端有效,另一个输入端无效。函数将使用一个有效输入值和一个无效输入值计算输出数据。

为了确保有效xy在同一个时钟周期内到达,给所有为x提供数据的节点添加延迟。然后给为y提供数据的所有节点提供延迟。2个延迟的总和必须相等。如果延迟总和不同,可为延迟短的路径(具有最低延迟总和的路径)添加反馈节点,直至xy路径的延迟总和相等。

注: 默认情况下,反馈节点为路径增加一个时钟周期的延迟。但用户可修改每个反馈节点的延迟。同一路径中的节点具有不同数量的流水线级时,上述设计方法很有效。

关于演示如何在多输入握手应用中平衡延迟路径的范例,见labview\examples\target_type \FPGA Fundamentals\FPGA Math and Analysis\High-Throughput Math\Vector Normalization\Vector Normalization.lvproj,其中target_typeCompactRIOR Series,具体取决于所安装的驱动程序。

支持握手机制的节点

下列节点支持握手接线端:

  • FFT Express VI
  • 握手方法节点
  • 高吞吐率数学函数,除基本元素函数外。
  • 线性代数函数
  • 配置DRAM时的存储器方法节点
  • FIFO方法节点,已启用握手接口
  • 有理重采样 Express VI
  • 缩放窗口 Express VI
  • 用户控制I/O采样函数

支持多通道握手的节点

下列节点支持多通道握手:

  • 有理重采样 Express VI

对于多通道节点,LabVIEW交错分配值,进而第一个有效数据进入第一个通道,第二个有效数据进入第二个通道,以此类推。如在通道扫描过程中,输入有效变为FALSE,对应下一个通道的下一个有效值立即进入队列。如下列示意图所示。

在示意图中,d0、d1和d2为3个接收数据的通道。注意每次输入有效接线端变为FALSE,然后又转换为TRUE时,对应下一个通道的下一个有效数据立即进入队列。

确定最快的可用吞吐率

对于单周期定时循环内部的一系列连接节点,最快吞吐率是指可发送更多数据至系列节点的最少时钟周期数。最快吞吐率等于系列中最慢的节点的吞吐率(即带有最大值吞吐率输入控件的节点)。此节点为所有节点的瓶颈。如系统以高于此最快吞吐率的速率向节点发送数据(即发送数据至节点时,系统等待的时钟周期少于最小允许的时钟周期数量),LabVIEW将丢弃该数据。

如要判定节点的最快吞吐率,首先查看该节点的吞吐率输入控件确定每个节点的吞吐率。双击节点或显示节点的即时帮助窗口可查看控件信息。具有最大值(即最慢的节点)的吞吐率输入控件为系统可发送数据至此系列函数的最快速率(即最少的时钟周期数)。

例如,假设一系列节点中,最慢节点吞吐率为32周期/样本,FPG终端A的时钟速率为40MHz,输入采样率为2MS/s。时钟速率除以输入采样率得到系统吞吐率,即40000000周期/ 2000000样本(20周期/样本)。此时,系统每20个时钟周期发送数据至节点,该周期比最快吞吐率32个时钟周期要快。这将导致LabVIEW丢弃数据。

注: 系统吞吐率与系统中的通道数量成反比,且通道吞吐率与系统中的通道量成正比。下列公式说明了系统吞吐率和通道吞吐率之间的关系。系统吞吐率=通道吞吐率/通道数 通道吞吐率=系统吞吐率Χ通道数。例如,系统吞吐率为200周期/采样,系统带有4个通道,则每个通道的吞吐率为800周期/采样。