ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

FPGA实现TDC:从延迟链原理到皮秒级时间测量实战

FPGA实现TDC:从延迟链原理到皮秒级时间测量实战 做高精度时间测量这行绕不开一个词TDCTime-to-Digital Converter时间数字转换器。说白了它干的事情就是量时间把两路信号之间的时间差或者说某个事件发生的时刻转化成一个数字值输出。这几年我一直在做激光雷达和精密测距相关的项目对TDC的体会特别深没有它皮秒级的计时需求基本无从谈起。以前大家习惯用专用时间测量芯片比如ACAM那几款但灵活性差、价格也不便宜。后来我转到FPGA上自己搭TDC才发现这条路能把分辨率做到几十皮秒甚至更高还能把时间测量和信号处理逻辑放在同一颗芯片里这才是真正的实现实战。这篇文章我想把自己从原理到落地的完整经验写下来。包括TDC到底怎么实现皮秒级测量、FPGA内部那条延迟链是怎么工作的、电平怎么捕获、码怎么转、校准怎么做、温度漂移怎么压下去以及调试过程中踩过的坑。不管你是刚接触时间数字转换的学生还是已经在做精密测量项目的工程师这篇文章应该都能给你省上不少弯路。1. 先看应用场景再看TDC要解决什么问题1.1 哪些设备隐性依赖着皮秒级时间测量很多人一听到“皮秒级时间测量”第一反应是实验室里的物理仪器。实际上这几年消费电子、工业检测、医疗影像、自动驾驶里大量设备都用到了它。最典型的就是激光测距也就是LiDAR。飞行时间法测距的公式很简单距离等于光速乘时间差再除以2。光传播1米大概要3.3纳秒如果想把测距精度做到毫米级时间测量分辨率就要到皮秒级。比如测距精度做到3毫米对应的时间分辨率就需要10皮秒左右。另一个典型场景是PET医疗成像正电子湮灭产生的两个伽马光子到达探测器的时间差只有几百皮秒需要精确测量两个探测通道之间的时间差来提高符合事件的定位精度。高能物理实验里的飞行时间探测器也类似粒子飞行距离固定测了飞行时间就相当于测了粒子速度能推出质量、区分粒子种类。除此之外精密示波器、数字锁相环、量子通信、时间同步系统甚至电力系统故障定位都用得上高精度时间测量。这些设备原先大多用专用TDC芯片配合外部ASIC才能做。问题是这类芯片通道数少的时候还好一旦要求多通道、高密度集成成本立马飙上去而且时间测量和数据处理分在两颗芯片之间传输连线延迟和抖动又引入新的误差。FPGA方案就不太一样通道数可以做到几十甚至上百路而且测量逻辑后面直接紧跟数据处理逻辑整条链路都在同一个器件里完成延迟短、集成度高。这也是我现在更倾向于用FPGA做TDC的原因。1.2 分辨率、精度和无杂散动态范围先把指标说清楚做TDC第一件事不是写代码而是把指标掰开揉碎。经常有人把分辨率和精度混为一谈实际上两者完全不同。分辨率指的是TDC能区分的最小时间间隔就像尺子上的最小刻度精度则是指多次测量同一时间间隔时输出结果的离散程度对应的是误差分布的标准差。一把尺子刻度做到1毫米不代表每次量出来的结果都准还可能有系统偏差。TDC也一样延迟链的每一个延迟单元尺寸决定分辨率但温度漂移、电源噪声、非线性误差会影响精度。第二个重要指标是微分非线性DNL和积分非线性INL。DNL描述的是各个量化码宽相对于理想码宽的偏差如果用延迟链做TDC温度计码在不同位置可能会因为工艺偏差导致码宽不均匀。INL则描述了整体转换曲线相对理想直线的偏离程度它直接影响大跨度时间测量的准确性。还有一个容易被忽略的指标是转换时间也就是测量一次需要多长时间。有些TDC适应连续触发应用转换必须足够快。还有一个是死时间指TDC处理完一个事件到能处理下一个事件之间的最短间隔。激光雷达扫描一个点云可能几微秒内就有几千个回波事件如果TDC死时间太长事件就会丢失。这些指标共同决定了TDC能否真正落地到某个具体产品里而不只是实验室里性能好看。2. TDC原理拆解从粗计数到延迟链内插2.1 直接计数法为什么满足不了皮秒级需求最简单的时间测量方法就是计数器法用一个高频时钟去计STOP信号相对START信号的时钟周期数。比如100 MHz时钟一个周期10纳秒计数器法分辨率就是10纳秒。想提高到1纳秒就得用1 GHz时钟实际上芯片内部主频能到几百MHz已经很难就算用PLL倍频到GHz功耗和时钟抖动也会让精度大打折扣。1皮秒需要1 THz的时钟频率物理上完全不现实。所以直接计数法只能做“粗测”精确测量必须依赖内插技术。内插的意思是把START信号到下一个时钟沿这一段“碎片时间”和STOP信号到下一个时钟沿的碎片时间分别精细测量出来再用粗计数的整周期时间减去或加上这两个碎片差。打个比方粗计数就像用一把厘米刻度的直尺量长度内插就是用一个螺旋测微器去补读数里多出来的零点几毫米部分。TDC内部延迟链就是这把螺旋测微器。2.2 延迟链法把时间差变成空间上的电平序列延迟链的核心思想很直观将待测信号通过一串延迟单元每个单元延迟固定的一小段时间比如40皮秒。信号在这条链上传播到第N级时就代表它已经经过了N×40皮秒的时间。延迟单元的输出接在寄存器上当时钟沿到来时寄存器锁存每个延迟单元的状态。如果信号已经传到第N级前N级输出都是1N之后都是0形成一串温度计码也就是“热码”。数一下1的个数就能知道信号在时钟沿之前多久到达。这就是延迟链法测碎片时间的基本原理。在FPGA里延迟单元通常不直接用LUT而是用进位链CARRY4来实现。CARRY4在Xilinx 7系列器件中每一级的延迟大约在15到30 ps之间具体数值会随进程角、供电电压、温度变化。这种延迟链的分辨率受工艺限制但已经足够做到几十皮秒量级。将延迟链的输出接到寄存器进行采样采样时钟就是测量系统的基准时钟比如200 MHz。采样时钟频率不需要太高因为延迟链本身承担了亚时钟周期内的细分工作。需要注意的是延迟链的最小延迟并不是靠减小寄存器时钟周期来实现的而是靠每个延迟单元本身的传播延迟。所以对整个系统来说时钟频率决定了测量范围延迟链的单元数量决定了能测的最大碎片时间单元延迟决定了分辨率三者是解耦的。这带来一个好处我们可以在较低的时钟频率下获得很高的时间分辨率而不需要像直接计数法那样盲目提高时钟频率。2.3 游标卡尺法、差动延迟线和抽头延迟线的对比延迟链法之外还有几种常见方案游标卡尺法Vernier两条延迟链分别对START和STOP信号做延迟两条链的延迟单位略有不同比如45 ps和50 ps。每过一个后续级两条信号的时间差就缩小5 ps当两者对齐时经过的级数乘以5 ps就是待测时间差。这种方法能做到比单个延迟单元更小的分辨率相当于用“延迟差”来测量。缺点是通道数多时资源开销大且要求两链延迟差恒定对温度稳定性要求很高。抽头延迟线加多相时钟内插利用PLL产生多相时钟比如8个相位每个相位相差45°相当于把时钟周期切成8份。分辨率提升8倍但受限于PLL相位数量提升幅度有限一般与延迟链方法结合使用。基于周期内差分测量用两个频率稍有差异的振荡器类似数字PLL的方式对时间差进行细分适合低成本的ASIC实现但在FPGA中精度控制和资源占用不太友好。FPGA实现TDC主流路线是延迟链加法。它的核心优势在于成熟可靠Xilinx、Intel等FPGA的底层进位结构本身是硬核延迟值稳定布局布线可控不像LUT那样容易受功能配置影响。而且延迟链的输出天然就是温度计码后续编码电路简单适合用查找表或二进制编码器实时转换。2.4 为什么把TDC放进FPGA而非专用芯片专用TDC芯片精度做得高很多都能达到单芯片几十皮秒甚至几皮秒的精度在某些领域依然有优势。但它的短板也很明显灵活性和集成度不足。具体来说各通道之间的测量逻辑、触发逻辑、触发滤波器、数据打包逻辑以及NIST、USB、以太网等外部接口全都需要额外电路。而在FPGA中实现TDC时间测量单元只占一小部分资源真正有价值的是能把整个数据通路做在相邻逻辑里。举个例子多通道激光雷达需要32路同时测量回波时间差同时每路要有触发阈值判断、波形积分、距离换算、点云输出。在专用TDC方案里至少需要一颗TDC芯片加一颗FPGA或DSP。而在单颗FPGA中TDC通道逻辑与数字信号处理逻辑可以做成流水线数据零拷贝、低延迟系统同步性更好。功耗和BOM成本也都更可控。所以“FPGA实现TDC”并非单纯比专用芯片参数更优而是整体系统方案上更有吸引力。3. FPGA实现TDC的整体设计与通道架构3.1 系统架构一个典型的多通道TDC在FPGA里长什么样一个完整的FPGA TDC系统从输入到输出一般包含以下模块输入缓冲与逻辑判断接收外部信号进行滤波、去毛刺、触发沿检测。必要时还可以输入模拟比较器后的数字边沿信号。时间戳粗计数模块以一个基准时钟对触发事件的发生时刻进行整数时钟计数得到粗计数。延迟链/内插模块针对START和STOP信号分别做碎片时间测量得到亚时钟周期时间。编码器将延迟链输出的温度计码转换成二进制码。通道对齐与校准模块补偿不同通道的固定延迟差和延迟链非线性。数据打包输出模块将粗计数、细计数、通道ID、时间标签打包通过FIFO输出。这个架构下每个通道都包含独立的延迟链和粗计数器。通道之间可能存在固定偏差比如PCB布线、输入缓冲、寄存器差异导致的延迟差异。因此系统需要做一次静态校准在逻辑内部生成一个“测试脉冲”或已知时间差信号让每个通道都测量一遍记录下来作为修正值。3.2 延迟链的FPGA底层实现CARRY4进位链不为人知的门道在Xilinx 7系列或Ultrascale系列FPGA中延迟链一般选择CARRY4进位链。CARRY4是FPGA内部专门用于算术运算的硬核逻辑它包含多路专用进位传播通路延迟特性非常稳定。为什么不用LUT因为LUT既要做逻辑功能又要兼顾布线资源一旦布线路径变化延迟就不可控而CARRY4链是一条硬连线结构级与级之间走专用路径延迟更一致。用延迟链时有几点经验直接决定成败第一延迟链的每一级输出一定要紧接一个寄存器采样。采样寄存器最好使用同一列的专用寄存器否则布线反馈会引入额外的插入延迟导致温度计码出现气泡中间出现非连续状态。Xilinx中CARRY4的输出有O和CO两个端口一般取CO的输出与相邻级CARRY4的CIN串联形成一条连续进位链。然后通过原语或综合属性将CARRY4输出映射到相邻触发器。更稳妥的做法是在代码里用原语例化CARRY4手动连接S、DI、CI、O和CO并增加位置约束把这组延迟链绑定到同一列slice上。这样综合器和布局器就不会随便打散结构。第二延迟链长度决定了可测动态范围。假设延迟单元约20 ps周期为5 ns200 MHz时钟那么需要约250级延迟单元才能覆盖一个完整时钟周期。实际上我们会留一些裕量因为不同工艺角下各级延迟会有波动。设计时我会把链长做到300级以上覆盖范围会略大于一个时钟周期避免出现测量盲区。第三必须把采样时钟的到达时间控制好。延迟链的采样触发器时钟网络要使用全局时钟缓冲尽量让采样时钟到各触发器的延迟一致。否则时钟偏斜会被折算成测量误差。这个问题在单通道TDC里不太明显多通道TDC就必须对布局做出约束把各通道的延迟链放在临近区域同时保证时钟路径对称。3.3 温度计码到二进制的编码方案查找表比加法器靠谱延迟链直接输出的是一串温度计码前段全是1后段全是0。如果把1的个数当成编码结果需要快速求出1的个数。最直观的方法是写一个循环检测但循环逻辑在FPGA中会被综合成巨大级联组合逻辑延迟太长。实际工程里我一般用以下方法先找温度计码到独热码的过渡沿一个code[k]为1而code[k1]为0的位置。战场上这个过渡沿可能存在气泡也就是链中某级输出异常跳变导致温度计码中不是严格连续的1和0。这时候单纯查找会编码错乱。常见的对策是采用“优先边沿检测”思路即找到最早出现的0的位置认为其后都是0或者用查找表查表挨个检查连续段容忍局部气泡并取第一个有效边沿。为了提升鲁棒性可以在硬件上增加冗余比如延迟链输出后先经过一个“气泡消除”电路再做编码。编码器的实现方式可以选两种按固定宽度切片的查找表将256位延迟链输出分成八段32位每段先用LUT消泡再由优先编码器编码最后综合所有段的编码结果。二分法优先编码树逐层判断上半段是否全为1依次收敛到边界位置优点是逻辑深度低、速度快适合需要高吞吐率的应用。我建议在千万元素级别FPGA上做多通道TDC时用“查找表消泡优先编码”的组合。单通道TDC则可以直接用一个变体优先编码器配合组合逻辑代码简短但不够灵活。优先编码器输出后要立即登记锁存避免组合逻辑变化造成亚稳态。3.4 测量公式与校准补偿策略TDC计算时间差的完整公式是t_start N_start × T_clk fine_start t_stop N_stop × T_clk fine_stop Δt t_stop − t_start其中N_start是START通道的粗计数fine_start是延迟链测量得到的碎片时间。这里的fine_start实际上是“从START有效沿到下一个采样时钟沿”之间的时间因此最终换算时要注意正负号。实际操作中我会把fine_start定义成“从时钟沿回溯到信号沿所需的时间”这样与延迟链输出的数值方向一致不容易出错。校准部分重点方法是码密度测试。做法是向TDC输入大量随机时间间隔的信号信号沿相对于采样时钟在统计上应均匀分布那么每个编码被命中的次数也应基本均匀。如果某个编码命中次数明显偏高说明该编码对应的延迟单元码宽偏大反之偏低说明码宽偏小。用码密度数据可以计算出每个单元的实际延迟宽度进而把各码对应的真实时间做加权修正。工程上通常把码密度统计做成RAM查找表每次测量结果出来后就查表得到校正后的时间值。这个方法校正非线性的效果非常明显能把DNL从几个LSB压到0.2 LSB以下。温度漂移是另一个难点。延迟链的延迟值随温度和电压变化数十皮秒的漂移对精度影响不能忽视。常用做法是用一条参考延迟链监控环境变化FPGA内部生成一个已知时间间隔的脉冲让参考链持续测量用实时参考值动态修正主测量链的延迟换算系数。这种“实时自校准”机制能显著改善温度漂移带来的误差。4. 实战从工程搭建到关键代码实现4.1 器件选型和工程初始化我平时调TDC主要用Xilinx Artix-7和Kintex-7系列入门的话Artix-7足够比如XC7A35T或XC7A100T。主要考虑是7系列CLB里有CARRY4结构成熟资料多时钟管理单元MMCM/PLL方便生成200 MHz基准时钟逻辑资源和Block RAM充足多通道编码和校准查找表都装得下。工程初始化要点Vivado里新建工程后要先创建约束文件规划好输入引脚、系统时钟引脚、复位和串口调试引脚。TDC项目里时钟布局非常关键主参考时钟要连接到MRCC或SRCC引脚以便接入全局时钟网络。为了调试方便我习惯把时间测量结果用ILA抓出来或者在板上通过UART把数据回传电脑。4.2 延迟链与边沿捕获的Verilog实现下面给出一个简化但可运行的延迟链捕捉模块。它用CARRY4级联形成延迟链用系统时钟作为采样时钟。这里用S和CO端口来说明实际项目里我会把CARRY4例化展开。module tdc_delay_line #( parameter N 300 )( input wire clk, input wire hit, // 待测信号沿 output wire [N-1:0] raw_thermo ); wire [N-1:0] carry_out; wire [N-1:0] carry_in; assign carry_in[0] hit; genvar i; generate for (i 0; i N; i i 1) begin : carry_chain CARRY4 #( .CYINIT(1b0) ) u_carry4 ( .CO (carry_out[i]), .O (raw_thermo[i]), .CI (carry_in[i]), .CYINIT(1b0), .DI (4b0000), .S (4b1111) ); if (i N-1) begin assign carry_in[i1] carry_out[i]; end end endgenerate // 采样寄存器锁存温度计码 reg [N-1:0] thermo_reg; always (posedge clk) begin thermo_reg {carry_out[N-2:0], 1b1}; end assign raw_thermo thermo_reg; endmodule这段代码需要结合你的意图去理解hit信号进入CARRY4链后会逐级传播。clk上升沿到来时原理图里CARRY4的CO输出会同级寄存器的数据端相连从而锁存信号已经传播到的位置。不过直接例化CARRY4时如果不在原语端口上绑定采样触发器综合器可能会把上面的寄存器综合成普通FF布线位置不受控所以更严谨的做法是在Tcl或XDC里对每个CARRY4 delay可设置“BEL”约束或者直接用(* KEEP TRUE *)和(* DONT_TOUCH TRUE *)属性把链路锁定。用CARRY4时DI和S还可以接成AB的形式让进位链按照加法器的结构滑过从而让寄存器采样更稳定但这部分细节需要你自己对照目标器件手册验证。如果只是想快速验证延迟链原理也可以用更简单的纯RTL写法用寄存器级联产生延迟链但它的延迟精度远不如CARRY4最终热码分布也不稳定不建议用于实际测量。要直接投入产品使用还是得老老实实例化CARRY4配上一组位置约束。4.3 编码器与工程约束要点温度计码转二进制我常用一个优先编码树思路避免整个链写死成巨型查找表。下面是一个简化描述module thermo2bin #( parameter N 256 )( input wire [N-1:0] thermo, output reg [$clog2(N)-1:0] bin ); integer k; always (*) begin bin 0; for (k N-1; k 0; k k - 1) begin if (thermo[k] 1b1) begin bin k; break; end end end endmodule这个写法行为仿真没问题但综合成为大型for循环后会变成很长的级联比较链。一般我会把它拆成两级/三级查找树或每一段32位先做优先编码再合并编码。工程上还常用一个脉冲对齐简化如果输入信号是窄单脉冲可以直接把热码注册后用“求最高位1位置”的函数来编码。约束方面重点提以下几点延迟链内部寄存器要尽量保持在同一列slice用XDC中的BEL约束绑定到固定的FDE位置或者用Pblock锁定整个延迟链。这样设计更可控。采样时钟与hit输入路径长度差异要尽量小。hit进入延迟链前建议经过IBUF后直接连接不要塞入过多组合逻辑。set_property ASYNC_REG TRUE可放在亚稳态寄存器上但延迟链采样本身就是亚稳态风险的集中地最好在后级链路上多做几级同步或者采用专门设计的亚稳态消除寄存器逻辑。这类约束一旦做不好延迟链输出的热码会频繁出现气泡而且再现性差——同样的输入时间差这次测出码位是44下次可能跳到42或46这就是布局导致的路径延迟抖动在影响你。4.4 仿真和在线验证怎么确认延迟链真的被布成了一条链写TDC不能只靠行为级仿真通过就上板我自己的流程是第一步编写testbench给hit信号注入已知时间偏移比如相对clk上升沿偏移1.2 ns观察理论上延迟链对应输出码位应该大约为1.2 ns/20 ps 60级位置。行为仿真主要看编码器逻辑和数据通路是否通。第二步是进行后仿真或布局布线测试重点看关键路径延迟报告看CARRY4是否真的被串成了链。在Vivado的Device视图中选择延迟链相关的cells如果能看到多个CARRY4和对应的FF连续排列在同一列上说明布局正确。如果发现分散在多行多列执行时间性能差、热码乱就该用Pblock把它们锁在一起。第三步是上板实测。在板上先生成一个校准用参考脉冲源用ILA观察延迟链某级别处是否有稳定翻转逐步测量并采集热码统计直方图。统计结果如果呈梯形分布边界分明说明延迟链健康。如果直方图出现多个尖峰说明存在延迟重复或跳变基本可以定位到布局或采样寄存器的时序问题。第四步就是做码密度测试并建立校准表。上一万个随机事件把每个编码的命中次数统计出来。正常情况下如果温度计码各级码宽均匀各码命中次数应相差不大。相差明显时就按实际统计比例建立查表修正。这个表存在BRAM里每次测量完成后查表修正最终输出的时间值精度会明显提升。5. 工程中的灾难集锦常见问题与排查技巧5.1 热码气泡不断可能是综合器自作主张气泡就是延迟链温度计码中出现类似11101111这种不连续情况。它产生的原因很多常见的有延迟链采用LUT实现时LUT内部的MUX延迟和非进位路径延迟不同导致相邻触发器的采样时刻不一致CARRY4的进位输出连接到寄存器时寄存器之间布线长度差异增大时钟偏斜过大特别是为了省资源把延迟链的寄存器挂在不同时钟区域。排查方法先用ChipScope/ILA抓原始热码统计气泡位置。若气泡总出现在固定位置大概率是布线延迟异常若气泡随机出现在某一段可能是亚稳态或时钟抖动问题。布局上把延迟链放到同一列的slice并给每个寄存器添加BEL约束往往能解决大半气泡问题。5.2 码宽不均匀用码密度统计找出每个延迟单元的真实宽度延迟单元本身并不是严格等间隔的。CARRY4每一级的延迟还受输入翻转方向、温度、电压影响。如果不对各个码宽做修正直接按“级数乘以固定延迟”换算时间非线性误差会很大。尤其做激光雷达这种需要绝对距离精度的应用误差能到厘米级。此时码密度测试是必备手段。原理是输入随机时间间隔信号理论上每个码发生的概率相同。如果某个码的统计次数偏多说明这个码对应的延迟单元比较宽占的时间多偏少则对应延迟单元较窄。我们用这个统计直方图反推出每个单元的延迟宽度建立“码位置到累计时间”的查找表。最终测量时配合查找表输出修正后的时间值。实测下来INL能从几个LSB压到0.1 LSB到0.3 LSB的水平对绝对精度帮助极其明显。5.3 温度漂移导致测量值“飘”参考链实时校准才是出路FPGA芯片温度在开机后几分钟内可能上升二三十度延迟链各级延迟值随之变化导致测量结果整体偏移。一个典型案例同一固定时间间隔冷态和热态测量值能差几十皮秒甚至上百皮秒这对皮秒级应用是致命的。我的做法是在片内建立一条“参考延迟链”和一组校准脉冲。校准脉冲电路周期性地产生固定时间差的沿送入参考延迟链测量。当温度变化时参考延迟链输出的数值会跟着变化我们用此时实测的参考时间值与标准时间值相比得出一个实时比例系数再用此系数修正主测量链的延迟换算值。这样相当于每几十毫秒做一次内部自检能有效抵消大部分温度漂移带来的影响。5.4 多通道之间延迟不一致偏差校准不可跳步多通道TDC另一个容易踩的坑是通道间偏差。两个通道物理位置不同PCB走线长度不同输入触发器位置不同都会造成相同的物理时间到达后各通道测出来的时间戳相差固定值。如果这个偏差不做校准后面所有数据处理都会被污染。解决办法是在系统初始化时做通道对齐。在FPGA内部把一个测试脉冲同时扇出到所有通道最好用同一个输出引脚通过PCB走线再环回到各输入或者直接内部扇出各通道测量同一测试脉冲的时间把相对通道0的时间差记录下来作为固定偏置。这要求测试脉冲到各通道的实际物理路径尽可能等长否则校准本身就会引入误差。在PCB设计时到各通道的走线要尽量平行等长在FPGA内部扇出到各通道寄存器的路径也最好由时钟网络统一驱动。做完这次静态校准后再把上面提到的码密度修正和温度校准叠加多通道之间的一致性就能控制在可接受范围内。5.5 死时间与吞吐率的矛盾怎么权衡测量完成之后延迟链采样寄存器要复位、编码器要跑完、FIFO要写入这段时间内新来的触发无法处理这就是死时间。想做高吞吐率连续测量核心是采用多级流水线与并行处理延迟链采样、编码、校准查表、FIFO写入各级之间用寄存器隔开流水线化。但流水线化会给延迟链复位带来麻烦因为整个链路需要在一个时钟周期内清空否则下一个触发进来会叠着旧数据。我的经验是把延迟链做完一次采样后立即用一个全局复位脉冲刷新所有采样触发器同时让后续流水线从当前周期的锁存值中取数。只要流水线每个周期推进一次就能做到每时钟周期处理一个触发事件不会降低测量精度。6. 最后的实操心得真要去调一个FPGA TDC我建议普通工程人员先别盲目追求“皮秒级分辨率”这个听上去很吓人的指标。先把链路打通、把热码抓稳、把码密度统计出来能稳到几百皮秒级别以后再一步步深入优化到几十皮秒。每一步都要有实测数据支撑而不是只靠仿真结果。说实话我在第一版延迟链设计时仿真显示分辨率做到了12 ps可是上板后热码乱成一团码位跳变范围达到了3到4个LSB后来才发现是触发器布局分散了。把CARRY4和采样寄存器用Pblock锁在同一列之后分辨率才真正落到20 ps以内。直到现在每次换FPGA型号我依然会把布局检查和码密度测试作为第一优先级这些习惯帮我省掉了大量排查时间。如果你也想在自己的设计里加入TDC不妨从Artix-7的一个单通道延迟链开始试起先把热码抓出来剩下的路自然就清晰了。
返回列表