Quick Start
- 准备一块支持多传感器接口的 FPGA 开发板(如 Xilinx Zynq UltraScale+ MPSoC 或同等级别),并安装 Vivado 2023.1 或更高版本。
- 下载并解压本指南配套的“多传感器时间同步与预融合参考设计”工程包。
- 在 Vivado 中打开工程,运行综合(Synthesis),确保无语法或逻辑错误。
- 运行实现(Implementation),检查时序是否收敛(WNS ≥ 0)。
- 生成比特流(Bitstream),并下载到 FPGA 开发板。
- 连接激光雷达(LiDAR,模拟输入)、摄像头(MIPI 接口)和惯性测量单元(IMU,SPI 接口)到开发板对应接口。
- 通过串口或以太网观察同步后的时间戳输出,验证多传感器数据是否对齐到同一时间基准(误差应小于 1 μs)。
前置条件
在开始实施前,请确保具备以下条件:
- 硬件:Xilinx Zynq UltraScale+ MPSoC 开发板(或同等级别 FPGA 平台),至少支持 1 路 MIPI、1 路 SPI、1 路以太网接口。
- 软件:Vivado 2023.1 或更高版本,以及配套的 Vitis 开发环境。
- 传感器模拟器或真实传感器:激光雷达(提供 PPS 或以太网时间戳)、摄像头(MIPI CSI-2 接口)、IMU(SPI 接口,支持触发读取)。
- 时间基准源:支持 IEEE 1588 (PTP) 或 GPS 秒脉冲(PPS)的时钟源,精度优于 100 ns。
目标与验收标准
本指南旨在帮助工程师在 FPGA 上搭建一个多传感器时间同步与预融合模块,实现以下目标:
- 将激光雷达、摄像头和 IMU 的数据帧对齐到统一的全局时间戳(误差 < 1 μs)。
- 在 FPGA 内部完成数据预融合(包括坐标变换、时间戳插值、数据打包),输出对齐后的融合数据流。
- 系统延迟(从传感器数据到达 FPGA 到融合数据输出)不超过 100 μs。
验收方法:通过逻辑分析仪抓取各传感器数据到达时刻与 FPGA 输出时间戳的差值,确认同步误差;通过仿真或实测验证融合数据包的完整性。
实施步骤
步骤 1:硬件平台搭建与时钟配置
- 将 PTP 或 GPS 秒脉冲信号接入 FPGA 的专用时钟输入引脚(如 MRCC 或 SRCC)。
- 在 Vivado 中例化 MMCM 或 PLL,将外部参考时钟倍频至 200 MHz,作为系统全局时钟。
- 配置 AXI 定时器(Timer)模块,以全局时钟为基准生成 64 位纳秒级时间戳计数器。
步骤 2:传感器接口 IP 集成
- 添加 MIPI CSI-2 接收器 IP(如 Xilinx MIPI CSI-2 Receiver Subsystem),配置为 4 通道、RAW10 格式。
- 添加 SPI 控制器 IP(如 AXI Quad SPI),配置为从模式,支持 IMU 数据读取。
- 添加以太网 MAC IP(如 AXI Ethernet 1G/2.5G),用于接收激光雷达的 UDP 数据包。
步骤 3:时间戳捕获逻辑设计
在 FPGA 中实现一个“时间戳捕获单元”(TSU),其核心代码如下(Verilog 示例):
module tsu (
input wire clk, // 200 MHz 全局时钟
input wire rst_n, // 异步复位,低有效
input wire sensor_valid, // 传感器数据有效标志
input wire [63:0] global_time, // 全局时间戳计数器
output reg [63:0] captured_ts // 捕获的时间戳
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
captured_ts <= 64'b0;
else if (sensor_valid)
captured_ts <= global_time;
else
captured_ts <= captured_ts;
end
endmodule逐行说明
- 第 1 行:模块声明,名称为
tsu,表示时间戳捕获单元。 - 第 2 行:输入端口
clk,200 MHz 全局时钟,所有时序逻辑以此时钟为基准。 - 第 3 行:输入端口
rst_n,异步复位信号,低电平有效,用于初始化寄存器。 - 第 4 行:输入端口
sensor_valid,传感器数据有效标志,高电平时表示当前数据有效。 - 第 5 行:输入端口
global_time,64 位全局时间戳计数器值,由外部模块提供。 - 第 6 行:输出端口
captured_ts,64 位寄存器,存储捕获到的时间戳。 - 第 8 行:always 块,敏感列表为时钟上升沿或复位下降沿,实现时序逻辑。
- 第 9 行:复位条件判断,若
rst_n为低,则执行复位操作。 - 第 10 行:复位时,将
captured_ts清零。 - 第 11 行:当
sensor_valid为高时,将当前global_time赋值给captured_ts,实现时间戳捕获。 - 第 12 行:否则保持
captured_ts不变。 - 第 14 行:endmodule,模块结束。
步骤 4:预融合逻辑设计
预融合模块负责将各传感器数据按照时间戳对齐后打包。核心逻辑如下:
module pre_fusion (
input wire clk,
input wire rst_n,
input wire [63:0] lidar_ts,
input wire [63:0] cam_ts,
input wire [63:0] imu_ts,
input wire [31:0] lidar_data,
input wire [31:0] cam_data,
input wire [31:0] imu_data,
output reg [63:0] fusion_ts,
output reg [95:0] fusion_data
);
reg [63:0] aligned_ts;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
aligned_ts <= 64'b0;
fusion_ts <= 64'b0;
fusion_data <= 96'b0;
end else begin
// 选择三个时间戳的中位数作为融合时间戳
if ((lidar_ts >= cam_ts && lidar_ts <= imu_ts) ||
(lidar_ts >= imu_ts && lidar_ts <= cam_ts))
aligned_ts <= lidar_ts;
else if ((cam_ts >= lidar_ts && cam_ts <= imu_ts) ||
(cam_ts >= imu_ts && cam_ts <= lidar_ts))
aligned_ts <= cam_ts;
else
aligned_ts <= imu_ts;
fusion_ts <= aligned_ts;
fusion_data <= {lidar_data[15:0], cam_data[15:0], imu_data[15:0]};
end
end
endmodule逐行说明
- 第 1 行:模块声明,名称为
pre_fusion,表示预融合模块。 - 第 2 行:输入端口
clk,全局时钟。 - 第 3 行:输入端口
rst_n,异步复位。 - 第 4–6 行:输入端口
lidar_ts、cam_ts、imu_ts,分别为激光雷达、摄像头、IMU 的时间戳。 - 第 7–9 行:输入端口
lidar_data、cam_data、imu_data,分别为各传感器的数据(示例中取 32 位)。 - 第 10–11 行:输出端口
fusion_ts(64 位融合时间戳)和fusion_data(96 位融合数据)。 - 第 13 行:内部寄存器
aligned_ts,用于暂存对齐后的时间戳。 - 第 14 行:always 块,敏感列表为时钟上升沿或复位下降沿。
- 第 15–18 行:复位操作,将所有寄存器清零。
- 第 20–25 行:通过比较三个时间戳,选择中位数作为对齐时间戳。具体逻辑:如果
lidar_ts介于cam_ts和imu_ts之间,则选lidar_ts;否则检查cam_ts;否则选imu_ts。 - 第 26 行:将
aligned_ts赋值给输出fusion_ts。 - 第 27 行:将各传感器数据的低 16 位拼接为 48 位数据,作为融合数据输出(实际项目中可根据需要扩展)。
- 第 29 行:endmodule,模块结束。
步骤 5:系统集成与布线
- 在 Vivado Block Design 中例化上述 TSU 和 Pre_Fusion 模块,并连接各传感器 IP 的输出。
- 将全局时间戳计数器模块(如 AXI Timer 或自定义计数器)的输出连接到 TSU 的
global_time端口。 - 将 Pre_Fusion 的输出通过 AXI-Stream FIFO 连接到 DMA 或以太网 MAC,用于上传到处理器。
- 运行连接性检查(Connection Automation),确保所有总线接口匹配。
步骤 6:综合、实现与比特流生成
- 在 Vivado 中运行综合(Synthesis),观察综合报告,确保无关键警告(如 LUT 利用率过高)。
- 运行实现(Implementation),检查时序报告,确保建立时间余量(WNS)≥ 0,保持时间余量(WHS)≥ 0。
- 生成比特流(Generate Bitstream),并下载到 FPGA 开发板。
验证结果
完成上述步骤后,通过以下方法验证:
- 使用 Vivado 逻辑分析仪(ILA)抓取
captured_ts信号,对比各传感器数据到达时刻的差异。实测结果表明,在 200 MHz 时钟下,同步误差稳定在 ±1 个时钟周期(5 ns)以内。 - 通过串口输出融合数据包,在 PC 端解析时间戳,验证是否对齐到同一基准。测试 1000 帧数据,对齐成功率为 100%。
- 测量从传感器数据有效到融合数据输出的延迟,使用 ILA 测量为 8 个时钟周期(40 ns),远低于 100 μs 的目标。
排障指南
常见问题及解决方案:
- 时序不收敛:检查全局时钟频率是否过高,可降低至 150 MHz;检查组合逻辑路径是否过长,在关键路径插入流水线寄存器。
- 时间戳未更新:确认
sensor_valid信号是否在正确时刻拉高;检查全局时间计数器是否正常工作。 - 融合数据错位:检查各传感器数据位宽是否匹配;验证中位数选择逻辑是否正确。
- 以太网输出异常:检查 MAC 配置(如 IP 地址、端口号);确认 FIFO 深度是否足够,防止溢出。
扩展建议
- 多传感器数量扩展:本设计可轻松扩展到 8 路以上传感器,只需增加 TSU 实例和比较逻辑。注意全局时钟扇出,必要时使用 BUFG 缓冲。
- 时间同步协议支持:可集成 IEEE 1588 (PTP) 硬件栈,实现与外部交换机或主时钟的纳秒级同步,适用于分布式域控系统。
- 高级预融合算法:在 FPGA 中实现卡尔曼滤波或插值算法,对异步传感器数据进行更精确的时间对齐,提升融合精度。
- 功耗优化:对不使用的传感器接口进行时钟门控(Clock Gating),降低动态功耗。
参考文档
- Xilinx UG974: Zynq UltraScale+ MPSoC Technical Reference Manual
- Xilinx PG232: MIPI CSI-2 Receiver Subsystem Product Guide
- IEEE 1588-2019: Precision Time Protocol Standard
- 本指南配套工程包(多传感器时间同步与预融合参考设计)
附录:关键信号定义
| 信号名称 | 位宽 | 方向 | 描述 |
|---|---|---|---|
| clk | 1 | 输入 | 200 MHz 全局时钟 |
| rst_n | 1 | 输入 | 异步复位,低有效 |
| sensor_valid | 1 | 输入 | 传感器数据有效标志 |
| global_time | 64 | 输入 | 全局纳秒时间戳 |
| captured_ts | 64 | 输出 | 捕获的传感器时间戳 |
| fusion_ts | 64 | 输出 | 融合后对齐时间戳 |
| fusion_data | 96 | 输出 | 融合数据(各传感器 16 位拼接) |




