跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言

基于 FPGA 的高精度 TDC 设计

基于 FPGA 进位链构建高精度 TDC,利用 CARRY4 原语实现皮秒级延迟测量。通过 DONT_TOUCH 属性与 XDC 约束锁定布局,避免综合优化丢失。结合粗计数器与细延迟链扩展动态范围,采用双级同步器解决亚稳态问题。需进行非线性误差校准以应对 PVT 变化,适用于激光雷达等精密测距场景。

山野诗人发布于 2026/3/29更新于 2026/6/1325 浏览

Xilinx Vivado 实现高精度时间数字转换器

在激光雷达系统中,飞行时间(ToF)测量的精度直接决定了距离分辨能力。一个典型的挑战是:如何在不使用昂贵专用芯片的前提下,实现皮秒级的时间间隔测量?随着 FPGA 架构的进步,尤其是 Xilinx 7 系列及 UltraScale 器件中 SLICE 结构的高度一致性,这个问题有了新的答案——利用 FPGA 内部的进位链(Carry Chain)构建全数字 TDC(Time-to-Digital Converter),不仅成本低、集成度高,还能达到 50~100 ps 的分辨率。

这种方案的核心思想并不复杂:把两个事件之间极短的时间差,'展开'成一条由微小延迟单元串联而成的物理路径,再通过锁存这条路径上的状态来'读出'时间值。这就像是用一把微观的尺子去丈量时间,而这条'尺子'的最小刻度就是每个延迟单元的传播延迟。


要理解这一机制,得先看清楚 FPGA 里藏着什么'宝藏'。在 Xilinx Artix-7 或 Kintex-7 这类主流器件中,每一个 CLB(Configurable Logic Block)都包含多个 SLICE,而每个 SLICE 内嵌了一个名为 CARRY4 的原语。它的本职工作是在加法器中快速传递进位信号,但由于其硅级布局高度优化,各级之间的延迟非常稳定且均匀——这正是构建高精度延迟链的理想材料。

相比用 LUT(查找表)搭建的延迟线,CARRY4 具有更低的单元间偏差和更强的抗工艺波动能力。更重要的是,它不需要额外功耗就能维持稳定的延迟特性,非常适合长期运行的精密测量系统。典型条件下,单个 CARRY4 级联段的延迟约为 70 ps,这意味着仅需几十个这样的单元,就能实现几纳秒范围内的精细时间采样。

核心逻辑在于这段 Verilog 实现:

