ODDR原语说明

  • ~1.93K 字

ODDR(Output Double Data Rate,双数据率输出)原语是 FPGA 内部(特别是 Xilinx FPGA 的 I/O 模块中)一个非常重要的底层硬件资源。

简单来说,它的核心功能是:在一个时钟周期内,利用时钟的上升沿和下降沿向外部引脚发送两次数据。

以下是关于 ODDR 的详细使用说明和应用场景解析

ODDR 的基本原理与端口说明

普通触发器(Flip-Flop)只能在时钟的单边沿(通常是上升沿)更新数据。而 ODDR 是硬线逻辑,专门放置在 FPGA 芯片边缘的 IOB(输入/输出块)中,紧挨着芯片引脚。

实例化代码模板(以 Xilinx 7 系列为例)

1
2
3
4
5
6
7
8
9
10
11
12
13
ODDR #(
.DDR_CLK_EDGE("SAME_EDGE"), // 工作模式:"OPPOSITE_EDGE" 或 "SAME_EDGE"
.INIT(1'b0), // Q 端初始值: 1'b0 或 1'b1
.SRTYPE("SYNC") // 复位/置位类型: "SYNC" (同步) 或 "ASYNC" (异步)
) ODDR_inst (
.Q (Q_out), // 1-bit 输出信号(连接到外部引脚)
.C (clk), // 1-bit 时钟输入
.CE (1'b1), // 1-bit 时钟使能信号(高电平有效)
.D1 (data_1), // 1-bit 数据 1(将在 C 的上升沿输出)
.D2 (data_2), // 1-bit 数据 2(将在 C 的下降沿输出)
.R (1'b0), // 1-bit 复位信号
.S (1'b0) // 1-bit 置位信号
);
  • DDR_CLK_EDGE (决定了 FPGA 内部逻辑如何将数据送给 ODDR)
    • OPPOSITE_EDGE(相反边沿): 传统模式。内部逻辑必须在时钟上升沿准备好 D1,在下降沿准备好 D2。这在 FPGA 内部布线中很难满足时序要求,一般仅在时钟转发(D1=1, D2=0 常数)时使用
    • SAME_EDGE(相同时钟边沿): 推荐模式。内部逻辑只需要在同一个时钟上升沿同时准备好 D1D2ODDR 内部会自动将 D2 缓存半个周期,然后准确地在下降沿输出。这极大地降低了内部时序收敛的难度。

什么情况下使用 ODDR?

时钟转发(Clock Forwarding)

当需要将 FPGA 内部的系统时钟输出给外部芯片(如显示屏驱动、摄像头、PHY 芯片)时。

  • 配置方法: D1 = 1, D2 = 0,模式选 OPPOSITE_EDGE
  • 为什么不用普通的管脚输出? 全局时钟网络无法直接连接到普通输出引脚,必须经过 ODDR。这样输出的时钟质量最高,抖动(Jitter)最小,且与数据信号的延迟(Skew)能完美匹配。

高速双沿数据传输(True DDR Data)

外部接收芯片要求在时钟的上升沿和下降沿都接收数据,以提高带宽(时钟频率不变,数据吞吐量翻倍)。

  • 典型协议:
    • 千兆以太网接口(RGMII):TXD 信号线在上升沿发送低 4 位,在下降沿发送高 4 位。
    • DDR 内存控制器:在 DQS 时钟的双沿发送数据。
    • 高速 ADC / DAC 接口。
  • 配置方法: 将并行数据转换为双沿输出,模式选 SAME_EDGE

源同步接口(Source-Synchronous)中的精确时序对齐

在源同步设计中,FPGA 需要同时输出“时钟”和“数据”。 为了让外部芯片能稳定采样,时钟和数据到达引脚的物理延迟必须一致。

  • 做法: 数据信号通过 ODDR 输出(哪怕外部只需单沿采样,也可以让 D1=D2=数据,或者让 D2 输出无效位);时钟信号也通过旁边的 ODDR 输出。
  • 效果: 两者都在 IOB 内部完成最后一步寄存,利用了物理位置完全相同的布线资源,最大程度消除了布线延迟差异,保证了完美的时序对齐。

可以把 ODDR 想象成 FPGA 内部世界(单边沿、低速、宽总线)与外部世界(双边沿、高速、窄总线)之间的“高速收费站”。

赞助喵
非常感谢您的喜欢!
赞助喵
分享这一刻
让朋友们也来瞅瞅!