基于FPGA的工业数据采集:16路AD同步采样逻辑与时序收敛
工业多通道同步采集(振动分析、电网监测、声源定位)要求所有AD通道在同一时刻锁存模拟值,通道间延迟差<1ns。16路AD如果用逐颗芯片独立CONVST,PCB走线长度差和芯片内部延迟差会累积到5–10ns,同步性崩溃。正确做法是单一时钟源+全局CONVST+FPGA内同拍捕获。下面以16路AD7606(16位、200kSPS、并行接口)挂到Xilinx Artix-7为主线。
一、硬件同步:CONVST树形扇出
16颗AD7606的CONVST引脚必须同一时刻收到上升沿。PCB上用一颗低抖动时钟Buffer(如SI53302,输出skew<50ps)把FPGA来的CONVST信号扇出4路,每路驱动4颗AD7606,走线等长(误差<±2mm)。AD7606的BUSY引脚(转换结束标志)经或门后送FPGA,所有芯片转换完才启动读数据。
// CONVST产生逻辑:100kHz采样率,脉宽100ns
reg [9:0] cnt; always @(posedge clk_50m) cnt <= cnt + 1;
wire convst = (cnt == 10'd499) ? 1'b1 : 1'b0; // 100kHz
// 经过OBUF后送时钟Buffer
二、FPGA读时序:同拍捕获16路数据
AD7606并行数据总线(DB0-DB15)是所有芯片共享的,片选CS逐颗拉低读数据。同步采样的关键是:所有芯片在同一CONVST上升沿锁存模拟值,读数据时可以分时读,不影响同步性。
// 读状态机(简化)
localparam IDLE=0, WAIT_BUSY=1, READ_CH=2;
reg [3:0] state, chip_idx;
always @(posedge clk_50m) begin
case(state)
IDLE: if(convst_pos) begin state<=WAIT_BUSY; end
WAIT_BUSY: if(~busy_or) begin state<=READ_CH; chip_idx<=0; end
READ_CH: begin
cs_n[chip_idx] <= 0; // 拉低片选
rd_n <= 0; // 读使能
// 在rd_n上升沿锁存数据
data_buf[chip_idx*16+:16] <= dbus;
rd_n <= 1;
if(chip_idx==15) state<=IDLE;
else chip_idx<=chip_idx+1;
end
endcase
end
⚠ 读时序必须满足AD7606的t2(CS低到RD低)和t3(RD低到数据有效)——50MHz时钟下,一个周期20ns,读16颗芯片共320ns,远小于采样周期10μs,完全来得及。
三、时序收敛:多周期路径约束
16路AD的数据总线是多周期路径——dbus在rd_n拉低后一段时间才有效,不是每个时钟沿都变化。不加约束的话Vivado会按单周期路径分析,报hold violation。正确做法是设多周期和false path:
# 读数据路径:从rd_n输出到dbus输入,延迟2个时钟周期
set_multicycle_path -setup -from [get_ports rd_n] -to [get_ports dbus[*]] 2
set_multicycle_path -hold -from [get_ports rd_n] -to [get_ports dbus[*]] 1
# CONVST路径:到AD7606的延迟不重要,但抖动要小
set_max_delay -from [get_ports convst] -to [get_pins -hierarchical "*CONVST*"] 5
# BUSY路径:异步信号,false path
set_false_path -from [get_ports busy_or] -to [all_registers]
另外,16路数据总线dbus[15:0]是双向IO,Vivado里要设IO标准(LVCMOS33)和驱动强度:
set_property IOSTANDARD LVCMOS33 [get_ports dbus[*]]
set_property DRIVE 8 [get_ports dbus[*]]
四、验证:示波器看CONVST和BUSY
板子回来先看四样:
1. CONVST抖动:示波器测FPGA输出脚,上升沿抖动<200ps(50MHz时钟下)
2. BUSY或门输出:16颗AD转换完的时间差应<2ns(通过BUSY或门的脉宽看)
3. 读数据正确性:给所有AD输入同一电压(如2.5V),读回的16路数值差<3LSB
4. 时序余量:Vivado的report_timing_summary看读数据路径的setup/hold slack,应>0.1ns
五、三个翻车高发点
• CONVST扇出不够:一颗时钟Buffer驱动16颗AD,上升沿变缓,芯片间CONVST到达时间差>5ns。必须用Buffer扇出4路,每路等长
• dbus双向IO没设三态:读某颗芯片时其他芯片的CS是高,但dbus仍然是输出状态,总线冲突。每颗AD的CS拉高后dbus自动高阻,FPGA侧也要在cs_n=1时把dbus设为输入
• BUSY或门逻辑错误:16路BUSY经或门后送FPGA,如果某颗芯片BUSY一直高(坏了),整个采集卡死。加看门狗:BUSY高超过20μs就复位该芯片的CONVST
________________________________________
16路AD同步采样的真谛:CONVST时钟Buffer扇出等长、读状态机同拍锁存、Vivado里设多周期路径约束、BUSY或门加看门狗。这套走完16路200kSPS同步采样,通道间延迟<1ns,时序收敛slack>0.1ns,振动分析/电网监测场景直接能用。





