基于 FPGA 的铝片表面缺陷检测系统设计与实现
一、定位与目标
1. 业务痛点
铝带轧制现场对'零漏检、低过杀、实时性'有刚性需求;传统 AOI 无法在 1.1 fps@400×320 分辨率下同时保证 mAP≥85%。
2. 系统目标
在 Cyclone-V SoC FPGA 上实现'端到端'缺陷检测:
- 检测类:划痕、辊印、脏污、针孔 4 类缺陷
- 指标:mAP ≥ 85%,帧率 ≥ 1 fps,单帧端到端延迟 ≤ 950 ms
- 运维:一键启停、无僵尸进程、热升级模型 ≤ 30 s
二、整体架构(逻辑视图)
虚拟摄像头 → FPGA 采集 → DDR3 帧缓存 → ARM 推理 → FPGA 显示 → 虚拟 HDMI
关键约束:
- 采集与显示必须跑在 PL 侧 50 MHz 域,保证 400×320@24 bit 带宽 ≤ 120 MB/s
- 推理必须跑在 HPS 侧,借助 Paddle-Lite NNA 驱动,8-bit 量化模型 ≤ 8 MB
三、数据流与模块职责
1. 图像采集通路(DVP → DDR3)
功能:把并行的 DVP 时序转化为 Avalon-MM 突发写,支持帧缓存双缓冲。 关键技术:
- 128 bit 位宽突发,长度 48,理论峰值 300 MB/s,实际 120 MB/s 稳态
- 异步 FIFO 隔离 27 MHz 摄像头像素时钟与 50 MHz 总线时钟
- 写地址自动回卷,防止越界
2. 帧缓存管理(DDR3 环形队列)
逻辑视图:
[ 帧 N-1 ][ 帧 N ][ 帧 N+1 ]
^读出指针 ^写入指针
实现:
- 内核驱动 mmap 三段连续物理内存(每段 400×320×3 B)
- 用户态通过 ioctl 获取总线地址,配置 FPGA 寄存器
- 读写指针通过共享内存 32-bit 寄存器同步,CPU 侧使用 sync_synchronize() 保证内存序
3. 推理调度(Linux 多进程)
进程拓扑:
ssd*start.sh(顶层)
├─ ssd*transfer(I/O 进程)
└─ ssd_detection(推理进程)
同步原语:
- 共享内存寄存器 0:状态机(0=idle,1=待推理,2=推理中,3=完成)
- 寄存器 1:安全退出标志(0xDEADBEEF)
- 信号量:POSIX unnamed semaphore,用于乒乓缓冲区分时访问
状态机时序(单帧):
- transfer 把'帧 N'写入 DDR3 后,将寄存器 0 置 1
- detection 轮询到 1,置 2,读取 bmp 文件,调用 Paddle-Lite,写回结果 bmp
- detection 置 3,transfer 把结果搬运到显示缓冲区,置 0
- 任何一方读到寄存器 1 == 0xDEADBEEF,立即进入清理函数,exit(0)
4. 显示通路(DDR3 → VGA)
- 读取侧采用 64 bit 位宽,突发长度 32,保证 60 Hz 刷新无撕裂
- 支持'在线/离线'两种模式:离线时直接显示原图,在线时叠加矩形框 + 类别文本
- OSD 颜色查找表(CLUT)用 8 bit 索引,节省 BRAM(256×24 bit)


