概述
在工业控制、电力监测、医疗设备、雷达信号处理等高精度多通道数据采集场景中,ADI 公司的 AD7606 几乎成了行业标配。它是一款 16 位、8 通道、真差分输入、同步采样 ADC,最高支持 200 kSPS 采样率,内置抗混叠滤波器和可编程增益,极大简化了前端模拟电路设计。
如何用 FPGA 高效驱动 AD7606,并实现稳定可靠的数据读取?这是本文要深入剖析的核心问题。
系统架构概览 —— 从需求到顶层设计
AD7606 关键特性回顾
- 8 通道同步采样(CH0~CH7)
- 16 位分辨率,±5V 或±10V 输入范围(由 RANGE 引脚控制)
- 并行/串行输出模式(本设计采用串行 SPI 模式)
- CONVST A/B:启动 A 组/B 组转换(可独立或同时触发)
- BUSY:转换忙信号,高电平有效
- CS + SCLK + DoutA/DoutB:双数据流 SPI 接口
⚠️ 注意:AD7606 在串行模式下,DoutA 输出 CH0~CH3(4 通道 × 16 位 = 64 位),DoutB 输出 CH4~CH7(4 通道 × 16 位 = 64 位)。因此总共需要 128 个 SCLK 周期完成全部 8 通道读取。
顶层模块接口分析(ad7606_top.v)
module ad7606_top(
input clk_in1_p, // 差分时钟正端(如 100MHz)
input clk_in1_n, // 差分时钟负端
output pen_o, // 板载电源使能(常拉高)
input ad_busy_i, // AD7606 忙信号
output ad_cs_o, // 片选
output ad_sclk_o, // SPI 时钟
output ad_rst_o, // AD7606 复位(低有效)
output ad_convsta_o, // CONVST A
output ad_convstb_o, // CONVST B
output ad_range_o, // 量程选择(0: ±10V, 1: ±5V)
input ad_out_a_i, // DoutA
input ad_out_b_i // DoutB
);
该接口设计简洁规范,符合工业级 FPGA 工程命名习惯(_i 输入,_o 输出),且预留了调试信号(如 ILA 探针),体现专业素养。
时钟与复位系统 —— 稳定性的基石
差分时钟转单端 & PLL 使用
wire clk100M, locked;
clk_wiz_0 clk_7606_inst (
.clk_out1(clk100M),
.locked(locked),
.clk_in1_n(clk_in1_n),
.clk_in1_p(clk_in1_p)
);
- 使用 Xilinx Clocking Wizard IP 核将外部差分时钟(如 100MHz LVDS)转换为内部单端时钟。
locked信号用于生成异步复位同步释放(ARSR)的复位信号。
复位逻辑设计
assign ad_rst_i = !locked;
- 当 PLL 未锁定时,
ad_rst_i = 1,复位整个 AD7606 控制逻辑。 ad_rst_o输出到 AD7606 的 RESET 引脚(低有效),故在子模块中会取反。
🔧 调试建议:务必在上电初期确保 locked=1 后再启动采集,否则 SPI 时序可能紊乱。
核心控制逻辑 —— uispi7606 模块深度解析
虽然本文未给出 uispi7606.v 源码,但从实例化参数可推断其功能:
uispi7606 #(
.SPI_DIV(10'd5), // SCLK 分频系数 → 实际 SCLK = 100MHz / (2*(5+1)) ≈ 8.33MHz
.T5US_DIV(10'd999) // 5us 延时计数(用于 CONVST 脉宽或 CS 建立时间)
) uispi7606_inst (
.ad_clk_i(clk100M),
.ad_rst_i(!locked),
.ad_busy_i(ad_busy_i),
.ad_cs_o(ad_cs_o),
.ad_sclk_o(ad_sclk_o),
.ad_rst_o(ad_rst_o),
.ad_convsta_o(ad_convsta_o),
.ad_convstb_o(ad_convstb_o),
.ad_range_o(ad_range_o),
.ad_out_a_i(ad_out_a_i),
.ad_out_b_i(ad_out_b_i),
.ad_out_a(ad_out_a), // [63:0] 组合后的 CH0~CH3
.ad_out_b(ad_out_b), // [63:0] 组合后的 CH4~CH7
.ad_cap_en(ad_cap_en) // 采集使能标志(用于 ILA 触发)
);

