【CXD720】-为何要将将寄存器放入IOB中?
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_data0;(*IOB FORCE*)reg [11:0] ad_data0;always (posedge clk50m)beginad_data ad_din;da1_out {ad_data,2d0}8192;重新布局布线后查看布局图如下。可以从图中看出DA最末一级寄存器使用的是IOB中的寄存器图中最右侧为IOB端口左侧橙色方块为IOB中的触寄存器。关于IOB内寄存器的作用如下所示IOB 内寄存器IDDR/ODDR放置输入首拍、输出末拍触发器的核心意义一、基础概念FPGA 每个 IOB输入输出块内部自带硬件原生寄存器输入侧IDDR双沿输入寄存器/ 单沿输入寄存器输出侧ODDR双沿输出寄存器/ 单沿输出寄存器默认逻辑寄存器放在 CLB 逻辑块内把输入第一级、输出最后一级寄存器放到 IOB称为寄存器打包到 IOBPack I/O Registers into IOB。二、输入信号首拍触发器放入 IOBIDDR/IO 输入寄存器的作用1. 极致缩短输入路径时序大幅提升 Setup 裕量普通方案外部管脚 → IBUF → 片内长线走线 → CLB 寄存器长线互连延时大高速输入极易出现建立时间负裕量。IOB 寄存方案外部管脚 → IBUF →IOB 内部寄存器无片内长线数据在管脚缓冲后立刻锁存消除 IBUF 到 CLB 之间巨大的布线延迟set_input_delay带来的外部延时压力全部由 IO 寄存器承担内部逻辑路径时序压力清零对应你工程 50MHz 时钟、带输入延时约束的场景能直接改善输入路径 Setup Slack。2. 抑制输入亚稳态跨异步外部信号IOB 寄存器紧贴输入缓冲从管脚到寄存器的走线极短寄生 RC 延迟极小外部异步信号进入 FPGA 后最快完成同步锁存减少亚稳态传播到内部逻辑的概率是高速 ADC、外部异步采样的标准方案。3. 降低时钟偏移SkewIOB 寄存器时钟直接由 BUFG 全局时钟直达 IOB不需要穿过 CLB 阵列同一组输入总线的所有 IO 寄存器时钟到达延迟高度一致总线内时钟偏移极小并行总线同步性更好。4. 适配动态相位 PS、ISERDES 串并转换MMCM 动态移相、高速串行采样 ISERDES 必须使用 IOB 内部寄存器寄存器在 IOB 内才能让 STA静态时序分析精准匹配 MMCM 相位偏移否则时序计算偏差巨大。三、输出信号末拍触发器放入 IOBODDR/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 普通寄存器无法实现双边沿同步输出。