基于FPGA进位链的TDC高精度延时链设计与实现

张开发
2026/4/18 23:26:59 15 分钟阅读

分享文章

基于FPGA进位链的TDC高精度延时链设计与实现
1. FPGA进位链与TDC基础原理时间数字转换器TDC是测量两个事件之间时间间隔的关键器件在激光测距、高能物理实验等领域有广泛应用。传统ASIC方案成本高、周期长而FPGA凭借其可编程特性成为理想替代方案。这里我们要重点利用的是FPGA底层硬件资源——进位链Carry Chain。你可能不知道FPGA的进位链原本是为算术运算设计的硬件加速通道。每个SLICE中的CARRY4元件包含4级进位逻辑其物理布线长度固定因此具有高度可预测的传输延迟。实测在Xilinx 7系列器件上每级CARRY4延迟约53ps后仿数据这为我们构建高精度延时链提供了物理基础。具体实现时通过将前级CARRY4的COUT连接下级CARRY4的CIN形成级联链。当信号从链首注入时会在每个进位节点产生固定延迟。通过触发器阵列采样链上各节点的状态就能获得信号传播的快照。例如使用200级CARRY4链时理论时间分辨率可达理论分辨率 53ps × (4级/单元) ≈ 13.25ps/级 实际需要考虑时钟抖动、布线偏差等因素2. 延时链硬件设计实战2.1 核心模块代码解析让我们拆解line_tdc模块的关键实现。首先看CARRY4的级联方式generate for (i 0; i STAGE/4 - 1; i i1) begin if(i 0) begin :carry4_first CARRY4 CARRY4_INST ( .CO(dat_reg0[3:0]), // 首级输出 .CI(1b0), // 首级输入接地 .CYINIT(sg_start) // 信号注入点 ); end else begin :carry4_others CARRY4 CARRY4_OTHERS ( .CO(dat_reg0[4*(i1)-1:4*i]), .CI(dat_reg0[4*i-1]) // 连接前级输出 ); end end endgenerate这里有几个设计要点首级CARRY4使用CYINIT端口作为信号输入端后续各级通过CI端口级联形成单向传播链每级CARRY4的COUT输出4位状态信号2.2 采样时序设计信号通过延时链后需要用同步时钟采样。设计中采用双寄存器结构消除亚稳态for (j 0; j STAGE - 1; j j1) begin FDRE FDRE_INST0 ( // 第一级采样 .Q(dat_reg1[j]), .C(clk_bufg), .D(dat_reg0[j]) ); FDRE FDRE_INST1 ( // 第二级采样 .Q(value_latch[j]), .D(dat_reg1[j]) ); end这种设计能有效应对信号在延时链中的传播与时钟域的跨域问题。实测表明当系统时钟为400MHz周期2.5ns时至少需要50级CARRY4才能覆盖一个时钟周期。3. 物理布局约束技巧3.1 关键位置锁定为了保证延时链的线性度需要通过约束文件固定首级CARRY4的位置set_property LOC SLICE_X0Y0 [get_cells line_tdc_inst/genblk1[0].carry4_first.CARRY4_INST]Xilinx布局器有个特性当首级位置固定后后续CARRY4会自动就近布局。这能确保进位链保持直线型走线减少布线延迟差异提高各单元延迟的一致性3.2 时钟网络优化时钟偏差会直接影响测量精度因此需要使用MMCM生成400MHz系统时钟通过BUFG驱动全局时钟网络对采样时钟施加额外约束set_clock_groups -name async_clks -asynchronous \ -group [get_clocks clk_sys] \ -group [get_clocks {sg_start}]4. 标定与误差补偿4.1 延迟标定方法虽然理论单级延迟53ps但实际需要标定注入已知时间间隔的测试脉冲记录采样点跳变位置通过最小二乘法拟合实际延迟值实测数据显示在XC7K325T芯片上平均单级延迟52.8ps标准差±1.2ps非线性误差0.5%4.2 温度补偿策略FPGA延迟会随温度变化建议在片内放置温度传感器建立延迟-温度查找表实时调整计算系数例如采用XADC模块监测结温xadc_temp #(.CLK_FREQ(100_000_000)) xadc_inst( .temp_out(temp_value), .clk(clk_sys) );5. 数据转换与输出5.1 二进制编码转换延时链输出的thermometer码需要转换为二进制这里采用树形搜索算法always(*) begin decoding[0] value_latch[(2**GAP_BITS)-2:0]; for (i 0; i GAP_BITS-5; i i1) begin if(decoding[i][mid_point]) decoding[i1] decoding[i][upper_half]; else decoding[i1] decoding[i][lower_half]; end end这种结构能在log2(N)时间内完成转换兼顾速度和资源消耗。5.2 输出同步处理最终输出需要与系统时钟同步always(posedge clk_bufg) begin if(data_valid) begin bin_cs 1b1; bin bin_final; end else begin bin_cs 1b0; end end其中bin_cs作为数据有效标志便于上位机采集。6. 系统级验证方案6.1 测试平台搭建使用Verilog Testbench注入可控延迟信号initial begin sg_start 0; #116; // 2.9ns延迟 sg_start 1; #3; // 75ps脉宽 sg_start 0; end通过调整#延迟值可以验证系统的时间分辨率。6.2 后仿真要点前仿结果仅供参考必须进行后仿生成SDF时序标注文件在Vivado中设置set_property -name {xsim.simulate.runtime} -value {10us} -objects [get_filesets sim_1]特别注意时钟-数据关系时钟周期2.5ns → 应能分辨50ps的间隔7. 实际应用中的经验在多个项目实践中发现电源噪声会显著影响测量精度。建议为TDC模块单独供电在电源引脚添加10uF0.1uF去耦电容使用LDO而非开关电源另一个常见问题是信号反射解决方法包括控制进位链长度建议256级在末端添加匹配负载使用IBUFDS处理差分信号

更多文章