ADS1675 LVDS接口的两种FPGA实现对比(1MSPS)

ADS1675 LVDS接口的两种FPGA实现方式(1MSPS)

一、背景

ADS1675 是 TI 的 24 位 Delta-Sigma ADC,LVDS 模式下 SCLK 由内部 PLL 将 32MHz 主时钟 3 倍频至 96MHz。本文基于手册 Figure 1 时序,介绍两种 FPGA 实现方案并对比。

关键时序(LVDS,手册 Figure 1):

  • f_SCLK = 3 × f_CLK = 96MHz,周期 10.417ns
  • SCLK↑ → DOUT 有效:1.5~2.5ns(取 2.0ns)
  • SCLK↑ → DRDY↑:2.0~3.0ns(取 2.5ns)
  • DRDY 脉宽:2~4 T_SCLK
  • 数据帧:24 SCLK = 250ns,1MSPS 下 DRDY 周期 1024ns

二、方案 A:高速过采样

思路

FPGA 用 300MHz 时钟过采样 96MHz SCLK 和 DRDY,通过边沿检测判断 SCLK 上升沿,在 FPGA 时钟域内完成移位采集。

架构

  • SCLK 96MHz → IBUFDS → 300MHz 同步采样 → 边沿检测 (r_sclk_r0 && !r_sclk_r1)
  • DRDY → IBUFDS → 300MHz 3 级同步 → 边沿检测
  • 三段式 FSM:S_IDLE → S_WAIT_MSB → S_CAPTURE
  • MSB 双路径检测:主检测(SCLK↑同拍 DRDY=1)+ 回退检测(上拍标记潜在 MSB,本拍 DRDY 确认)
  • 24 个 SCLK↑ 后锁存数据,FIFO 写脉冲延迟 1 拍与数据对齐
  • 300MHz FPGA 主频,功耗高

核心代码片段

复制代码
// 边沿检测 (300MHz 采样)
assign w_sclk_pos = r_sclk_r0 && !r_sclk_r1;
assign w_drdy_pos = r_drdy_r1 && !r_drdy_r2;

// MSB 双路径检测
assign w_msb_primary  = (state == S_WAIT_MSB) && w_sclk_pos && r_drdy_r0;
assign w_msb_fallback = (state == S_WAIT_MSB) && r_potential_msb && r_drdy_r0;

// 移位 (300MHz 时钟域)
r_shift_reg <= {r_shift_reg[22:0], i_ads_dout};

优点

  • 不需要额外的时钟资源,纯逻辑实现
  • 系统域统一为 300MHz,无需跨时钟域处理
  • CMOS 和 LVDS 版本核心逻辑可复用

缺点

  • FPGA 需 300MHz,功耗高,对时序收敛要求高
  • 边沿检测存在相位不确定性,需双路径兜底
  • 代码量较大(三段式 FSM + 双路径检测约 250 行)

三、方案 B:SCLK 时钟域直接捕获(推荐)

思路

将 ADC 的 96MHz SCLK 经 IBUFDS + BUFG 引入 FPGA 全局时钟网络,反相后在 SCLK 下降沿直接捕获 DOUT。利用 SCLK 下降沿天然位于数据有效窗口中央,无需高速过采样。FPGA 仅需 100MHz 系统时钟用于 CDC 传输。

为什么在下降沿捕获

SCLK 上升沿后 DOUT 在约 2ns 有效,DRDY 在约 2.5ns 拉高。SCLK 下降沿在上升沿后 5.2ns,此时 DOUT 已稳定超过 3ns,有充足建立时间。第一个 DRDY=1 时的下降沿即是 MSB 所在。

架构

  • SCLK 96MHz → IBUFDS → BUFG(全局时钟网络)→ 反相 → w_sclk_cap(捕获时钟)
  • SCLK 时钟域(96MHz):移位寄存器 + 位计数器,仅约 80 行逻辑
  • 帧检测:!r_active_sclk && w_drdy_raw(DRDY 电平检测,非边沿)
  • 24 个下降沿后锁存 r_data_sclk,置位 r_ready_sclk
  • CDC:r_ready_sclk 经 3 级同步器到 100MHz 系统域,上升沿检测取走数据
  • 系统域输出:o_fifo_wr/o_fifo_data 在 100MHz 时钟域

核心代码片段

复制代码
// IBUFDS + BUFG 时钟引入
IBUFDS #(.DIFF_TERM("TRUE")) u_ibuf_sclk (.I(sclk_p), .IB(sclk_n), .O(w_sclk_raw));
BUFG u_bufg_sclk (.I(w_sclk_raw), .O(w_sclk_g));
assign w_sclk_cap = ~w_sclk_g;  // 反相: 下降沿变上升沿

// SCLK 域: 帧启动 (DRDY 电平检测)
if (!r_active && w_drdy_raw)        // DRDY=1 且空闲 → MSB
    r_bit <= 1;

// SCLK 域: 帧结束 (bit 23→24, 即第24个下降沿)
else if (r_active && r_bit == 23)
    r_data <= {r_shift[22:0], w_dout};  // 锁存 24bit

// SCLK 域: 移位
r_shift <= {r_shift[22:0], w_dout};    // 左移, 新 bit 入 LSB

// CDC: 3 级同步到 100MHz 系统域
r_syn0 <= r_ready;  r_syn1 <= r_syn0;  r_syn2 <= r_syn1;
if (r_syn2 && !r_syn2_d1)              // 上升沿检测
    o_fifo_data <= r_data, o_fifo_wr <= 1;

优点

  • FPGA 仅需 100MHz 主频,功耗低,时序宽松
  • SCLK 下降沿天然对齐数据窗口,无需边沿检测和 MSB 定位逻辑
  • 代码量小(约 170 行),逻辑简单清晰
  • 利用 FPGA 全局时钟资源,捕获质量高

缺点

  • 需要额外的 BUFG 时钟资源
  • 引入了跨时钟域(96MHz → 100MHz),需 CDC 处理
  • SCLK 反相依赖相位关系,PCB 布线需注意 SCLK 和 DOUT 等长

四、两种方案对比

对比项 方案 A:高速过采样 方案 B:SCLK 直接捕获
FPGA 主频 300MHz 100MHz
功耗
时钟资源 无额外 1 个 BUFG
代码行数 ~250 行 ~170 行
核心逻辑 三段式 FSM + 双路径 MSB 检测 简单标志位 + 计数器
边沿/帧检测 双路径检测(主+回退) DRDY 电平检测
跨时钟域 无(统一 300MHz 域) 3 级同步器 CDC
时序收敛难度 高(300MHz) 低(100MHz)
CMOS/LVDS 复用 否(CMOS 无 BUFG 需求)
适用场景 追求代码统一 追求低功耗、高可靠

五、选型建议

  • 如果 FPGA 资源充足且追求与 CMOS 版本代码统一:选方案 A,一个 FSM 通吃两种接口
  • 如果追求低功耗、简化设计、降低时序收敛难度:选方案 B,100MHz 主频足够,逻辑简单清晰
  • 跨板长距离传输场景:两种方案均可,LVDS 差分传输本身已保证信号完整性,方案 B 的 BUFG 还能进一步滤除 SCLK 上的抖动