当前位置:首页 > 工业控制 > 工业控制
[导读]工业多通道同步采集(振动分析、电网监测、声源定位)要求所有AD通道在同一时刻锁存模拟值,通道间延迟差<1ns。16路AD如果用逐颗芯片独立CONVST,PCB走线长度差和芯片内部延迟差会累积到5–10ns,同步性崩溃。正确做法是单一时钟源+全局CONVST+FPGA内同拍捕获。下面以16路AD7606(16位、200kSPS、并行接口)挂到Xilinx Artix-7为主线。

工业多通道同步采集(振动分析、电网监测、声源定位)要求所有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,振动分析/电网监测场景直接能用。




本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