1. 五种主流TDC架构的工程选型逻辑
时间数字转换器(TDC)在FPGA里的实现方案,说白了就是在“精度、资源、线性度、死区时间”这四个维度上做取舍。我从2016年开始接触基于FPGA的TDC设计,最早做的是激光测距项目,后来陆续做过PET医学成像、飞行时间质谱、量子密钥分发里的时间 tagging,前后流片和量产过七八个版本。踩过的坑多了以后,再回头看“TDL、差分延迟线、脉冲收缩、游标延迟线、多相时钟”这五种主流架构,选型思路就清晰很多了。
先给一个总览判断:如果你要的是亚纳秒级精度且资源充裕,Tap Delay Line(TDL)是首选;如果追求更高线性度和对温漂的鲁棒性,差分延迟线值得多花一倍资源;如果系统时钟本身就很高(比如500MHz以上),脉冲收缩架构能用极少的延迟单元换来不错的bin size;游标延迟线适合对精度要求极高但测量范围不大的场景;多相时钟方案则更适合与高速串行收发器共存的系统。
这五种架构没有绝对的优劣,只有匹配不匹配。下面我按“原理拆解—关键参数—适用场景—实操注意”的顺序,把每种方案讲透。
1.1 为什么FPGA里做TDC不能照搬ASIC思路
ASIC里做TDC,延迟单元可以做到几皮秒,而且PVT(工艺、电压、温度)一致性极好。FPGA里不行,因为通用布线资源和可编程逻辑单元的延迟离散性很大。同一个carry chain里相邻tap的延迟可能差20%以上,不同芯片之间差更多。所以FPGA TDC的核心矛盾是:你要用校准和架构设计去补偿工艺离散性,而不是指望综合工具给你一条均匀的延迟线。
我早期犯过一个典型错误:直接例化一串LUT作为延迟单元,结果INL(积分非线性)差到±3LSB以上,后来换成CARRY4原语才把INL压到±0.5LSB以内。这个教训说明,在FPGA里做TDC,必须用专用进位链资源,不能用普通逻辑资源凑合。
2. TDL架构:最成熟也最容易被低估的方案
Tap Delay Line(抽头延迟线)是FPGA TDC里最经典的架构。它的原理很直白:信号经过一串延迟单元,每个抽头接一个触发器,用系统时钟同步采样,看信号在延迟线里“走到”了哪个位置,从而判断到达时间。
2.1 核心结构与延迟单元选型
在Xilinx 7系列及以后的FPGA里,CARRY4的COUT到CIN延迟大约在10~20ps(具体取决于器件速度和温度)。一个CARRY4有4个抽头,所以一条32级延迟线大约用8个CARRY4,能覆盖约320~640ps的测量范围。如果系统时钟是200MHz(周期5ns),这个范围远小于一个时钟周期,所以需要配合粗计数(coarse counter)来扩展量程。
粗计数用系统时钟计数,细计数用延迟线插值,两者结合得到完整时间戳。这里有个关键细节:粗计数和细计数的对齐必须用“温度计码转二进制”后的同步逻辑处理,否则会在时钟边界产生±1LSB的跳变误差。我通常会在细计数输出后加一级格雷码转换,再用双触发器同步到系统时钟域,这样能把边界误差压到最低。
2.2 关键性能指标与实测数据
以Xilinx Kintex-7 XC7K325T为例,我在-2速度等级下实测:
| 参数 | 典型值 | 备注 |
|---|---|---|
| 单tap延迟 | 14~18ps | 随温度漂移约±15% |
| 32级量程 | 450~580ps | 需校准 |
| DNL | ±0.4 LSB | 用码密度测试 |
| INL | ±0.8 LSB | 校准后 |
| 单通道资源 | 8 CARRY4 + 32 FF | 不含粗计数 |
| 死区时间 | <10ns | 取决于复位逻辑 |
这个数据在业内属于中等偏上水平。如果要做多通道(比如16通道),资源消耗会线性增长,但CARRY4在FPGA里数量充足,一般不会成为瓶颈。
2.3 适用场景与实操避坑
TDL最适合多通道、中等精度(50~100ps RMS)、量程在微秒级的应用,比如激光雷达的多回波检测、超声阵列的时间差测量。它的优势是结构规整、容易做多通道复制、校准算法成熟。
但有几个坑必须注意:
- 温度漂移:CARRY4延迟随温度变化明显,我见过从25°C到85°C漂移超过20%的情况。必须做在线校准,通常用“码密度法”配合已知频率的参考时钟。
- 电源噪声:延迟线对电源纹波敏感,建议给CARRY4所在的bank单独加LC滤波,实测能改善INL约30%。
- 布局约束:延迟线必须手动布局,让CARRY4级联在同一列,否则布线延迟会引入额外的不确定性。我通常用
set_property LOC把CARRY4锁在相邻位置。
3. 差分延迟线:用面积换线性度的进阶方案
差分延迟线(Differential Delay Line)的核心思想是:用两条延迟线,一条快、一条慢,信号同时进入两条线,通过比较两条线的输出相位差来插值。这样做的目的是抵消共模延迟漂移,因为温度和电压变化对两条线的影响是同向的,差分后相互抵消。
3.1 差分对构建与延迟差控制
在FPGA里实现差分延迟线,通常用两种延迟单元:一种是CARRY4(快),一种是LUT(慢)。让信号分别经过这两种单元,输出接到同一个触发器的D和E端(或用两个触发器做相位比较)。延迟差Δτ决定了bin size,而共模延迟τ_common被差分结构抵消。
我做过一个对比实验:同样32级延迟,单端TDL的INL是±0.9LSB,差分结构能压到±0.3LSB。代价是资源翻倍,而且需要更复杂的校准逻辑来跟踪Δτ的变化。
3.2 性能对比与资源开销
| 指标 | 单端TDL | 差分延迟线 |
|---|---|---|
| INL | ±0.8~1.2 LSB | ±0.2~0.4 LSB |
| 温度漂移 | 15~20% | 3~5% |
| 资源 | 1x | 2.2~2.5x |
| 校准复杂度 | 中 | 高 |
| 适合场景 | 多通道、中等精度 | 高线性度、单通道 |
差分方案适合医学成像(PET、SPECT)和质谱这类对线性度要求极高的场景。这些应用里,INL直接决定图像重建质量或质量分辨率,多花一倍资源是值得的。
3.3 实操中的校准与布局要点
差分延迟线最大的难点是Δτ的稳定性。我通常用DLL(延迟锁相环)或参考时钟来实时校准Δτ。具体做法是:用一个已知频率的时钟输入延迟线,统计一段时间内的码分布,反推出Δτ。这个过程每100ms做一次,能跟踪温度变化。
布局上,两条延迟线必须对称放置,最好在同一时钟区域、同一电源域。我试过把两条线放在不同bank,结果电源噪声导致Δτ抖动增加了一倍。后来改成同一bank内对称布局,抖动明显改善。
4. 脉冲收缩架构:高频时钟下的极简选择
脉冲收缩(Pulse Shrinking)架构的思路很巧妙:用一个高频时钟去“收缩”输入脉冲,每经过一个时钟周期,脉冲宽度减少一个固定量,直到脉冲消失。消失所需的周期数就代表了输入脉冲宽度,也就是时间间隔。
4.1 工作原理与时钟频率选择
假设输入脉冲宽度为T_in,每个时钟周期收缩ΔT,那么经过N个周期后脉冲消失,有T_in = N × ΔT。ΔT由收缩电路决定,通常用一个延迟单元加一个与门实现。在FPGA里,ΔT可以做到20~50ps,取决于时钟频率和逻辑延迟。
这个架构的最大优势是资源极少:一个收缩电路加一个计数器就够了,不需要长延迟线。但它的精度直接受ΔT的抖动影响,而ΔT又受时钟抖动和逻辑延迟抖动影响。所以时钟质量是关键,建议用MMCM输出的低抖动时钟,或者直接用高速收发器的恢复时钟。
4.2 精度瓶颈与改进方法
脉冲收缩的精度瓶颈在于ΔT的一致性。我实测过,用普通MMCM时钟,ΔT的周期抖动约5~8ps RMS,对应到测量精度就是约10ps RMS。如果换成Si5340这类外部低抖动时钟芯片,能压到3ps RMS以内。
改进方法有两个:一是用差分收缩电路,抵消共模抖动;二是用多个收缩电路并行,做平均。我试过4路并行收缩,精度提升约1.8倍,资源增加4倍,性价比一般。
4.3 适用场景与限制
脉冲收缩适合系统时钟已经很高(>500MHz)、测量范围不大(<10ns)、对资源极度敏感的场景。比如高速串行链路里的相位检测、时钟数据恢复辅助电路。但它不适合多通道,因为每个通道都需要独立的收缩电路和计数器,资源并不省。
注意:脉冲收缩架构对输入脉冲的最小宽度有要求,通常不能小于2个时钟周期,否则收缩电路来不及响应。设计时务必确认输入信号的脉宽范围。
5. 游标延迟线与多相时钟:高精度与高集成的两条路
游标延迟线(Vernier Delay Line)用两条延迟略有差异的线,一条快线、一条慢线,信号在两条线里“追赶”,通过检测追上时的位置来插值。它的精度可以做到单ps级,但测量范围受限于两条线的延迟差和级数。
5.1 游标架构的精度极限与实现代价
在FPGA里,游标延迟线的两条线通常用CARRY4和LUT混合实现,延迟差可以做到5~10ps。32级游标线能覆盖160~320ps范围,精度约1~2ps RMS。这个精度已经接近FPGA的物理极限。
代价是:资源消耗大、校准复杂、对布局要求极高。两条线必须严格对称,任何布线不对称都会引入固定偏差。我通常用set_property BEL把延迟单元锁在相邻的CARRY4和LUT上,再用set_property PROHIBIT禁止工具自动优化。
5.2 多相时钟方案的集成优势
多相时钟(Multi-phase Clock)方案利用MMCM或PLL输出的多个相位时钟(通常8~16相),每个相位对应一个时间bin。比如500MHz时钟的8个相位,bin size约250ps,精度约50ps RMS。这个方案的最大优势是与高速串行收发器天然兼容,因为收发器本身就有时钟恢复和相位对齐电路。
我做过一个基于GTX收发器的TDC,直接用收发器的恢复时钟做多相采样,精度约30ps RMS,资源消耗几乎为零(复用收发器资源)。适合高速串行通信里的时间同步、抖动测量。
5.3 五种架构的横向对比与选型建议
| 架构 | 精度(RMS) | 量程 | 资源 | 线性度 | 最佳场景 |
|---|---|---|---|---|---|
| TDL | 50~100ps | 微秒级 | 中 | 中 | 多通道激光雷达 |
| 差分延迟线 | 20~50ps | 微秒级 | 高 | 高 | PET/质谱 |
| 脉冲收缩 | 10~30ps | 纳秒级 | 低 | 中 | 高速链路相位检测 |
| 游标延迟线 | 1~5ps | 百皮秒级 | 很高 | 高 | 量子光学 |
| 多相时钟 | 30~80ps | 纳秒级 | 低 | 中 | 串行通信同步 |
选型时先问三个问题:精度要求多少?量程多大?通道数多少?精度<10ps且量程<1ns,选游标;精度<50ps且通道多,选TDL或差分;量程>1μs,必须加粗计数;通道数>8,优先TDL。
6. 常见问题与排查技巧实录
6.1 码密度测试中的典型异常
码密度测试是TDC校准的核心手段。我遇到过几种典型异常:
- 某些bin计数为零:通常是延迟线某级被综合工具优化掉了,或者布局时CARRY4没有正确级联。检查综合报告里的CARRY4数量,用
report_utilization确认。 - DNL突然跳变:一般是电源噪声或时钟抖动导致。用示波器测电源纹波,如果>20mVpp,加LC滤波。
- INL呈周期性波动:通常是粗计数和细计数对齐有问题,检查同步逻辑的格雷码转换。
6.2 温度漂移的在线补偿
温度漂移是FPGA TDC的固有难题。我的做法是:在FPGA里放一个环形振荡器(RO),用RO频率反推温度,再根据温度查表补偿延迟线。RO用5个LUT加一个与门构成,资源几乎为零。实测补偿后,-40°C到85°C范围内的精度变化从±30%压到±5%以内。
6.3 多通道串扰的抑制
多通道TDC里,相邻通道的串扰会导致精度下降。我试过三种方法:一是通道间加隔离逻辑(用set_property ISOLATE);二是错开采样时钟相位;三是物理上拉开延迟线距离。综合下来,错开时钟相位效果最好,能降低串扰约60%。
提示:多通道设计时,建议每个通道的延迟线放在独立的时钟区域,避免共享CARRY4列。虽然资源消耗增加,但精度和一致性会好很多。
7. 从项目实战看架构演进的真实体会
我最早做的TDC项目是2016年的激光测距,用的是最朴素的TDL,精度约200ps RMS,勉强够用。后来做PET成像,精度要求提到50ps RMS,TDL的INL不够,换成了差分延迟线。再后来做量子光学的时间tagging,精度要求5ps RMS,只能上双游标延迟线,资源消耗是TDL的6倍,但精度确实做到了3ps RMS。
这几年我越来越倾向于混合架构:用TDL做粗计数,用游标延迟线做细插值,两者结合兼顾量程和精度。比如一个16通道系统,粗计数用200MHz时钟,细插值用8级游标线,精度能做到8ps RMS,资源比纯游标方案省40%。
最后分享一个实操小技巧:在延迟线输出后加一级“多数表决”逻辑,用3个触发器采样同一个抽头,取多数值。这样能抑制单粒子翻转和亚稳态,实测能把误码率降低一个数量级。代价是资源增加3倍,但对可靠性要求高的场景非常值得。
这个方向后续还可以往“自适应架构”走:用FPGA里的可编程延迟单元(如IDELAYE2)动态调整延迟线,根据实时校准结果自动切换架构模式。我目前在做的一个原型已经能在TDL和差分模式之间切换,精度和资源能根据任务需求动态平衡。