LabVIEW FPGA模块的单周期定时循环常见问题解答

更新 Nov 7, 2018

适用于

Software

  • LabVIEW FPGA Module

问题详述

LabVIEW FPGA模块可以使用单周期定时循环(SCTL)。那什么是单周期定时循环?单周期定时循环有什么优势和局限?

解决方案

什么是单周期定时循环?
单周期定时循环 (SCTL)是LabVIEW定时循环结构的一种特殊用途。在FPGA VI中使用时,定时循环结构始终是SCTL。当与FPGA终端一起使用时,此循环将在您选择的FPGA时钟的一个时钟滴答内执行所有函数。默认时钟是40 MHz的 FPGA全局时钟。您可以将SCTL与派生时钟一起使用,以40 MHz以外的速率为循环提供时钟。在与FPGA终端一起使用时,无法动态更改定时循环的时序属性。

程序使用SCTL执行的速度有多快?
在FPGA VI中使用传统的While循环至少需要3个滴答才能执行每次迭代。这是因为在编译的FPGA VI中使用了启用链。对启用链的解释超出了本文档的范围,其用于确保将FPGA VI编译为位文件时的数据流进行传递。

此外,尽管如果没有数据依赖性,函数并行执行,While循环内的每个函数都需要至少执行一个tick。使用SCTL,循环内的所有函数必须在单个时钟滴答内执行。

在FPGA VI中使用SCTL的性能优势将根据循环中的内容而有所不同。如果您的代码可以在SCTL中成功编译而不是正常循环,您代码的运行性能显着提高。

SCTL 是否更有效利用 FPGA 资源?
是。由于您的逻辑是在硬件中组合实现的,因此代码生成的FPGA配置使用的资源更少。 SCTL不会进行添加、保存结果,然后相乘、保存结果,而是在一个时钟滴答中完成,而不必在两者之间保存结果。这节省了FPGA资源,因为在操作之间不需要触发器来保存每个先前操作的结果。

在SCTL内部可以使用所有函数和结构吗?
否。超过一个时钟滴答的函数,例如模拟I / O函数或任何等待的函数都无法在SCTL内部使用。此外,如果循环内部有一个逻辑链,执行时间超过一个时钟滴答,则该逻辑不能在SCTL内部使用,并且VI将无法编译。

序列结构可以放在SCTL中,但在FPGA上执行之前将从代码中删除。

单周期定时循环帮助页面 有一个不能在SCTL中使用的功能列表。有关各个VI的SCTL支持和定时信息的更多信息,请参见LabVIEW帮助。
  • 模拟周期测量VI
  • 巴特沃斯滤波器VI
  • 离散延迟VI
  • 导数函数
  • FIFO清除函数
  • FPGA I / O方法节点,除了一些FPGA目标
  • FPGA I / O属性节点,除了一些FPGA目标
  • 中断VI
  • 1维查找表 VI,选中Interpolate data复选框
  • 循环定时器VI
  • 如果至少一个节点在循环内同时至少一个节点在循环外部,则为同一I / O资源配置多个FPGA I / O节点
  • 如果您使用多个实例,则不可重入的子VI
  • 陷波滤波器VI
  • PID VI
  • 商和余数
  • 自反函数
  • 1D数组转置函数
  • 正弦波发生器VI
  • 单精度浮点运算
  • 平方根函数
  • 定时循环
  • 等待Express VI
  • 等待发生函数
  • while循环

我可以使用流水线技术在SCTL内部执行更多逻辑吗?
是。您可以使用移位寄存器或反馈节点来实现逻辑并行执行,并在SCTL的连续迭代之间传递数据;因此,整个逻辑链在多个SCTL迭代上执行。与FPGA VI中的任何并行实现一样,这使用额外的FPGA资源。

如果SCTL中的逻辑无法在一个滴答中执行,会报错吗?
是的,虽然在尝试编译FPGA VI之前,LabVIEW通常不会报告与时序相关的错误。编译中有两个不同的点,您可能会遇到与SCTL相关的错误。首先,当LabVIEW FPGA尝试将VI编译为VHDL代码(生成中间文件)时,如果在SCTL中使用了任何不受支持的函数(例如,商和余数),则会收到错误对话框。此框出现只需几秒钟(完整的VHDL编译过程不会开始)。

即使您在SCTL中避免使用不受支持的函数,如果SCTL包含足够的逻辑,使得循环仍无法在单个时钟周期内执行,则编译将因定时违规而失败。在Xilinx工具的实际编译期间会发生此类错误,并且可能会在编译中停留几分钟(或更长时间)。如果遇到这样的错误,请尝试减少SCTL中的逻辑或修改算法以允许VI成功编译。

SCTL是一项高级功能吗?
是。虽然某些任务可以在SCTL中非常简单地实现,但有些任务可能比较困难。例如,如果使用SCTL,则无法使用等待函数来实现高速数字协议。您必须使用状态机,以便循环的每次迭代只需要一次滴答。 SCTL为需要它的应用程序提供了速度和效率,但使用起来可能很棘手。在某些情况下,使用传统的While循环可能更合适。

我可以使用更快的全局时钟SCTL吗?
是的,但是在80 MHz或更高频率下编译的SCTL中可以执行的功能更少。

本文是否有帮助?

无帮助