4. 基于FPGA的TDC设计与实现
在光子时间标记系统中,FPGA内部的TDC(Time-to-Digital Converter,时间数字转换器)承担着把“到达时刻”量化为数字码的核心任务。与分立ASIC方案相比,FPGA TDC的优势在于可重构、可与采集逻辑同片集成,但代价是必须面对布线延迟不均匀、工艺电压温度(PVT)漂移等现实问题。本节围绕进位链TDC、多相位采样、码密度校准与温度漂移补偿四条主线,说明从RTL到板级验证的完整实现路径。
一、进位链TDC:把延迟线变成时间标尺
进位链TDC利用FPGA内部专用进位逻辑(如Xilinx的CARRY4、Intel的carry chain)构建抽头延迟线。当“起始”信号沿进位链传播时,每个抽头处的延迟单元输出被一组触发器在“停止”信号到来时同步锁存,锁存结果中“1”的个数即代表起始与停止之间的时间间隔。设单个进位单元延迟为τ,抽头数为N,则理论量程为N·τ,LSB分辨率约为τ。
在RTL层面,关键写法是让综合工具把延迟单元映射到进位链而非普通LUT。以Xilinx 7系列为例,常用结构是例化CARRY4原语,将CI与CO级联,DI接固定电平,S接起始信号,抽头从CO引出。若用纯RTL描述,需加(* keep = "true" *)等属性防止优化,并避免工具把链拆散。一个典型的抽头采样代码如下:
// 简化示意:CARRY4级联抽头采样
genvar i;
for (i = 0; i < TAPS/4; i = i + 1) begin : gen_carry
CARRY4 u_carry (
.CO (co[i]),
.O (o[i]),
.CI (i==0 ? 1'b0 : co[i-1][3]),
.CYINIT(1'b0),
.DI ({4{1'b0}}),
.S ({4{start_dly}})
);
end
// 停止沿锁存抽头状态
always @(posedge stop_clk) begin
tap_reg <= {co[TAPS/4-1], o[TAPS/4-2:0]};
end
需要强调的是,进位链TDC的“分辨率”并非固定值。同一器件不同位置、不同温度下,τ可能在十几皮秒到几十皮秒之间波动,因此必须通过校准把“抽头序号”映射为“真实时间”。
二、多相位采样:用时钟相位扩展时间覆盖
单条进位链量程有限,若光子事件间隔较大,抽头会溢出。多相位采样通过MMCM/PLL生成多个等间隔相位时钟(如0°、45°、90°…315°),每个相位驱动一组采样触发器,对同一信号进行并行采样。这样等效于把时间轴细分,既扩展了粗计数范围,又为细计数提供更多插值点。
实现时需注意两点:一是相位时钟之间的偏斜(skew)必须通过布局约束控制,尽量让各相位触发器位于同一时钟区域;二是多相位采样结果需要“温度计码转二进制”编码,通常用优先级编码器找出第一个跳变沿的位置。若相位数为M,单相位周期为T,则粗时间分辨率为T/M。例如200 MHz时钟周期5 ns,8相位采样可得到约625 ps的粗粒度,再与进位链细测结合,即可覆盖大动态范围。
三、码密度校准:让每个bin都有真实宽度
进位链各抽头延迟并不相等,导致输出码的“bin宽度”不均匀,表现为微分非线性(DNL)和积分非线性(INL)。码密度校准的基本思想是:向TDC输入大量与时钟无关的随机事件(例如异步光子脉冲或伪随机触发),统计每个码值出现的次数。若输入事件在时间上均匀分布,则理想情况下各码出现概率正比于其bin宽度。设第k个码出现次数为Ck,总次数为Ctotal,则第k个bin的估计宽度为:
wk ≈ (Ck / Ctotal) × Trange
其中Trange为TDC量程。由wk累加即可得到每个码对应的真实时间边界,形成校准查找表。实际实现中,校准数据通常存入BRAM,在线运行时用码值查表输出时间。需要注意:码密度法要求输入事件足够多(一般每bin至少数百次),且事件分布不能与采样时钟同步,否则会出现周期性偏差。
四、温度漂移补偿:让校准结果长期有效
FPGA的进位延迟随结温升高而增大,典型温度系数约为0.1%~0.3%/℃。若在25℃校准后直接用于45℃环境,时间戳可能产生数百皮秒的系统偏差。补偿策略有两种:一是定期重新校准,利用片上温度传感器触发;二是建立温度-延迟模型,用多项式或分段查找表实时修正。
工程上更常用的是“温度索引LUT”:在多个温度点(如20℃、30℃、40℃、50℃)分别做码密度校准,把各温度下的bin宽度表存入BRAM,运行时根据温度传感器读数选择最近邻表或线性插值。若温度变化缓慢,也可在两次校准之间用一阶系数修正:
τ(T) ≈ τ(T0) × [1 + α × (T - T0)]
// α 为实测温度系数,T0为校准温度
// 示例:τ(25℃)=22 ps,α=0.002/℃,T=45℃
// τ(45℃) ≈ 22 × (1 + 0.002×20) = 22.88 ps
该示例数值为合理假设,实际α需通过温箱实验或片上加热测试获得。补偿后应重新跑码密度测试,确认INL从±2 LSB降到±0.5 LSB以内。
五、从RTL到板级验证的完整流程
一个可复现的TDC开发流程通常包含以下环节:
- RTL设计与约束:例化CARRY4链,编写抽头采样与编码逻辑;在XDC中约束进位链位置(如
set_property LOC)和相位时钟区域,避免跨时钟域偏斜。 - 行为仿真:用Testbench注入已知间隔的start/stop脉冲,检查编码输出是否单调、量程是否覆盖。仿真中可人为给不同抽头加偏斜,验证校准算法。
- 综合与实现:查看时序报告,确认抽头采样触发器满足建立/保持;用Vivado的
report_delay_calculation或类似工具估算进位延迟。 - 板级码密度测试:用外部脉冲发生器或片上PRBS产生随机事件,通过UART/以太网把码值上传PC,统计直方图并计算DNL/INL。
- 温度实验:将板卡放入温箱,在20~60℃范围内每隔10℃重复码密度测试,记录τ随温度变化曲线,拟合α系数。
- 在线验证:输入已知延迟的同轴电缆或光纤延迟线(如10 m光纤约50 ns),比较TDC读数与理论值,评估系统误差。
整个流程中,RTL决定分辨率上限,校准决定线性度,温度补偿决定长期稳定性,而板级验证则把三者串成可交付的测量能力。只有把码密度直方图、温度曲线和已知延迟对比三组数据都跑通,才能认为TDC从“能出数”进入“可信可用”的状态。