FPGA设计过程中,对输入输出信号一般遵循下列原则:
1)输入信号先经时钟寄存器后送入内部处理(也称打一拍)
2)输出信号,经时钟触发(寄存器)后再送出
3)输入信号的第一级寄存器一般采用IOB内的寄存器
4)输出信号的最后一级寄存器一般使用IOB内的寄存器
使用IOB中的寄存器的方法有多种,比如在约束文件中设置约束条件,在布线工具中设置参数,以及在代码中添加Verilog 属性注释语句。
对于CXD720_demo工程文件而言,文件采用了12位AD及2路14位的DA端口,不加任何约束时,IOB中的触器没有使用,工程实现后的布局如下图。

图中最右侧橙色不IOB管脚端口,左侧为IOB内的寄存器,由未寄存器未高亮显示,因此没有使用。
添加寄存器注释语句后的代码如下:
(*IOB = "FORCE"*) output reg 13:0 da2_out
//将采集到的信号送DA1输出
reg 11:0 ad_data=0;
(*IOB = "FORCE"*)reg 11:0 ad_data=0;
always @(posedge clk50m)
begin
ad_data <= ad_din;
da1_out <= {ad_data,2'd0}+8192;
重新布局布线后,查看布局图如下。

可以从图中看出,DA最末一级寄存器使用的是IOB中的寄存器(图中最右侧为IOB端口,左侧橙色方块为IOB中的触寄存器)。
关于IOB内寄存器的作用如下所示:
IOB 内寄存器(IDDR/ODDR)放置输入首拍、输出末拍触发器的核心意义
一、基础概念
FPGA 每个 IOB(输入输出块)内部自带硬件原生寄存器:
- 输入侧:
IDDR(双沿输入寄存器)/ 单沿输入寄存器 - 输出侧:
ODDR(双沿输出寄存器)/ 单沿输出寄存器默认逻辑寄存器放在 CLB 逻辑块内;把输入第一级、输出最后一级寄存器放到 IOB,称为寄存器打包到 IOB(Pack I/O Registers into IOB)。
二、输入信号首拍触发器放入 IOB(IDDR/IO 输入寄存器)的作用
1. 极致缩短输入路径时序,大幅提升 Setup 裕量
普通方案:外部管脚 → IBUF → 片内长线走线 → CLB 寄存器
长线互连延时大,高速输入极易出现建立时间负裕量。
IOB 寄存方案:外部管脚 → IBUF → IOB 内部寄存器(无片内长线)
- 数据在管脚缓冲后立刻锁存,消除 IBUF 到 CLB 之间巨大的布线延迟;
set_input_delay带来的外部延时压力全部由 IO 寄存器承担,内部逻辑路径时序压力清零;- 对应你工程 50MHz 时钟、带输入延时约束的场景,能直接改善输入路径 Setup Slack。
2. 抑制输入亚稳态(跨异步外部信号)
IOB 寄存器紧贴输入缓冲,从管脚到寄存器的走线极短,寄生 RC 延迟极小;外部异步信号进入 FPGA 后,最快完成同步锁存,减少亚稳态传播到内部逻辑的概率,是高速 ADC、外部异步采样的标准方案。
3. 降低时钟偏移(Skew)
IOB 寄存器时钟直接由 BUFG 全局时钟直达 IOB,不需要穿过 CLB 阵列;同一组输入总线的所有 IO 寄存器时钟到达延迟高度一致,总线内时钟偏移极小,并行总线同步性更好。
4. 适配动态相位 PS、ISERDES 串并转换
MMCM 动态移相、高速串行采样 ISERDES 必须使用 IOB 内部寄存器;寄存器在 IOB 内才能让 STA(静态时序分析)精准匹配 MMCM 相位偏移,否则时序计算偏差巨大。
三、输出信号末拍触发器放入 IOB(ODDR/IO 输出寄存器)的作用
1. 消除输出路径长线延迟,优化 Hold 建立裕量
普通方案:CLB 寄存器 → 片内长线 → OBUF → 外部管脚
寄存器到 OBUF 的走线延时大,输出时序(
set_output_delay)容易报 Setup 违例。
IOB 寄存方案:CLB 逻辑 → 短线 → IOB 输出寄存器 → OBUF → 管脚
- 输出寄存器紧贴输出缓冲 OBUF,寄存器到引脚的传输延迟固定且极小;
- STA 计算
set_output_delay时序时,片内输出路径延迟几乎可以忽略,大幅提升输出时序裕量; - 解决高速并行输出、DDR、DAC 高速输出的时序临界问题。
2. 减小输出时钟到数据偏移(Tco 波动)
IOB 寄存器与 OBUF 物理相邻,器件传输延迟 Tco 一致性极高;多 bit 并行输出总线每一路数据的 Tco 差异极小,外部芯片更容易满足采样建立保持要求。
3. 抑制组合逻辑毛刺(消除输出尖峰干扰)
如果输出逻辑存在多级组合逻辑,CLB 寄存器输出会产生大量毛刺;寄存器放在 IOB,毛刺仅存在于 FPGA 内部极短走线,不会传导到 PCB 引脚,降低 EMI 电磁干扰,避免外部芯片误采样。
4. 支持双沿数据输出(ODDR 双倍速率)
DDR 类接口必须使用 IOB 内 ODDR 寄存器,CLB 普通寄存器无法实现双边沿同步输出。