1. 项目概述:FPGA运动目标检测系统设计
去年用正点原子达芬奇开发板做智能监控项目时,发现市面上的运动检测方案要么延迟高,要么成本离谱。于是基于FPGA搞了套硬件加速方案,实测720P视频下处理延迟<100ms,成本不到300元。核心是用帧差法+形态学处理实现实时运动目标检测,再通过HDMI输出带标记框的视频流。
整套系统硬件采用达芬奇开发板(Xilinx Artix-7 FPGA)搭配OV5640摄像头模块,软件开发环境为Vivado 2020.1+Quartus Prime 18.1。特别适合需要低延迟视频分析的场景,比如智能门禁、工业质检等。下面从硬件选型到算法实现详细拆解开发过程。
2. 硬件架构设计要点
2.1 核心硬件选型解析
达芬奇开发板选用的是XC7A35T-2FGG484I芯片,逻辑单元33,280个,足够跑通整个图像处理流水线。选型时重点考虑三点:
- 内置Block RAM容量(1,800Kb)要能缓存至少两帧720P图像
- DSP Slice数量(90个)满足乘加运算需求
- 支持HDMI TX原生IP核
OV5640摄像头模块选500万像素版本主要考虑:
- 支持RGB565输出格式(省去YUV转换环节)
- 可编程帧率(实测30fps时功耗最低)
- 自带自动曝光/白平衡(减少FPGA计算负担)
2.2 硬件连接方案
摄像头与FPGA的硬件连接有三大关键点:
- I2C配置接口必须加上拉电阻(4.7KΩ)
- 像素时钟线要做等长布线(±50ps偏差)
- VSYNC/HSYNC信号需经过施密特触发器消抖
具体引脚分配建议:
verilog复制set_property PACKAGE_PIN R15 [get_ports cam_pclk]
set_property IOSTANDARD LVCMOS33 [get_ports cam_pclk]
set_property PULLUP true [get_ports cam_scl]
3. 软件实现全流程
3.1 Vivado工程搭建
创建工程时容易踩的坑:
- 必须选择正确的器件型号(xc7a35tfg484-2)
- 建议勾选"Project is an extensible Vitis platform"
- IP核配置要开启AXI Stream接口
关键IP核配置参数:
-
Clocking Wizard:
- 输入时钟50MHz
- 输出clk_pixel=148.5MHz(HDMI基准)
- 输出clk_5x=742.5MHz(TMDS编码)
-
Video Processing Subsystem:
- 颜色空间转换选RGB2YUV
- 开启帧缓存双缓冲
- 设置最大分辨率1280x720
3.2 运动检测算法实现
3.2.1 帧差法核心代码
verilog复制// 双帧缓存模块
blk_mem_gen_0 frame_buffer (
.clka(video_clk),
.wea(frame_wr_en),
.addra(wr_addr),
.dina(pixel_in),
.clkb(video_clk),
.addb(rd_addr),
.doutb(pixel_out)
);
// 差分计算
always @(posedge video_clk) begin
diff <= (current_y > prev_y) ?
(current_y - prev_y) :
(prev_y - current_y);
motion <= (diff > THRESHOLD) ? 1'b1 : 1'b0;
end
注意:阈值THRESHOLD建议做成AXI寄存器可调,实测值范围15-30(8bit灰度)
3.2.2 形态学处理优化
腐蚀/膨胀运算采用3x3窗口处理,用移位寄存器实现行缓存:
verilog复制reg [7:0] line_buf [0:2][0:1023];
always @(posedge clk) begin
// 行移位
for(int i=0; i<2; i++)
line_buf[i] <= line_buf[i+1];
line_buf[2] <= {line_buf[2][1:1023], pixel_in};
// 3x3窗口生成
window[0] <= {line_buf[0][col], line_buf[0][col+1], line_buf[0][col+2]};
window[1] <= {line_buf[1][col], line_buf[1][col+1], line_buf[1][col+2]};
window[2] <= {line_buf[2][col], line_buf[2][col+1], line_buf[2][col+2]};
end
3.3 HDMI输出实现
关键配置步骤:
- 生成148.5MHz像素时钟(720p@60Hz)
- 实例化Xilinx的HDMI TX IP核
- 配置EDID信息(分辨率/刷新率)
- 添加时序约束:
tcl复制set_property HD.TANDEM_VIDEO_FORMAT 720p [get_ports HDMI_CLK_P]
常见问题排查:
- 无图像输出:检查CLK_P/N是否反接
- 颜色异常:交换RGB通道顺序
- 图像撕裂:调整PLL相位偏移
4. 调试经验与性能优化
4.1 资源占用优化技巧
-
BRAM节省方案:
- 改用YUV420格式(节省50%存储)
- 共享行缓存(腐蚀/膨胀共用)
-
DSP高效利用:
- 合并乘加运算(用MAC指令)
- 采用移位代替除法
-
最终资源报告:
code复制Slice LUTs: 12456/20800(59%)
Slice Registers: 8765/41600(21%)
Block RAM: 38/50(76%)
DSP48E1: 32/90(35%)
4.2 时序收敛方法
-
关键路径分析:
- 帧差计算路径(3.2ns)
- 形态学处理路径(4.1ns)
-
优化手段:
verilog复制(* use_dsp48 = "yes" *) reg [15:0] diff; // 强制使用DSP单元
(* keep = "true" *) wire [7:0] window [0:2][0:2]; // 保持层次结构
- 约束示例:
tcl复制set_max_delay -from [get_pins diff_reg/D] -to [get_pins motion_reg/D] 5ns
5. 实测效果与改进方向
在720P@30fps输入下:
- 端到端延迟:2.8帧(约93ms)
- 功耗:2.1W(室温25℃)
- 检测灵敏度:可识别0.5m²以上的运动物体
待改进点:
- 动态背景建模(应对光照变化)
- 多目标跟踪(添加ID标记)
- 神经网络加速(集成Vitis AI)
实际部署时发现,摄像头安装角度对检测效果影响很大。建议:
- 俯仰角控制在30°-45°
- 避免逆光安装
- 保持与被测物体距离1.5-3米
这个方案最大的优势是纯硬件实现,比树莓派方案快5-8倍。有次客户现场测试,用来看守仓库货物移动,连续运行3个月没出过故障。后续准备把配置界面做成网页版,通过以太网远程控制阈值参数。
