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的粗粒度,再与进位链细测结合,即可覆盖大动态范围。

进位链TDC + 多相位采样 + 校准补偿 信号链 光子/事件 起始沿 START 进位链延迟线 CARRY4 × N 抽头 τ ≈ 15~40 ps/级 多相位采样 MMCM 8相位 粗粒度 T/M 温度计码编码 优先级编码器 粗+细拼接 码密度校准 bin→时间映射 INL/DNL 修正 温度漂移补偿 片上温度传感器 查找表/多项式 时间戳 TOA/TOF ps 级 校准与补偿闭环 1. 码密度测试:输入大量随机事件,统计各bin命中次数,理想均匀分布。 2. 由累积分布反推每个bin的真实宽度,生成查找表LUT。 3. 片上温度传感器读数 → 温度补偿系数 → 实时修正LUT或τ值。

三、码密度校准:让每个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开发流程通常包含以下环节:

  1. RTL设计与约束:例化CARRY4链,编写抽头采样与编码逻辑;在XDC中约束进位链位置(如set_property LOC)和相位时钟区域,避免跨时钟域偏斜。
  2. 行为仿真:用Testbench注入已知间隔的start/stop脉冲,检查编码输出是否单调、量程是否覆盖。仿真中可人为给不同抽头加偏斜,验证校准算法。
  3. 综合与实现:查看时序报告,确认抽头采样触发器满足建立/保持;用Vivado的report_delay_calculation或类似工具估算进位延迟。
  4. 板级码密度测试:用外部脉冲发生器或片上PRBS产生随机事件,通过UART/以太网把码值上传PC,统计直方图并计算DNL/INL。
  5. 温度实验:将板卡放入温箱,在20~60℃范围内每隔10℃重复码密度测试,记录τ随温度变化曲线,拟合α系数。
  6. 在线验证:输入已知延迟的同轴电缆或光纤延迟线(如10 m光纤约50 ns),比较TDC读数与理论值,评估系统误差。
判断TDC是否达标,可看三个指标:LSB是否稳定在目标值附近(如20 ps±10%);INL是否小于±1 LSB;在20~60℃范围内,同一延迟的测量偏差是否小于±2 LSB。若偏差过大,优先检查进位链布局约束和温度补偿表是否覆盖当前温度。

整个流程中,RTL决定分辨率上限,校准决定线性度,温度补偿决定长期稳定性,而板级验证则把三者串成可交付的测量能力。只有把码密度直方图、温度曲线和已知延迟对比三组数据都跑通,才能认为TDC从“能出数”进入“可信可用”的状态。