// carry_chain_delay.v —— 利用 CARRY4 构建等效延迟链
module carry_chain_delay (
    input clk,
    input start,
    output wire [TDL_LENGTH-1:0] taps
);
    (* DONT_TOUCH = "TRUE" *)
    reg [TDL_LENGTH-1:0] dly_reg = 0;
    assign taps = dly_reg;

    generate
        genvar i;
        for (i = 0; i < TDL_LENGTH; i = i + 1) begin : carry_gen
            CARRY4 carry_inst (
                .CO(),
                .CYINIT(i == 0 ? start : 1'b0),
                .DI(4'h0),
                .S({4{1'b0}}),
                .O()
            );
            defparam carry_gen.carry_inst.CYBIT_OP = "O";
        end
    endgenerate

    always @(posedge clk) begin
        dly_reg[0] <= start;
        for (int j = 1; j < TDL_LENGTH; j = j + 1)
            dly_reg[j] <= dly_reg[j-1];
    end
endmodule

这段实现初看简洁,实则细节决定成败。首先,CYINIT 被用来注入起始脉冲,当 start 信号到来时,会触发进位链中的第一个单元;随后,在时钟驱动下,这个'波前'沿着由 CARRY4 构成的链条逐级传递。每一级输出连接到一个寄存器,形成所谓的'抽头'(tap),最终构成一个时间域上的'热图'。

不过要注意,综合工具往往会认为这些未显式使用的 CARRY4 实例是冗余逻辑并予以删除。为此,必须加上 (* DONT_TOUCH = "TRUE" *) 属性,并配合 XDC 约束锁定布局:

set_property KEEP_HIERARCHY YES [get_cells carry_gen*]
set_property LOC SLICE_X12Y5 [get_cells carry_gen[0]/carry_inst]
set_property LOC SLICE_X12Y6 [get_cells carry_gen[1]/carry_inst]

否则,你精心设计的延迟链可能在比特流生成阶段就被'优化'掉了——这是很多初学者踩过的坑。


然而,仅仅有硬件结构还不够。真正的挑战在于如何准确解读锁存后的结果。假设 STOP 信号到来时,第 6 个延迟单元刚刚翻转,而第 7 个还未响应,那么我们应该记录为'6 个单位延迟'。但由于制造差异,每个单元的实际延迟并不完全一致,这就引入了非线性误差(DNL/INL)。如果不加以校正,即使平均分辨率达到 80 ps,局部误差也可能超过 200 ps,严重影响测量重复性。

解决办法通常有两种:一是出厂时进行一次性标定,将每个抽头的实际延迟写入 ROM 查表补偿;二是引入动态校准机制,例如并行运行一个环形振荡器作为参考源,周期性地测量当前温度与电压下的典型延迟值,实时调整换算系数。

更进一步,如果待测时间间隔较长(比如超过 10 ns),仅靠延迟链无法覆盖整个范围。这时就需要引入'粗 - 细混合计数'架构:用一个高速计数器记录参考时钟周期数(粗计数),同时用 TDL 捕捉不足一个周期的剩余部分(细计数)。最终时间 = 粗计数值 × T_clk + 细计数值 × T_delay_per_stage。

例如,若参考时钟为 200 MHz(周期 5 ns),TDL 分辨率为 75 ps,则系统可实现 5 ns × N + 75 ps 的组合测量,动态范围轻松突破百纳秒量级。


另一个常被忽视的问题是亚稳态。START 和 STOP 信号往往来自外部传感器,与 FPGA 本地时钟异步。如果它们恰好在时钟边沿附近到达,寄存器可能进入中间态,导致输出不确定。虽然概率极低,但在高频测量中足以造成显著误差。

标准做法是采用双级同步器:

reg start_sync1 = 0, start_sync2 = 0;
wire start_clean;
always @(posedge clk_ref) begin
    start_sync1 <= start;
    start_sync2 <= start_sync1;
end
assign start_clean = start_sync2;

虽然这会引入约两个时钟周期的延迟,但对于大多数应用场景而言是可以接受的代价。关键是避免因亚稳态引发的状态跳变,从而保证测量结果的可靠性。


在实际系统集成中,完整的 TDC 模块通常位于这样一个数据流路径中:

[外部事件] → [LVDS 接收] → [同步 FF] → [TDL + 粗计数器]
↓
[编码与校准]
↓
[AXI/UART 输出接口]
↓
[MicroBlaze 或 PC]

前端采用差分信号(如 LVDS)提高抗干扰能力;中间层完成时间捕捉与初步处理;后端通过 AXI 总线接入软核处理器,或经 UART 上传至上位机做进一步分析。整个流程可在 Vivado 中一站式完成,从 Verilog 编写、综合实现,到 ILA 在线调试,极大地缩短开发周期。

值得一提的是,测试阶段建议使用 Vivado Simulator 配合 force 命令模拟不同时间间隔的 START/STOP 序列,验证编码逻辑是否正确。而在板级调试时,插入 ILA 核抓取 TDL 输出波形,能直观看到脉冲沿的传播过程,确认延迟链是否正常工作。


当然,这套方案也有局限。最明显的是 PVT(工艺、电压、温度)敏感性。同一设计在不同环境下的延迟可能变化±15%,因此对于要求长期稳定性的应用,必须加入温度传感器和自校准逻辑。此外,延迟链长度受限于可用 SLICE 资源,过长的设计可能导致布局失败或时序违例。

但从工程角度看,这些问题都在可控范围内。相比之下,其优势更为突出:无需模拟电路、易于移植、支持动态重构,特别适合科研原型开发和中小批量产品。在 LiDAR、ToF 相机、量子时间标记、工业精密测控等领域,已经有不少成功案例。

未来的发展方向也很清晰:结合 DLL 或 PLL 生成更稳定的参考时钟,构建多通道 TDC 阵列用于并行测量,甚至集成 AI 算法实现智能噪声抑制与误差预测。随着 Xilinx Versal 等新型 ACAP 平台的普及,这类高精度时间测量功能有望成为边缘智能设备的标准配置。

这种高度集成的设计思路,正引领着精密测时技术向更可靠、更高效的方向演进。

目录

  1. Xilinx Vivado 实现高精度时间数字转换器
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • C++11 右值引用与移动语义详解:从性能瓶颈到零拷贝优化
  • 宇树机器人 G1 二次开发:基于 FAST-LIO 的建图与 RViz 配置
  • 从零开始搭建 air i:开源 AI 多模态数字桌面伴侣入门指南
  • 文心一言 4.5 开源模型深度解析:轻量化部署与中文场景优化
  • WebPShop 插件:Photoshop 处理 WebP 格式的完整指南
  • 基于 AutoGPT 与 Python 构建自主智能体实战指南
  • 颠覆级里程碑:Whisper Large-V3-Turbo重构语音交互技术范式
  • 如何编写专业的 AI 大模型 Prompt 指南
  • 大模型落地为何优先选择知识库场景
  • SkyWalking Java Agent 配置实战:IDEA 与 Tomcat 多场景详解
  • Libvio.link 爬虫技术详解
  • OpenClaw 飞书机器人权限配置与安全指南
  • WebGL 矩阵基础:平移、旋转、缩放与复合变换实战
  • Playwright 与 Puppeteer 模拟人工操作攻克纯前端渲染页面
  • LLM 存储优化实战:解决大量 QA 与长对话问题
  • Google AI Studio 使用指南与 Gemini 开发集成
  • FPGA 比特流 (Bitstream) 深度解析
  • HarmonyOS 应用开发:ArkTS 语言基础与语法详解
  • AI 大模型时代:创业者与职场人的应用策略与职业建议
  • 六款高实用性 C# 开源项目推荐

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online