FPGA中的原语(Language Templates)

一、什么是原语

二、原语讲解

2.1 IBUFDS

2.2 BUFG

BUFG 是 Vivado 提供的 全局时钟缓冲器(Global Clock Buffer),它的作用是:

将一个普通时钟信号(如外部晶振输入)连接到 FPGA 内部的全局时钟网络(Global Clock Tree),保证整个 FPGA 芯片内部所有时序单元可以同步工作。

那为什么需要 BUFG?

FPGA 是一个时序电路,每个触发器、状态机、计数器等都依赖统一的全局时钟

而从外部引脚进来的时钟(例如 PL_CLK_P/PL_CLK_N)只是普通信号:

  • 没有经过专用时钟树缓冲;
  • 无法直接驱动大量触发器;
  • 会导致严重的时钟偏斜(clock skew)
  • Vivado 会报时钟相关的 Place & Route 错误或严重 timing violation

使用BUFG的好处:

  1. 全局驱动:将时钟驱动到整个 FPGA 内部
  2. 消除时钟偏斜:所有逻辑单元同时接受一个“均衡”的时钟
  3. 必须走时钟树:Vivado 综合器只允许 BUFG 的输出进入 posedge clk 等时序逻辑
  4. 布局优化:Vivado 能做出专门优化策略,满足时序需求

!!!如果不在时钟输入里面加BUFG,可能会导致仿真OK,结果综合后跑不了,并且在Timing Report中看到非常大的clock skew。

正确设计结构需要:

1
2
3
4
5
6
7
8
9
10
IBUFDS → BUFG → clk → always @(posedge clk)

即:
外部差分时钟(100MHz)

IBUFDS(差分转单端)

BUFG(接入全局时钟网络)

clk → 所有模块时钟