如要添加组件级IP (CLIP)至FPGA终端,必须以VHDL代码的形式提供IP,以将其编译至FPGA终端。提供VHDL代码的方式如下:

  • 创建VHDL。
  • 通过Xilinx IP生成器生成IP内核
  • 通过Xilinx或合作伙伴购买IP。

支持的IP文件类型

可通过VHDL、Verilog或Xilinx IP生成器定义IP。使用通过Verilog定义的IP时,应先将IP编译为网表文件,然后在VHDL文件中封装该文件。使用通过Xilinx IP生成器定义的IP时,可直接导入约束文件至CLIP信号。根据指定的FPGA终端,使用约束文件指定约束。但如对CLIP信号应用约束,LabVIEW程序框图必须使用该信号。否则编译VI时,LabVIEW将返回Xilinx错误。

自定义用户库

在VHDL中,CLIP不支持自定义用户库。如VHDL使用了自定义用户库,可采用下列解决方案:

  • 通过VHDL创建网表并使用CLIP集成该网表。
  • 引用默认的引用库,而不是自定义用户库。

IP设计准则

为了满足FPGA终端要求以及正确匹配LabVIEW FPGA模块接口,VHDL必须满足几项准则。这些准则用于控制I/O端口、时钟及VHDL代码的重置操作。

I/O数据类型

所有与LabVIEW连接的I/O必须支持LabVIEW数据类型。下表列出了FPGA模块支持的数据类型以及必须用于IP接口的相应VHDL数据类型。

FPGA模块数据类型 VHDL数据类型
布尔

std_logic

U8和I8

std_logic_vector(7 downto 0)

U16和I16

std_logic_vector(15 downto 0)

U32和I32

std_logic_vector(31 downto 0)

U64和I64

std_logic_vector(63 downto 0)

定点 std_logic_vector(x downto 0)、其中x的范围为[0,63]。

例如,FPGA模块表示类型的IP输入端口std_logic_vector(31 downto 0),即一个32位无符号整数(U32)。如VHDL代码需要使用一个不支持宽度(如std_logic_vector(65 downto 0))的端口,必须创建一个封装VHDL文件,以将此端口扩展为FPGA模块支持的数据类型。关于该扩展范例的详细信息见NI网站。

注: 部分CLIP插槽支持额外的数据类型。CLIP插槽的可用性取决于FPGA终端。关于CLIP插槽详细信息见终端的硬件文档。

CLIP时钟

在XML文件中声明的Reset信号失效后,所有FPGA时基时钟和衍生时钟均稳定并立即开始自由运行。但外部时钟可能停止或产生毛刺。尽量避免使用可能停止或产生毛刺的时钟。如有重置时钟的代码,请确保其他代码的稳定和自由运行不会受到该时钟的影响。

访问CLIP I/O时必须考虑CLIP时钟。CLIP I/O定时是独立于IP的,因此IP必须能够使用正确的时钟读取和写入CLIP I/O。如在不同的时钟域读取和写入CLIP I/O,必须在FPGA I/O属性对话框的高级代码生成页面、FPGA I/O节点属性页面的高级代码生成页面和/或CLIP的VHDL代码内包含同步寄存器。但如果在同一时钟域内通过CLIP和VI访问同一I/O,设置同步寄存器的值为0可最小化延时。

也可在FPGA VI可用的CLIP内声明时钟。除CLIP时钟不能用作顶层时钟外,使用CLIP时钟与使用终端提供的FPGA时钟类似。

注: 插槽CLIP也可以直接访问FPGA的全局时钟。插槽CLIP的可用性取决于FPGA终端。关于插槽CLIP时钟的详细信息见终端的硬件文档。

重置VHDL代码

所有VHDL代码均包含一个信号异步重置输入,因此使用“重置”方法时,FPGA VI的VHDL代码被重置。建议包含信号异步重置。否则必须开发替代的重置机制,以确保VHDL代码在异步重置之前、之中和之后均正确运行。

约束和层次结构

编译时通过约束文件包含基于CLIP的用户约束,具体使用的格式取决于FPGA终端。该机制可用于除引脚布局约束外的全部约束。例如,可通过插槽CLIP的全局时钟缓存直接访问全局时钟输入引脚的时钟。必须约束该时钟的周期。

对于CLIP内指定组件的约束,可能需要指定组件在整个VHDL层次结构中的位置。对于这种情况可考虑使用下列宏作为限制的序。序能够保证约束的执行,而无需考虑组件在VHDL层次结构中的位置。如要使用此范例代码,可复制代码至文本文件,将文件另存为(Xilinx ISE) DemoClipAdder.ucf或(Xilinx Vivado) DemoClipAdder.xdc。在配置CLIP向导中添加该约束文件和VHD文件为综合文件,实现约束。

(Xilinx ISE)

NET "%ClipInstancePath%/myCLIPIO*" TNM_NET = %ClipInstanceName%myCLIPIO; TIMESPEC TS_%ClipInstanceName%ThruMyCLIP = TO "%ClipInstanceName%myCLIPIO" 10 ns;

(Xilinx Vivado)

create_clock -period 10.000 -name %ClipInstanceName%Clk -waveform {0.000 5.000} -add [get_pins %ClipInstancePath%/clk] set_clock_latency -clock [get_clocks {%ClipInstanceName%Clk}] 10.0 [get_pins {%ClipInstancePath%/cAddOut[0]}]

如要多次实例化CLIP,每个CLIP实例必须具有唯一的名称,且名称需符合VHDL命名规范。唯一命名每个CLIP常量,且请勿将k用作CLIP常量名称的前缀。包含宏的情况下无需为每个实例包含独立的约束文件,因为FPGA模块创建了唯一的实例名称。

如未使用某个CLIP信号,Xilinx编译工具可能会从位流中移除该信号。此时可能在编译过程中产生NGBuild错误。如要解决该问题,可在FPGA VI中移除约束或使用该信号。

(Xilinx Vivado)对于每一次编译,FPGA模块都会生成一个文件名为unapplied_constraints.xdc的文件,列出所有未应用的约束条件。请按照下列步骤验证编译中是否应用了某个约束条件:

  1. 找到默认目录:C:\NIFPGA
  2. 打开某次编译的文件夹。
  3. 解压缩output_files.zip,将unapplied_constraints.xdc保存至易于访问的位置。
  4. 打开unapplied_constraints.xdc,搜索约束条件。

关于创建VHDL代码的范例见“CLIP入门指南-第一部分:创建VHDL代码”。

警告 为确保数据完整性和时序收敛,验证来自CLIP的I/O节点的写入时钟域是否与其在LabVIEW程序框图上的读取时钟域相同,及验证至CLIP的I/O节点的读取时钟域是否与其在LabVIEW程序框图上的写入时钟域相同。
注: 请勿编写依赖于非CLIP逻辑路径的约束条件,因为NI无法保证这些路径不会更改。