实现多个时钟域
- 更新时间2025-05-20
- 阅读时长4分钟
单周期定时循环可在不同时钟域下运行。在FPGA VI中使用单周期定时循环指定时钟域。所有可用的FPGA终端时钟在项目浏览器窗口中显示为FPGA终端时基或衍生时钟。FPGA终端支持的FPGA终端时基或衍生时钟可被用作单周期定时循环的定时源。但在单周期定时循环中放置的代码的组合路径长度必须足够短,以实现在指定的时钟周期内运行。
同步不同时钟域下的I/O
在位于不同时钟域的单周期定时循环间可能需要进行数据传输。多数FPGA终端上的数字输入与顶层FPGA终端时钟不同步,且必须进行重新同步。某些FPGA终端允许使用同步至指定时钟的外部时钟或I/O资源。如输入数据已与顶层FPGA终端时钟同步,此时可避免重新同步带来的系统开销。关于可用I/O资源同步的详细信息见指定FPGA终端的硬件文档。
在时钟域间传输数据
如要在时钟域间传输数据,可使用单周期定时循环隧道、寄存器项、握手项、局部和全局变量或存储器块FIFO。下表总结了每个方法的特性:
| 传输方法 | FPGA资源 | 损耗? | 并行循环间? | 无限域之间? | 常用于 |
|---|---|---|---|---|---|
| 单周期定时循环隧道 | 逻辑 | 否 | 否 | 否 | 数据记录 |
| 寄存器项和局部/全局变量 | 逻辑 | 是 | 是 | 是 | 控制,仿真 |
| 使用存储器块实现存储器项 | 存储器 | 是 | 是 | 否 | 数据记录 |
| 存储器块FIFO | 逻辑和存储器 | 否 | 是 | 否 | 数据记录 |
| 握手项 | 逻辑 | 否 | 是 | 否 | 控制,仿真 |
单周期定时循环隧道
单周期定时循环隧道可用于在单周期定时循环上连线输入和输出信号。LabVIEW在输入信号和循环时钟域间实现握手。单周期定时循环的每个计数终止后,LabVIEW在任意输出信号和顶层FPGA终端时钟间实现握手。单周期定时循环隧道保持了LabVIEW数据流,因此不能用于在并行循环间传输数据。
寄存器项和局部/全局变量
用户可从唯一时钟域写入寄存器项或局部/全局变量。然后能够在尽可能多的用户所需的时钟域内读取寄存器项或局部/全局变量。LabVIEW将来自写入域的数据传输至读取域并使用握手机制避免数据损坏。源和目标时钟之间通过握手产生新值,写入域与读取域必须要等待几个时钟周期。由于握手机制的系统开销,从一个时钟域写入的值可能无法被目标域读取。如要避免数据写入速度高于数据读取速度,必须编程额外的逻辑以确保读取方和写入方之间的双向通信,以避免数据丢失。
使用存储器块实现存储器项
仅当使用存储器块实现存储器项时,可使用终端范围或通过VI定义的存储器项存储数据,并从不同的时钟域访问数据。如要更改存储器实现,可在存储器属性对话框的常规页面选择存储器块用作存储器项的实现。在上述操作中,每个存储器项仅使用一个写入方节点和一个读取方节点。
| 警告 当在多时钟域使用块内存实现存储器项时, 可同时从同一地址读取和写入数据。但可能导致读取不正确的数据。 |
存储器块FIFO
仅当用户使用存储器块实现FIFO时,可使用终端范围的或VI定义的FIFO在时钟域间传输数据。如要更改FIFO实现,可在FIFO属性对话框的常规页面选择存储器块用作存储器项的实现。仅可通过一个时钟域写入数据至存储器块FIFO。然后仅可通过另一个时钟域读取FIFO。
握手项
仅可通过一个时钟域写入数据至握手项。然后可在同一时钟域或不同的时钟域读取握手项。可在任意时钟域清除握手项。LabVIEW使用握手项在写入域和读取域间实现无损耗的传输,并在读取方接收到数据时通知写入域。写入和读取时钟域之间通过握手产生新值,LabVIEW需要等待几个时钟周期。