原语是 Xilinx 器件底层硬件中的功能模块,它使用专用的资源来实现一系列的功能。相比于 IP 核,原语的调用方法更简单,但是一般只用于实现一些简单的功能。本章主要用到了 BUFG、BUFIO、IDDR、ODDR、IDELAYE2 和 IDELAYCTRL。
BUFG:全局缓冲,BUFG 的输出到达 FPGA 内部的 IOB、CLB、块 RAM 的时钟延迟和抖动最小。BUFG原语模板如下:
除了 BUFG 外,常用的还有 BUFR,BUFR 是 regional 时钟网络,它的驱动范围只能局限在一个 clockregion 的逻辑。BUFR 相比 BUFG 的最大优势是偏斜和功耗都比较小。
BUFIO:BUFIO 是 IO 时钟网络,其独立于全局时钟资源,适合采集源同步数据。它只能驱动 IO Block里面的逻辑,不能驱动 CLB 里面的 LUT,REG 等逻辑。BUFIO 原语模板如下:
BUFIO 在采集源同步 IO 数据时,提供非常小的延时,因此非常适合采集比如 RGMII 接收侧的数据,但是由于其不能驱动FPGA的内部逻辑,因此需要BUFIO和BUFG配合使用,以达到最佳性能。如ETH_RXC的时钟经过 BUFIO,用来采集端口数据;ETH_RXC 经过 BUFG,用来作为除端口采集外的其他模块的操作时钟。
IDDR:在7系列设备的ILOGIC block中有专属的registers来实现input double-data-rate(IDDR) registers,将输入的上下边沿 DDR 信号,转换成两位单边沿 SDR 信号。IDDR 的原语结构图如下图所示:
DDR_CLK_EDGE 参数为 IDDR 的三种采集模式,分别为“OPPOSITE_EDGE”、“SAME_EDGE”和“SAME_EDGE_PIPELINED”模式。
OPPOSITE_EDGE 模式的时序图如下图所示:
SAME_EDGE_PIPELINED 模式下,在时钟的上升沿输出 Q1 和 Q2,Q1 和 Q2 虽然在同一个 cycle 输出,但整体延时了一个时钟周期。在使用 IDDR 时,一般采用此种模式。
ODDR:通过 ODDR 把两路单端的数据合并到一路上输出,上下沿同时输出数据,上升沿输出 a 路,下降沿输出 b 路;如果两路输入信号一路固定为 1,另外一路固定为 0,那么输出的信号实际上是时钟信号。ODDR 的原语结构图如下图所示:
此种模式下,在 FPGA 内部需要两个反相时钟来同步 D1 和 D2,此种模式使用较少。SAME_EDGE 模式的时序图如下图所示:
此种模式下,数据可以在相同的时钟边沿输出到 Q,一般采用此种模式。IDELAYE2:IO 延时原语,用于在信号通过引脚进入芯片内部之前,进行延时调节,一般高速端口信号由于走线延时等原因,需要通过 IDELAYE2 原语对数据做微调。IDELAYE2 原语模板如下:
IDATAIN 为延时前的输入信号,DATAOUT 为延时后的输出信号。REFCLK_FREQUENCY参数为IDELAYCTRL 原语的参考时钟频率,一般为200Mhz;IDELAY_VALUE参数用来设置延时的 tap 数,范围为 1~31,每个 tap 数的延时时间和参考时钟频率有关。和 IDELAYE2 对应的还有 ODELAYE2,由于达芬奇 Pro 系列没有 ODELAYE2 原语,故此处不做讨论。IDELAYCTRL:IDELAYCTRL 和 IDELAYE2 一般同时使用,IDELAYCTRL 对 IDELAYE2 延时进行校准。IDELAYE2 原语如下:
IODELAY_GROUP 为延时 IO 分组,一般数据接口位于多个 BANK 时,才需要分组。IDELAYCTRL 通过参考时钟 REFCLK 来校准 IDELAY2 每个 tap 的延时值,可用的 REFCLK 频率为190Mhz~210Mhz 或者 290Mhz~310Mhz。时钟频率越高对应的 tap 延时平均值越小,即延时调节精度越高。当参考时钟为 200Mhz 时,一个 tap 为 78ps。
(