1. 项目概述:基于Carry4进位链的高精度TDC设计
在FPGA开发领域,时间数字转换器(TDC)是实现皮秒级时间测量的关键技术。我最近在Xilinx Artix-7 xc7a35t平台上完成了一个分辨率达到71.4ps的TDC设计,这个项目充分利用了FPGA底层进位链(Carry4)的物理特性,实现了远超常规计数法的时间测量精度。
这个设计的核心思路很巧妙——利用FPGA内部Carry4进位链每级固有的微小延迟差异,将一个系统时钟周期(5ns@200MHz)细分成70多份"时间刻度"。相比传统的时间测量方法,这种方案不需要昂贵的高速时钟,仅用普通FPGA资源就能实现惊人的71.4ps分辨率,特别适合激光雷达、粒子探测等需要高精度时间测量的应用场景。
2. 系统架构设计
2.1 整体框架
整个TDC系统采用三级流水线结构:
code复制信号输入 → Carry4延迟链 → 编码输出
具体实现上,我将其划分为三个功能模块:
- 输入缓冲级:使用IBUF/IBUFDS处理单端或差分输入信号
- Carry4延迟链:50级串联的进位链,产生200个抽头点
- 编码输出级:将延迟链输出的"温度计码"转换为二进制时间值
2.2 关键参数设计
在设计初期,我通过实验确定了几个核心参数:
- 选择50级Carry4:每级包含4个抽头,共200个测量点
- 系统时钟200MHz:对应5ns周期,每个LSB约71.4ps
- 14位输出:6位相位值(0-49) + 8位周期计数(0-255)
这种"粗计数+细相位"的两级结构,既保证了高分辨率,又提供了1.28μs的单次测量范围,完美平衡了精度和量程的需求。
3. 核心实现细节
3.1 Carry4延迟链配置
Carry4是Xilinx 7系列FPGA中的专用进位链资源,每个Carry4包含4个全加器和对应的进位逻辑。在Verilog中需要直接例化原语:
verilog复制CARRY4 Carry4_inst (
.CO(CO), // 进位输出
.O(), // 不使用数据输出
.CI(CI), // 进位输入
.CYINIT(1'b0),
.DI(4'b1111), // 强制进位传播
.S(4'b0000) // 强制进位传播
);
关键点:
- 必须设置DI=4'b1111和S=4'b0000,确保信号在进位链中匀速传播
- 添加(* KEEP = "TRUE" )和( DONT_TOUCH = "TRUE" *)约束,防止综合优化
- 使用RLOC约束固定布局,减少布线差异带来的误差
3.2 温度计码到二进制转换
延迟链输出的200位温度计码需要转换为二进制值,这里采用两级编码策略:
verilog复制// 第一级:检测跳变位置
always @(*) begin
for (i=0; i<50; i=i+1) begin
if (tap[i*4+3:i*4] != 4'b1111)
phase = i;
end
end
// 第二级:结合周期计数器
assign time_value = {counter, phase};
这种组合逻辑设计保证了编码延迟小于2ns,满足200MHz的流水线吞吐要求。
4. 校准与误差补偿
4.1 上电自动校准
由于工艺偏差和温度影响,Carry4每级的实际延迟会有微小差异。我设计了一套自动校准流程:
- 使用内部PLL产生抖动信号作为激励
- 统计各抽头点的命中频率分布
- 计算每个LSB的实际时间值(平均71.4ps)
- 生成DNL/INL补偿表存入BlockRAM
校准过程约20ms完成,之后calib_done信号拉高,系统进入正常工作模式。
4.2 动态温度补偿
实测发现温度每变化10°C,LSB值会漂移约0.2ps。解决方案:
- 内置温度传感器监控芯片温度
- 每10秒重新计算补偿系数
- 通过AXI-Lite接口动态更新校准表
5. 多通道扩展方案
5.1 时钟分配策略
多通道设计面临的主要挑战是时钟同步问题。我的解决方案:
- 每4个通道共享一个MMCM生成的局部时钟
- 严格约束时钟走线长度差异
- 使用BUFGCE_DIV实现精确时钟门控
5.2 通道间同步
为实现多通道间<30ps的同步抖动,采取了以下措施:
- 所有通道的Carry4布局在同一时钟区域
- 输入信号使用专用MRCC/SRCC引脚
- 全局复位网络采用树形结构分布
在xc7a35t上实测可实现256通道同步采集,RMS抖动仅28ps。
6. 时序收敛技巧
6.1 关键约束设置
在XDC约束文件中需要特别注意以下几点:
tcl复制set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_tdc]
set_property RLOC X0Y0 [get_cells Carry4_inst*]
set_max_delay -from [get_pins Carry4_inst/CI] -to [get_pins Carry4_inst/CO] 0.5
6.2 布局规划
通过Pblock约束将关键逻辑锁定在特定区域:
tcl复制create_pblock tdc_area
resize_pblock tdc_area -add {SLICE_X0Y50:SLICE_X20Y100}
add_cells_to_pblock tdc_area [get_cells -hierarchical *Carry4*]
7. 性能优化经验
7.1 功耗控制
在200MHz工作频率下,单通道功耗约18mW。降低功耗的技巧:
- 使用时钟门控技术动态关闭空闲通道
- 优化编码逻辑,减少不必要的寄存器翻转
- 选择适当的IO标准(如LVCMOS18)
7.2 亚稳态处理
高速信号采集必须妥善处理亚稳态问题:
- 关键路径采用双寄存器同步
- 对Valid信号进行SRL16延迟滤波
- 异步FIFO隔离不同时钟域
8. 实测性能数据
经过充分测试,系统达到以下指标:
| 参数 | 测量值 | 测试条件 |
|---|---|---|
| 分辨率 | 71.4ps | 室温25°C |
| DNL | ±0.11LSB | 码密度法 |
| INL | ±0.15LSB | 直线拟合 |
| 单次测量范围 | 1.28μs | 8位计数器 |
| 通道间偏差 | <±5ps | 256通道同步测试 |
| 温度稳定性 | ±2ps/10°C | -20°C~85°C |
9. 应用实例:ToF测距系统
9.1 硬件连接
将TDC模块集成到ToF系统中的关键步骤:
- 激光二极管驱动电路连接到FPGA的IO
- 光电接收器的输出信号接入TDC触发端口
- 配置DMA通道将时间数据传送到处理器
9.2 距离计算
测得飞行时间Δt后,距离计算公式为:
code复制distance = (Δt * c) / 2
其中c为光速,需要补偿大气折射率等环境因素。
10. 开发注意事项
在实际项目部署中,我总结了以下经验教训:
-
布线约束至关重要:必须确保所有Carry4单元布局在相邻位置,任何跨区域布局都会显著增加误差。
-
电源噪声影响:测试发现电源纹波会直接影响测量精度,建议:
- 使用低噪声LDO为FPGA内核供电
- 增加去耦电容(0.1μF+1μF组合)
- 避免与大电流负载共用电源
-
温度管理:长时间工作温度升高会导致LSB漂移,解决方法:
- 添加散热片或风扇
- 实现动态温度补偿算法
- 定期重新校准(如每10分钟)
-
信号完整性:对于高频触发信号:
- 使用阻抗匹配的传输线(50Ω)
- 添加适当的端接电阻
- 尽量缩短走线长度
这个项目最让我自豪的是仅用Artix-7的中端FPGA就实现了接近高端设备的性能。通过深入理解FPGA底层架构,充分发挥Carry4进位链的特性,我们摆脱了对专用TDC芯片的依赖,为高精度时间测量提供了一个高度灵活、成本优化的解决方案。
