拓冰建站拓冰建站
首页 / 资讯中心 / 正文

FPGA TDC五种方案实测对比:从抽头延迟线到游标延迟线的选型指南

1. 从一次激光测距项目说起为什么TDC方案选型这么难去年接手一个激光测距项目指标要求单次测量分辨率优于50ps量程覆盖10米到3公里重复频率还要做到10kHz以上。当时团队里有人提议直接用专用TDC芯片有人坚持在FPGA里做还有人觉得用高速ADC采样加数字信号处理就够了。三种路线吵了一周最后我们决定先在FPGA里把几种主流TDC架构都搭一遍用实测数据说话。这一搭就是两个多月。抽丝剥茧之后我发现FPGA TDC这件事难的不是能不能做出来而是在分辨率、线性度、资源占用、死区时间、温漂稳定性这几个互相拉扯的指标里找到匹配你应用场景的那个平衡点。抽头延迟线、差分延迟线、脉冲收缩、游标延迟线、多相时钟采样这五种方案各有各的脾气用错了地方要么精度上不去要么资源爆掉要么温度一变数据就飘。这篇内容就是那两个月折腾的完整总结。我会把五种主流FPGA TDC架构的原理、实测性能、资源开销、适用场景逐一拆开讲重点说清楚每个方案为什么这样设计什么情况下该选它实际落地时会踩哪些坑。如果你正在做激光雷达、飞行时间测量、PET医学成像、粒子物理实验或者高精度时间间隔测量相关的项目这篇应该能帮你少走不少弯路。提示本文所有性能数据来自Xilinx Artix-7和Kintex-7平台的实际测试不同工艺节点和不同厂商的FPGA会有差异但架构层面的规律是通用的。2. 抽头延迟线TDL最经典的入门方案也是最容易踩坑的方案2.1 TDL的核心原理让信号在延迟链里赛跑抽头延迟线Tapped Delay LineTDL的思路非常朴素把一串缓冲器或者反相器首尾相连信号从头部输入经过每一级都会产生一个固定的传播延迟在每一级的输出端引出一个抽头。当待测的Start信号进入延迟线后用Stop信号去锁存所有抽头的状态就能知道Start信号在延迟线里跑了多远从而换算出时间间隔。举个具体的例子。假设一级缓冲器的传播延迟是50ps我串了64级那么整条延迟线的总延迟就是3.2ns。如果Stop信号到来时Start信号刚好跑过了第32级那时间间隔就是32×50ps1.6ns。这就是TDL最原始的时间放大逻辑——把皮秒级的时间测量转换成对延迟链位置的判断。在FPGA里实现TDL通常用查找表LUT或者专用进位链CARRY4/CARRY8来构建延迟单元。LUT的延迟大约在几十皮秒量级进位链的延迟更小在28nm工艺下CARRY4的单级延迟可以做到10-20ps。用进位链做延迟线的好处是延迟单元一致性好、布局相对规整缺点是延迟线的长度和抽头位置受限于进位链的物理结构。2.2 实测性能分辨率、线性度与温漂的真实表现在Artix-7 XC7A100T上我用CARRY4构建了一条128级的TDL实测数据如下指标实测值说明单级延迟约18ps常温25℃典型工艺角理论分辨率18ps理想情况下实际分辨率RMS约25-35ps受时钟抖动和抽头不均匀影响微分非线性DNL±0.8 LSB未经校准积分非线性INL±3.5 LSB未经校准温漂约0.3%/℃从0℃到70℃范围内资源占用128个CARRY4 128个FF约2%的Slice资源这里有几个数据值得展开说。首先是实际分辨率和理论分辨率的差距。理论上单级延迟18ps分辨率就应该是18ps但实测RMS到了25-35ps。原因有两个一是FPGA内部时钟网络的抖动jitter会直接叠加到测量结果上二是进位链各级的延迟并不均匀有的级快有的级慢导致码密度不均匀。其次是温漂。FPGA的延迟单元对温度非常敏感从0℃到70℃单级延迟的变化可以到20%以上。这意味着如果不做温度校准冬天和夏天测出来的数据能差出好几厘米在激光测距场景下。我当时的做法是在板子上放一颗温度传感器每隔一段时间用已知的参考时钟做一次在线校准把校准系数存到查找表里。2.3 TDL的适用场景与不适用场景TDL最适合的场景是分辨率要求不高100ps-1ns量级、资源极度受限、开发周期短的项目。比如一些工业级的超声波测距、简单的脉冲宽度测量用TDL就够了几十行代码就能跑起来。但TDL有几个硬伤。第一是分辨率天花板明显在主流FPGA上很难做到优于20ps的稳定分辨率。第二是死区时间dead time问题一次测量完成后需要等延迟线清空才能进行下一次测量这限制了高重复频率的应用。第三是温漂严重不做校准的话长期稳定性很差。注意很多人以为TDL的分辨率就是单级延迟实际上由于码密度不均匀有效分辨率往往比单级延迟差。建议在选型时把理论值乘以1.5-2倍作为实际预期。3. 差分延迟线用两条链的差值换更高的分辨率3.1 差分TDL的设计巧思慢链与快链的相位差差分延迟线Differential Delay Line的核心思路是用两条传播速度不同的延迟链让同一个信号在两条链里跑通过比较两条链的输出状态来获得比单级延迟更细的时间分辨率。具体来说假设链A的单级延迟是50ps链B的单级延迟是45ps那么每经过一级两条链的累积延迟差就是5ps。当信号同时在两条链里传播时用Stop信号锁存两条链的状态找到两条链输出翻转的位置差就能把分辨率细化到5ps。这本质上是一种游标卡尺的思路——用两个不同刻度的尺子去测量同一个长度通过差值提高精度。在FPGA里实现差分TDL通常用两种不同的延迟单元来构建两条链。比如一条用LUT构建另一条用CARRY4构建或者两条链用不同数量的缓冲器级联。关键是要保证两条链的延迟差稳定且可控。3.2 实测数据分辨率提升的代价是什么在同样的Artix-7平台上我用LUT链单级约45ps和CARRY4链单级约18ps构建了一条差分TDL实测结果指标实测值对比TDL等效分辨率约8-12ps提升约2-3倍实际分辨率RMS约15-20ps提升约1.5倍DNL±1.2 LSB变差INL±5.8 LSB变差资源占用256个CARRY4 256个FF翻倍校准复杂度高需要双链联合校准分辨率确实上去了但代价也很明显。首先是资源翻倍两条链的抽头都要锁存触发器和进位链的用量都是单链的两倍。其次是线性度变差因为两条链的延迟差本身就不够均匀DNL和INL都比单链TDL差。第三是校准复杂度大幅上升需要同时校准两条链的延迟特性还要考虑两条链之间的温度漂移差异。3.3 差分TDL的工程落地要点差分TDL在实际项目里落地有几个关键点需要注意。第一是两条链的布局要尽量对称。在FPGA里延迟单元的物理位置会直接影响传播延迟如果两条链一个在芯片左上角一个在右下角温漂和工艺偏差会导致延迟差剧烈变化。建议用相对约束RLOC把两条链约束在相邻的区域。第二是校准策略要分两层。第一层是粗校准用已知频率的参考时钟测量两条链的延迟差建立查找表。第二层是细校准在每次测量前用一小段已知时间间隔做在线校准补偿温度变化带来的漂移。第三是码密度均衡。差分TDL的码密度比单链更不均匀建议在FPGA综合后做一次码密度测试把每个码对应的实际时间间隔测出来存到校准表里测量时用查表法修正。提示差分TDL的分辨率提升不是线性的。当两条链的延迟差小到一定程度比如小于5ps由于FPGA内部布线延迟的随机性延迟差本身就不稳定了再细化也没有意义。4. 脉冲收缩法用窄脉冲换高精度的另一种思路4.1 脉冲收缩的工作原理让脉冲在环路里瘦身脉冲收缩法Pulse Shrinking的思路和前面两种完全不同。它不是去测量信号在延迟链里跑了多远而是让一个脉冲在闭环回路里不断循环每循环一次脉冲宽度就收缩一点通过计数循环次数来反推初始脉冲宽度。具体实现是这样的用一个与门或者或门构建一个环路脉冲每绕一圈由于门延迟的不对称性脉冲宽度会减少一个固定的量比如10ps。假设初始脉冲宽度是10ns每圈收缩10ps那么循环1000圈后脉冲就消失了。通过计数循环次数就能算出初始脉冲宽度10ns 1000 × 10ps。这个方法的精妙之处在于它把对绝对延迟的测量转换成了对循环次数的计数。循环次数可以做得很大等效分辨率就是每圈收缩的量10ps而且这个量可以通过设计环路结构来精确控制。4.2 在FPGA里实现脉冲收缩的难点脉冲收缩法在FPGA里实现最大的难点是脉冲宽度精确可控地收缩。FPGA内部的逻辑门延迟受工艺、电压、温度PVT影响很大每圈收缩的量并不稳定。我实测下来在Artix-7上一个精心设计的收缩环每圈收缩量在8-15ps之间波动温漂导致的波动可以到±30%。另一个难点是脉冲消失检测。当脉冲收缩到接近零宽度时如何准确判断它已经消失用触发器采样的话由于亚稳态问题可能会误判。我当时的做法是用一个高速比较器或者施密特触发器来做脉冲检测但这样又引入了额外的延迟和不确定性。还有一个实际问题是死区时间。脉冲收缩法完成一次测量需要循环很多圈比如1000圈每圈假设2ns那就是2μs。这意味着最大测量频率只有500kHz对于高重复频率的应用比如激光雷达的10kHz以上是够用的但对于一些需要MHz级重复频率的场景就不够了。4.3 脉冲收缩法的性能边界与适用场景实测数据如下指标实测值等效分辨率约8-15ps实际分辨率RMS约20-30ps测量范围取决于计数器位宽可到μs级最大测量频率约200-500kHz资源占用较少主要是计数器和控制逻辑温漂严重需要频繁校准脉冲收缩法的优势是资源占用少、测量范围大通过增加计数器位宽可以轻松扩展到微秒甚至毫秒级。缺点是分辨率受限于收缩量的稳定性温漂严重而且死区时间较长。这个方法最适合的场景是测量范围大、重复频率要求不高、对资源极度敏感的应用。比如一些物理实验中的长时间间隔测量或者低成本的时间数字转换模块。5. 游标延迟线与多相时钟两种高阶方案的取舍5.1 游标延迟线差分TDL的升级版游标延迟线Vernier Delay Line可以看作是差分TDL的升级版。它用两条延迟链但两条链的延迟差做得更小比如1-2ps通过游标的方式逐级比较获得极高的分辨率。原理是这样的Start信号进入慢链单级延迟50psStop信号进入快链单级延迟48ps。每经过一级Stop信号就比Start信号快2ps。当Stop信号追上Start信号时对应的级数乘以2ps就是时间间隔。这就像用游标卡尺测量时主尺和副尺的刻度差越小测量精度越高。在FPGA里实现游标延迟线难点在于两条链的延迟差要做得非常小且稳定。在28nm工艺下CARRY4的单级延迟约18ps要把两条链的延迟差做到1-2ps需要非常精细的布局约束和大量的校准工作。我实测下来在Artix-7上游标延迟线的等效分辨率可以做到3-5ps但实际RMS分辨率在10-15ps左右而且校准极其复杂。5.2 多相时钟采样用相位代替延迟多相时钟采样Multi-Phase Clock Sampling的思路是用多个相位不同的时钟去采样同一个信号通过判断哪个时钟沿先采到信号来测量时间间隔。比如用MMCM或者PLL生成8个相位差45度的时钟等效分辨率就是时钟周期的1/8。假设时钟频率是500MHz周期2ns8个相位的话等效分辨率就是250ps。这个分辨率不算高但优点是全数字实现、资源占用少、温漂影响小因为时钟相位由PLL锁定相对稳定。如果要提高分辨率可以用更高频率的时钟或者更多的相位但FPGA里PLL的输出相位数量有限通常最多8-16个。多相时钟采样最适合的场景是分辨率要求不高几百ps、但稳定性和可靠性要求高的应用。比如一些工业控制中的时间测量或者作为其他TDC方案的粗测量部分。5.3 五种方案的横向对比与选型建议把五种方案放在一起对比方案等效分辨率实际RMS资源占用温漂死区时间校准复杂度适用场景TDL18-25ps25-35ps低严重中低入门级、资源受限差分TDL8-12ps15-20ps中较严重中中中等精度、中等资源脉冲收缩8-15ps20-30ps低严重长中大范围、低频率游标延迟线3-5ps10-15ps高严重中高高精度、资源充足多相时钟100-250ps150-300ps低小短低低精度、高稳定选型的核心逻辑是先看分辨率要求再看资源预算最后看稳定性和校准成本。如果分辨率要求优于20ps基本只能在差分TDL、脉冲收缩和游标延迟线里选如果资源极度受限TDL和多相时钟是首选如果对温漂敏感又不想做复杂校准多相时钟是最稳的。6. 实测中的意外与校准那些文档里不会写的事6.1 码密度不均匀TDL最隐蔽的坑TDL和差分TDL都有一个隐蔽的问题码密度不均匀。理论上每个抽头对应的时间间隔应该相等但实际上由于FPGA内部布线延迟的随机性有的抽头间隔大有的间隔小。我实测过一条128级的TDL码密度分布从12ps到28ps不等标准差约4ps。这个问题不解决测量结果的线性度会很差。解决办法是做码密度校准用一个已知频率的时钟比如100MHz去触发大量测量统计每个码出现的次数出现次数多的码对应的时间间隔小出现次数少的对应的时间间隔大。根据统计结果建立校准表测量时用查表法修正。6.2 温度漂移必须在线校准FPGA的延迟单元对温度极其敏感。我做过一个实验把板子放在温箱里从0℃升到70℃每10℃测一次单级延迟。结果从0℃的22ps降到了70℃的16ps变化了27%。如果不做温度校准在激光测距场景下70℃时的测距误差可以到几十厘米。在线校准的做法是在FPGA里留一个校准通道用已知频率的参考时钟比如板上晶振的100MHz定期测量根据测量结果更新校准系数。校准频率取决于温度变化速度一般每秒校准一次就够了。6.3 时钟抖动分辨率的天花板不管用哪种TDC方案时钟抖动都是分辨率的天花板。FPGA内部时钟网络的抖动通常在5-20ps RMS这个抖动会直接叠加到测量结果上。如果TDC本身的分辨率是10ps但时钟抖动是15ps那实际分辨率就是25ps左右。降低时钟抖动的方法有几个一是用专用的时钟输入引脚避免用普通IO二是用PLL或者MMCM对时钟做净化三是用差分时钟输入抗干扰能力更强。但不管怎么做FPGA内部时钟抖动很难降到5ps以下这是FPGA TDC的物理极限。6.4 资源与布局的权衡TDC的资源占用和布局约束是另一个容易踩坑的地方。延迟链的物理位置直接影响传播延迟如果布局太分散延迟会变大且不均匀。我建议用RLOC约束把延迟链约束在相邻的Slice里同时用BEL约束指定具体的CARRY4位置。但约束太紧又会导致布线拥塞影响其他逻辑的布局。实际项目中我通常把TDC模块单独放在一个时钟区域clock region里和其他逻辑隔离这样既能保证延迟链的规整性又不会影响整体布局。7. 从需求反推方案一个激光测距项目的完整选型过程回到开头那个激光测距项目。指标是分辨率优于50ps量程10米到3公里重复频率10kHz以上。我们最终选了差分TDL方案理由如下分辨率50ps的要求TDL勉强能到但余量不够多相时钟差太远游标延迟线资源开销太大脉冲收缩死区时间太长。差分TDL的实测RMS在15-20ps留了足够的余量。资源方面差分TDL占用了约5%的Slice在XC7A100T上完全可以接受。重复频率方面差分TDL的死区时间在100ns左右支持10MHz以上的重复频率10kHz绰绰有余。实际落地时我们做了三件事一是用RLOC把两条延迟链约束在相邻区域保证延迟差稳定二是做了码密度校准和温度在线校准把线性度做到了±1.5 LSB三是用差分时钟输入和PLL净化把时钟抖动控制在了8ps RMS以内。最终实测分辨率做到了18ps RMS线性度±2 LSB温漂在0-50℃范围内小于0.5 LSB完全满足指标要求。这个项目让我最大的体会是FPGA TDC没有最好的方案只有最合适的方案。选型时不要盯着分辨率一个指标要把资源、功耗、温漂、校准复杂度、开发周期都放在一起权衡。有时候退一步选个分辨率稍差但更稳定的方案反而能让项目更快落地。最后分享一个小技巧如果你不确定选哪个方案可以先在FPGA里把TDL和差分TDL都搭一遍用同一个测试平台跑对比数据。TDL的开发周期通常只要一两天差分TDL也就一周左右。用实测数据做决策比拍脑袋靠谱得多。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门