基于Verilog-A的光子到达时间建模:实现激光雷达系统级协同仿真

发布时间:2026/5/27 17:29:10

基于Verilog-A的光子到达时间建模:实现激光雷达系统级协同仿真 1. 项目概述与核心价值在激光雷达LIDAR和三维感知系统的设计流程中飞行时间Time-of-Flight, TOF测量电路的性能评估一直是个痛点。传统上我们依赖晶体管级的SPICE仿真来验证单个模块比如时间数字转换器TDC或淬灭电路但这种方法在评估整个系统级性能时显得力不从心。你无法直观地看到在不同环境光照、不同目标距离下你的TDC电路到底能测得多准系统的最大探测距离和精度极限在哪里。更棘手的是光子到达本身是一个随机过程受激光脉冲、目标反射、背景光噪声、探测器效率等多重因素影响用确定性的信号源去驱动仿真结果往往过于理想与真实场景相去甚远。这正是“光子到达时间行为建模”要解决的核心问题。它本质上是一个连接光学物理世界与电路仿真世界的桥梁。我们不再需要搭建昂贵的光学实验平台来获取测试数据而是通过一个建立在Verilog-A硬件描述语言中的数学模型在电路仿真器如Cadence Spectre内部实时生成符合真实物理规律的、随机的光子到达事件。这个模型将激光功率、发散角、目标距离与反射率、光学透镜参数、环境光强度、以及SPAD探测器的填充因子和光子探测效率等十几个系统参数作为输入动态计算出激光光子和环境光子的到达速率并按照各自的统计分布高斯分布、指数分布、均匀分布生成时间戳。对我而言这个模型最大的价值在于它实现了“系统级协同仿真”。你可以把写好的TDC或TAC的晶体管级网表直接与这个行为级的SPAD光子源模型连接起来进行瞬态仿真。仿真器每一次运行都会基于你设定的距离例如7.5米和环境光条件例如10万勒克斯产生一波独一无二的光子“雨”。你的下游电路必须从这片“雨”中准确地识别出第一个返回的激光光子并完成时间测量。通过成百上千次这样的蒙特卡洛仿真循环你就能统计出测距误差的标准差、系统在不同光照下的最大作用距离、乃至评估各种抗背景光算法如时间相关单光子计数TCSPC的有效性。这相当于在流片前就对芯片在复杂真实环境下的表现有了一个量化的、可靠的预期极大地降低了设计迭代的风险和成本。2. 光子到达理论模型深度解析要实现精准的行为建模第一步是建立一个坚实的物理数学模型。这个模型的核心任务是给定一组LIDAR系统参数计算出单位时间内有多少光子会击中SPAD探测器并区分出哪些是信号激光光子哪些是噪声环境光子。2.1 激光光子到达速率建模我们从最基本的点光源模型出发。假设激光器发射功率为 (P_{source})光束在水平和垂直方向的发散角分别为 (\alpha_x) 和 (\alpha_y)。在距离 (d) 处的目标面上激光的光功率密度 (E_{source}) 可以近似为激光功率除以光束在距离d处所覆盖的立体角对应的面积。原文中公式(1)提供了一个计算式但其推导基于特定的立体角近似。一个更通用且易于理解的计算方式是先计算光束在目标处的光斑面积 (A_{spot})。对于小角度光斑近似为椭圆其面积 (A_{spot} \approx \pi (d \cdot \tan(\alpha_x/2)) (d \cdot \tan(\alpha_y/2)))。那么功率密度 (E_{source} P_{source} / A_{spot})。接下来考虑接收端。SPAD探测器位于一个光学系统之后该系统有视场角 (FoV_x) 和 (FoV_y)由透镜焦距 (f) 和像素尺寸 (L \times W) 决定公式3,4。在距离d处这个视场覆盖的面积 (A_{FoV}) 很大公式2。目标反射的光信号只有落在 (A_{FoV}) 内且被透镜收集的部分才能到达探测器。这里涉及几个关键系数目标反射率 (\rho_T) Lambertian表面假设下反射光向半球空间均匀散射。光学系统透过率 (T_o) 包括激光发射光学窗口、接收透镜、滤光片等的总透过率。接收透镜孔径面积 (A_{aperture}) 决定了收集光信号的能力(A_{aperture} \pi (D/2)^2)D为孔径直径。最终聚焦到单个SPAD像素上的激光光功率 (P_{pixel})是发射功率经过空间衰减、目标反射、二次空间衰减、透镜收集和光学损耗后的结果。一个更清晰的推导链是发射功率 → 目标处功率密度 → 被目标反射的总功率考虑反射率和照射面积→ 到达透镜孔径的功率考虑二次球面衰减和透镜接收面积占比→ 透过透镜后聚焦到像素的功率。将 (P_{pixel}) 除以单个光子的能量 (E_{photon} hc/\lambda)其中 (h) 是普朗克常数(c) 是光速(\lambda) 是激光波长就得到了理想情况下到达像素的光子速率。最后还需要乘以两个探测器本身的效率因子填充因子 (FF) 像素中光敏区域所占的面积比例。光子探测效率 (PDE) 一个入射光子实际触发雪崩的概率与波长、偏压等有关。综合以上所有因素我们得到了与原文公式(7)等效的激光光子到达速率 (R_{Laser}) 的表达式。这个公式是模型的基石它将系统级的、宏观的参数如距离、激光功率映射到了微观的、随机的光子事件速率上。注意在实际建模时需要特别注意单位的一致性。例如功率用瓦特(W)距离用米(m)波长用纳米(nm)需要转换为米普朗克常数 (h 6.626 \times 10^{-34} , J \cdot s)光速 (c 3 \times 10^8 , m/s)。一个常见的错误是单位混用导致速率计算偏差好几个数量级。2.2 环境光子到达速率建模环境光是主要的噪声来源。其建模思路与激光光子类似但有一个根本区别环境光通常被视为均匀的背景照明其强度不随目标距离变化。因此环境光在探测器像素上产生的功率密度 (E_{Amb}) 是一个常数。(E_{Amb}) 需要通过环境光的光谱功率密度 (E_{sun}(\lambda)) 和系统所使用的光学带通滤波器的透射谱来计算公式8。带通滤波器中心波长通常与激光波长 (\lambda) 对齐带宽为 (\Delta \lambda)。积分计算后得到滤波器通带内的总背景光功率密度。得到 (E_{Amb}) 后将其代入到与激光光子速率类似的公式中但注意此时没有距离平方衰减项因为背景光来自整个视场且通常假设为均匀照明。由此可以得到环境光子到达速率 (R_{Amb})公式9。(R_{Amb}) 通常与 (R_{Laser}) 处于同一数量级甚至更高在强环境光下会成为主导噪声。2.3 统计分布与时间戳生成计算出速率 (R) 后光子到达的时间间隔 (\tau) 理论上服从指数分布其均值 (\langle \tau \rangle 1/R)。这是泊松过程在时间间隔上的体现。因此在仿真中生成一连串光子事件的时间戳时对于激光光子在脉冲持续期内和环境光子在整个探测窗口内其时间间隔都应通过指数分布随机数来生成。然而对于TOF测量第一个返回的激光光子具有特殊意义。它的到达时间 (t_{first} 2d/c) 加上激光器自身的时序抖动jitter。这个抖动通常用高斯分布来建模。因此在Verilog-A模型中第一个激光光子的到达时间是一个均值为 (2d/c)、标准差为激光抖动值的高斯随机变量。3. Verilog-A行为模型实现详解理论模型建立后下一步就是将其转化为EDA仿真工具能够理解和执行的“语言”这里我们选择Verilog-A。Verilog-A是一种面向模拟和混合信号电路的行为级描述语言特别适合描述具有复杂数学关系和随机过程的模块。3.1 模块架构与接口定义首先我们需要定义一个Verilog-A模块并声明其输入输出端口以及内部参数。include disciplines.vams include constants.vams module photon_arrival_model (start, photon_detected); input start; // 仿真开始/复位触发信号 electrical start; output photon_detected; // 光子探测事件脉冲输出 electrical photon_detected; parameter real distance 7.5; // 目标距离 (m) parameter real laser_power 400; // 激光峰值功率 (W) parameter real wavelength 905e-9; // 波长 (m) // ... 其他数十个系统参数定义 parameter real laser_jitter 80e-12; // 激光抖动标准差 (s) parameter real ambient_lux 10e3; // 环境光照度 (lux)需转换为功率密度 parameter integer seed 1; // 随机数种子 real R_laser, R_amb; // 光子到达速率 real tau_laser, tau_amb; // 平均时间间隔 real t_first_laser; // 第一个激光光子到达时间 real t_next_event; // 下一个事件光子到达的时间 integer photon_type; // 事件类型0-激光1-环境端口方面通常需要一个start输入来触发一次测量循环一个photon_detected输出用来在每次光子到达时产生一个电压脉冲例如一个快速的上升沿作为下游SPAD行为模型或淬灭电路的触发信号。参数部分需要涵盖理论模型中的所有变量距离、激光参数功率、波长、发散角、脉冲宽度、抖动、光学参数焦距、孔径、透过率、目标反射率、环境光强度、SPAD像素参数面积、FF、PDE等。给这些参数设置合理的默认值方便用户在仿真时快速修改。3.2 核心算法与事件调度Verilog-A的核心优势在于其“事件驱动”的仿真机制。我们可以使用(initial_step)或(timer)等事件来控制仿真流程。模型的核心算法在一个initial_step块中实现该块在仿真开始时或特定条件下执行一次。analog begin (initial_step) begin // 1. 根据输入参数计算 R_laser 和 R_amb R_laser calculate_laser_rate(distance, laser_power, ...); R_amb calculate_ambient_rate(ambient_lux, ...); tau_laser 1.0 / R_laser; tau_amb 1.0 / R_amb; // 2. 生成第一个激光光子的到达时间高斯分布 t_first_laser 2 * distance / P_C $rdist_normal(seed, 0, laser_jitter); // 3. 初始化第一个事件 t_next_event t_first_laser; photon_type 0; // 标记为激光光子 (timer(t_next_event)) begin V(photon_detected) transition(1.0, 0, 10p); // 产生一个脉冲 // 安排下一个激光光子事件如果在脉冲宽度内 if ($abstime t_first_laser laser_pulse_width) { t_next_event $abstime $rdist_exponential(seed, tau_laser); photon_type 0; (timer(t_next_event)) ... // 递归或循环安排 } end // 4. 并行地生成环境光子事件在整个仿真窗口内 // 使用独立的随机过程生成一系列环境光子时间戳 // ... end end上述代码是一个高度简化的逻辑示意。实际实现要复杂得多需要处理好以下几个关键点多进程并发激光光子和环境光子的生成需要两个并行的“进程”。在Verilog-A中这可以通过在initial_step中安排多个独立的(timer(...))事件序列来实现模拟它们同时发生。事件队列管理我们需要维护一个“事件列表”记录每个预定光子到达的时间戳和类型。当仿真时间推进到某个事件点时触发输出脉冲并根据其类型激光/环境和当前状态决定是否以及如何生成下一个同类事件。随机数生成$rdist_normal和$rdist_exponential是Verilog-A内置的随机分布函数。使用固定的seed可以保证仿真结果可重复这对于调试至关重要。改变seed值则可以得到不同的随机序列用于蒙特卡洛分析。3.3 与商用仿真器的集成将写好的Verilog-A代码通常保存为.va文件集成到Cadence Spectre或类似仿真器中需要经过编译Compilation步骤。在Cadence Virtuoso环境中你需要将模型文件添加到仿真库的cellview中并使用spectre编译器进行编译生成一个可被网表直接调用的二进制模型。编译成功后该模型就可以像调用一个标准器件如电阻、电容、运放一样在原理图或测试平台网表中实例化。你可以将其输出端连接到你的SPAD行为模型、淬灭电路或TDC的启动信号输入端。在仿真设置中你需要进行瞬态分析Transient Analysis并设置足够长的仿真时间以覆盖整个TOF测量窗口例如100ns以及多次测量循环。实操心得在Spectre中使用Verilog-A模型进行瞬态仿真时务必注意设置合理的仿真精度errpreset和最大时间步长maxstep。因为光子到达是纳秒甚至皮秒级的事件过于宽松的步长设置可能会导致仿真器“跳过”某些快速的光子脉冲导致计数丢失。建议将maxstep设置为比最小光子间隔小一个数量级的值。4. 仿真流程与系统级验证有了可工作的光子源模型我们就可以构建一个完整的、从光子到数字码的仿真链路来验证模型的有效性和评估系统性能。4.1 构建dTOF测量系统仿真平台一个典型的直接飞行时间dTOF测量系统仿真平台包括以下几个串联的模块光子到达时间模型 本文核心提供photon_detected脉冲信号。SPAD行为模型 接收光子脉冲模拟雪崩触发过程。一个较为完善的SPAD模型应包含雪崩建立时间、淬灭延迟、死时间、暗计数率DCR和后脉冲概率。这些非理想因素会干扰真实光子的探测。淬灭与复位电路 通常由晶体管和逻辑门构成用于在SPAD雪崩后迅速降低其两端电压以淬灭雪崩并在一个可控的死时间后将其复位到盖革模式。它输出一个干净的“光子到达”数字脉冲。时间数字转换器TDC 接收淬灭电路输出的脉冲作为“开始”信号以一个全局的“停止”信号通常与激光发射同步作为参考测量两者之间的时间间隔并转换为数字码输出。TDC模型需要包含其分辨率、非线性度、量化误差等行为。在仿真中我们将这些模块的Verilog-A或晶体管级网表连接起来。每次仿真运行相当于执行一次单次测量。光子模型会基于设定的7.5米距离在约50ns2d/c附近产生第一个激光光子同时在整个100ns窗口内随机产生环境光子。下游电路链的任务就是尽力捕捉到那个“第一个激光光子”的时刻。4.2 多次循环与直方图统计单次测量受随机噪声影响很大结果不可靠。因此必须进行多次N次独立的仿真循环这对应着LIDAR系统在实际工作中的多次发射-探测循环。在每次循环中我们记录TDC输出的时间码或原始到达时间。仿真完成后我们将N次循环的数据汇集绘制光子到达时间的直方图Time Histogram。横轴是时间通常以TDC的最小分辨率如200ps为一档称为bin纵轴是落在每个时间bin内的光子事件计数。理想情况下直方图会在 ( t 2d/c ) 处出现一个明显的峰值这对应着目标反射回来的激光光子群。而环境光子则会形成一个较低且平坦的基底分布在整个时间轴上。仿真结果分析 如图6所示在300次循环、10 klux环境光下直方图在49.6 ns处出现峰值。根据 ( d c \cdot t / 2 ) 计算得到距离约为7.44米与设定的7.5米非常接近误差仅0.06米。这初步验证了模型的有效性。直方图中基底部分的光子计数就是环境光噪声的体现。4.3 性能评估与参数扫描基于这个仿真平台我们可以进行一系列系统级的性能评估这是行为建模带来的最大红利。测距精度与误差分析 改变目标距离如5m, 7.5m, 10m进行多轮蒙特卡洛仿真每轮包含数百次循环。对每一轮仿真得到的直方图峰值位置进行提取和距离换算计算其与设定距离的误差。如图7(a)所示可以绘制出不同距离下的测距误差曲线。误差可能来源于激光抖动、TDC分辨率、以及环境光噪声对第一个光子判读的干扰。环境光抗扰度 固定目标距离逐步增加环境光照度参数ambient_lux重复仿真。观察直方图峰值信噪比Peak-to-Background Ratio的变化以及测距结果的标准差Standard Deviation如何增大。如图7(b)所示当环境光从10 klux增强到50 klux时7.5米处测距的标准差从6厘米恶化到9厘米。这定量地揭示了系统在强环境光下的性能衰减。系统探测极限 不断增加目标距离d直到激光光子速率 (R_{Laser}) 低到与背景噪声 (R_{Amb}) 相当使得直方图峰值无法从基底噪声中可靠地分辨出来例如峰值计数小于基底噪声计数的3倍标准差。这个距离就是系统在当前参数下的最大探测距离。通过调整激光功率、透镜孔径等参数可以直观地看到探测距离如何变化。电路参数优化 可以快速评估下游电路参数的影响。例如TDC的分辨率从200ps提升到100ps对最终测距精度的改善有多大SPAD的死时间设置为10ns、50ns、100ns时对系统最大重复频率和计数率的影响如何这些都可以通过修改对应模块的参数并重新运行仿真来快速得到答案。注意事项 进行蒙特卡洛仿真时循环次数N需要足够大以保证统计显著性。通常对于误差分析N至少需要100次对于评估低概率事件如远距离弱信号探测可能需要上千次。这会导致仿真总时间变长。一个技巧是可以先在行为级全部用Verilog-A进行快速的大循环数仿真锁定关键参数后再将关键电路如TDC替换为晶体管级模型进行更精确的、小循环数的验证。5. 模型扩展、局限性与应用心得5.1 模型的可能扩展方向本文提出的基础模型是一个强大的起点但真实世界更复杂。在实际项目中我们可以根据需求对其进行扩展多目标与脉冲展宽 当前模型假设目标是一个点且反射瞬时完成。对于扩展目标或存在多个距离不同的目标时返回的激光脉冲会在时间上展宽。可以在模型中引入目标的反射截面和脉冲响应函数使返回的激光光子流不再是一个理想的指数分布而是与发射脉冲形状卷积后的结果。非朗伯体反射与大气衰减 目标反射率 (\rho_T) 并非总是常数它可能与入射角有关。此外对于长距离探测激光在大气中的传输衰减由雾、雨、尘引起也需要考虑可以在公式中引入一个与距离相关的大气衰减系数。SPAD非理想特性的更精细建模 将暗计数率DCR和后脉冲概率直接集成到光子源模型中。可以模拟DCR作为一个泊松过程在仿真中独立地生成暗计数事件与真实光子事件合并。后脉冲则可以建模为在每一次真光子或暗计数事件之后以一个固定的概率和延迟额外产生一个虚假光子事件。集成更复杂的读出电路模型 除了简单的TDC还可以连接更复杂的像素级电路模型例如具有抑制背景光功能的门控淬灭电路、或用于实现TCSPC技术的数字计数逻辑。5.2 模型的局限性尽管功能强大但行为模型也有其固有的局限性必须在设计过程中清醒认识精度与速度的权衡 这是一个行为级模型其精度低于器件物理级的TCAD仿真或详细的电路SPICE仿真。它无法预测晶体管级的噪声、失配或非线性效应。它的价值在于系统级快速探索和性能预估而不是替代底层仿真。计算复杂度 当需要模拟高光子速率100 MHz和长仿真时间1 μs时Verilog-A模型调度的大量离散事件会显著增加仿真计算量。对于大规模阵列仿真如128x128 SPAD阵列可能需要更高效的建模方法如使用SystemVerilog或SystemC等更高抽象级的语言进行建模再与电路仿真器协同仿真。参数校准 模型中的许多参数如PDE、光学透过率T_o需要基于实际器件或系统的测量数据进行校准。一个未经校准的模型可能给出过于乐观或悲观的结果。5.3 实际应用中的心得在几个实际芯片设计项目中应用此类模型后我总结出几点关键心得首先模型参数的准确性是第一位的。在项目初期就要尽可能地从激光器、透镜、滤光片供应商那里获取准确的数据表或者搭建简单的光学测试平台测量关键参数如实际的光斑形状、透镜的透过率曲线。一个常见的坑是低估了光学系统的实际损耗导致仿真中预测的探测距离远优于实测结果。其次仿真场景的设计比仿真本身更重要。不要只仿真“理想情况”。要系统地设计仿真矩阵最差情况弱激光、强环境光、远距离、低反射率目标、典型情况和最佳情况。这能帮你找出系统的性能边界和薄弱环节。例如我们曾通过仿真发现在特定的阳光角度下环境光噪声会激增从而针对性加强了光学滤波和数字滤波算法。最后模型要与测试环节闭环。流片后利用芯片测试数据反向修正模型参数。例如实测出芯片在标准条件下的测距误差和探测概率与仿真结果对比反过来调整模型中的“隐藏”参数如等效的系统噪声因子。经过几次迭代你的行为模型会变得越来越精确成为未来项目可靠的“数字孪生”工具极大地提升设计一次成功的概率。这个基于Verilog-A的光子到达时间行为模型不仅仅是一个仿真模块它更是一种思维方式将复杂的跨学科物理效应封装成一个可以被电路设计师直接理解和调用的“黑盒”。它让光学工程师、探测器物理学家和电路设计师第一次能在同一个语言平台仿真波形上进行高效对话共同优化一个完整的LIDAR系统。从我的经验看在项目早期引入这样的系统级建模是避免后期出现灾难性设计错误、缩短开发周期最有效的手段之一。

相关新闻