在单周期定时循环中局部变量运行结果不正常
主要软件:
主要软件版本: 8.0
主要软件修正版本: N/A
次要软件: N/A
问题: 当在FPGA模块中读写局部变量时,我发现写入和读出的数据会有时候会不一致,为什么会出现这种情况呢?
解答: 在LabVIEW FPGA 模块中使用局部变量时需要非常小心。不同于PC机上的情况,在FPGA中实现的局部变量的运行结果可能会不一致,尤其是当局部变量被放在不同时钟域的单周期定时循环(SCTL)中的时候。
下面的屏幕截图展示了一个在多时钟域间传递数据的常见错误。当在PC上运行时,数据流的限制保证了每次循环读操作总能读到最后写入局部变量的值,所以虽然两个定时循环的执行速率不同,但是局部变量的读写总是能保持同步。但在LabVIEW FPGA中,数据流控制是由硬件握手逻辑电路来实现的。握手逻辑电路是一种保证数据出现在操作之前的电路。例如,在一个乘法操作中,两个乘数必须在乘法操作执行前出现,握手逻辑电路保证了输入数据先准备好,然后再执行乘法操作。

上例中添加握手逻辑电路的一个后果是增加了时延。在上图所示的VI中,额外的握手逻辑电路会增加时延,使得操作大于一个时钟周期,而单周期定时循环又强制循环中的所有操作在一个时钟周期内完成,这会引发一个问题,即握手逻辑电路给写操作引入了一个时延,读操作会读到一个“过时”的值。为了解决这个问题,请用FIFO代替局部变量来在循环间传递数据。
还有一个与上例相关的问题是数字和布尔量的读写操作不能同步,这是因为不会为数字和布尔量生成同步逻辑,解决的方法是将数字和布尔量绑定为一个簇,用簇型局部变量来传递数据。

运行在同一个时钟域的局部变量就不会出现上述的同步问题,如果上图中的两个定时循环都使用10Mhz的定时源,那同步问题不会发生。
相关链接: KnowledgeBase 3F3DH0NR: How do Sequence Structures Behave in a LabVIEW FPGA Single Cycle Timed Loop (SCTL)?
KnowledgeBase 3H6B0BSU: What Is A Single Cycle Timed Loop Architecture?
附件: 
报告日期: 09/21/2006
最近更新: 10/09/2006
文档编号: 3KBGM683
Other Support Options
Ask the NI Community
Collaborate with other users in our discussion forums
Request Support from an Engineer
A valid service agreement may be required, and support options vary by country.