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 上的抖动