一般来说,在进行HDL代码编写时,不需要直接或间接地进行原语调用,因为随着FPGA设计规模越来越庞大,人脑应该集中于抽象层次较高的工作中去,而将这些具体实现细节交给编译器来完成。不过有些时候,原语或者库中底层模板的调用还是十分必要的。1. 时钟相关原语 如果时钟信号不是由专门FPGA芯片的专用时钟管脚引入FPGA的,那么它通常就需要在FPGA内部被显式地连接到时钟树资源上,否则,知己恩使用这种不经过时钟树的时钟信号,会给FPGA设计的时序带来非常麻烦的问题,进而导致逻辑行为失败。
eg: wire innerclk, gclk;
BUFG onToGlobalClockTree ( .I (innerclk ),
.O (gclk )
);
always @ (posedge gclk)
begin ... end
通过显式调用BUFG这样一个库中的底层模块,告诉编译器,我们希望将innerclk信号引入全局时钟树,而其经过全局时钟树后的名字就改为gclk。后续HDL代码便可以放心地基于gclk编写逻辑。
2. 差分输入、输出原语eg: IBUFGDS clklvds
( .I (LVDSCLK_p ),
.IB (LVDSCLK_n ),
.O (sclk )
);
BUFG onToGlobalClockTree
(
.I (sclk ),
.O (gclk )
);
示例中,将差分时钟转换成单端时钟sclk,并通过GUFG原语将其引至全局时钟网络。
3. 接口相关原语 当需要使用接口资源中的寄存器来实现高速数据采集时。
4. UDP 用户自定义原语(User Defined Primitive)