名称:运动目标检测 FPGA 设计 Verilog Quartus

软件:Quartus

语言:Verilog

开发板/平台:Cyclone IV FPGA开发板

功能介绍

本项目实现了一个基于 FPGA 的运动目标检测系统,采用 Verilog 编写,在 Quartus 环境下完成工程设计。系统面向摄像头实时图像采集与显示应用,能够对连续视频画面中的运动区域进行检测,并将检测出的目标区域以包围盒形式叠加显示到 VGA/LCD 输出画面中。 设计以摄像头输入、SDRAM 帧缓存、图像处理算法和 VGA 显示输出为主线。前端完成摄像头时钟、复位、电源控制和 I2C 配置,采集到的图像经过 RGB 到 YCbCr 的转换并提取灰度信息;中间通过 SDRAM 保存相邻两帧灰度图像;后端使用帧间差分、滤波、二值化和形态学处理得到运动区域,再进行边界定位和显示叠加。 该工程适合用于 FPGA 图像处理课程设计、毕业设计和实时视频处理实验。它不仅包含摄像头采集和 VGA 显示这类基础外设驱动,还包含 SDRAM 双帧缓存、灰度处理、帧间差分、腐蚀膨胀、目标框定位等较完整的视频算法链路,对学习硬件实时图像处理流程具有较强参考价值。

运行环境

开发语言:Verilog 开发软件:Quartus 适用方向:FPGA 图像处理、摄像头视频采集、SDRAM 帧缓存、VGA/LCD 显示、运动目标检测 工程包含 Quartus 项目文件、Verilog 源码、IP 核文件和管脚约束文件,适合在 Cyclone IV FPGA 开发板环境中编译、分配引脚并进行硬件验证。

设计思路

系统设计将硬件驱动控制与图像处理算法结合起来完成运动目标检测。摄像头采集到的图像首先进入 FPGA,经过摄像头配置、像素采集和格式处理后,将 RGB565 图像转换为 YCbCr 格式,并提取亮度分量作为灰度图像。这样可以把原本 16bit 的彩色数据压缩为 8bit 灰度数据,为后续在 SDRAM 中保存相邻两帧图像提供条件。 运动检测采用基于灰度的帧间差分思路。系统将相邻两帧灰度图像按像素对齐后进行差分并取绝对值,再与预设阈值比较,超过阈值的区域被判定为运动目标区域。为了减小噪声和孤立点对检测结果的影响,设计中加入灰度均值滤波、二值图像腐蚀/膨胀等处理模块,使运动区域轮廓更加稳定,便于后续边界定位。 SDRAM 缓存方案是本设计的关键。由于 SDRAM 数据位宽为 16bit,而灰度图像为 8bit,系统利用 SDRAM 的高低字节空间保存相邻两帧灰度图像。通过帧同步信号产生帧标志,并结合 SDRAM 的 DQM 数据掩码控制高低字节写入,可以避免两帧数据互相覆盖,同时保证读取时两帧图像具有一致的行场同步关系,方便后续差分处理。 检测到二值化运动区域后,系统通过最小包围盒相关逻辑确定目标边界,并将方框叠加到原始图像上输出。最终显示端可以同时看到摄像头画面和运动目标标记结果,适合学习 FPGA 视频采集、SDRAM 帧缓存、实时图像处理流水线以及 VGA 显示控制的完整实现方法。

模块结构

顶层模块为 `sdram_vga`,负责连接系统时钟复位、摄像头接口、I2C 配置接口、VGA/LCD 显示接口和 SDRAM 存储接口,并调度各个功能模块完成完整的视频处理流程。 主要模块包括:`pll` 用于产生系统所需的多路工作时钟;`CMOS_Capture_RGB565` 负责摄像头像素采集;`reg_config`、`i2c_com`、`i2c_timing_ctrl`、`power_on_delay` 用于摄像头初始化配置;`VIP_RGB888_YCbCr444` 完成颜色空间转换;`sdram_top`、`sdram_init`、`sdram_aref`、`sdram_write`、`sdram_read`、`auto_read_write` 构成 SDRAM 初始化、刷新、读写与缓存控制逻辑;`VIP_Gray_Mean_Filter`、`VIP_Bit_Erosion_Detector`、`VIP_Bit_Dilation_Detector`、`VIP_Matrix_Generate_3X3_1Bit`、`VIP_Matrix_Generate_5X5_1Bit`、`VIP_Matrix_Generate_7X7_1Bit`、`VIP_Matrix_Generate_9X9_1Bit` 用于图像滤波、窗口生成和形态学处理;`position` 用于目标位置/边界相关处理;`vga_driver` 负责显示时序和图像输出。

开发板验证

本设计支持在 Cyclone IV FPGA 开发板上进行验证,工程中包含对应的 Quartus 管脚约束与分配文件,可用于连接摄像头、SDRAM、VGA/LCD 显示接口以及 I2C 配置接口等外设信号。实际验证重点包括摄像头图像采集、SDRAM 双帧缓存读写、VGA 图像输出以及运动目标包围盒叠加显示。 开发板运行时,系统通过摄像头输入连续视频图像,经过 FPGA 内部灰度转换、帧间差分、滤波、形态学处理和目标定位后,将检测结果叠加到原始图像并输出到显示端。该验证方式能够直观看到运动区域检测与方框标记效果,适合作为图像处理、视频采集显示和 SDRAM 控制类 FPGA 项目的实物参考。

演示视频

配套演示视频为“运动目标检测代码讲解.MP4”,内容围绕运动目标检测工程代码进行讲解,便于理解顶层接口、摄像头输入、SDRAM 缓存、图像处理流水线和 VGA 显示输出之间的关系。

 

演示视频请关注公众号后获取对应资料查看。

 

仿真图/仿真说明/设计文档图片

设计文档包含运动目标检测系统整体框架、图像处理算法及硬件驱动说明、SDRAM 双帧存储方案、DQM 掩码控制关系、基于灰度的帧间差分法原理以及 Matlab 仿真示意图等内容。文档图片可辅助理解相邻帧存储方式、灰度差分流程和运动区域提取过程。

 

 

 

 

 

 

 

 

 

 

部分代码

以下展示顶层模块 sdram_vga 的部分代码,完整代码可关注下方公众号卡片获取。

module	sdram_vga(
        // system signals
        input                   s_clk                   ,
//		input                   clk                     ,
        input                   rst_n                   ,
		//input			[7:0]		GRAY_THRESHOLD			,
		//ov7725 interfaces
		input						cmos_pclk				,			
		output					cmos_xclk				,			
		input						cmos_vsync				,			
		input						cmos_href				,	
		output					camera_reset			,
		output					camera_pwnd				,
		input			[7:0]		cmos_data				,	
		//uart_Byte_Rx
		//input						rs232_rx					,
		//iic interfaces
		output					i2c_sclk				,
        inout					i2c_sdat				,

		//	VGA	Interface
		output 	 			    hsync					,
		output 	     			vsync					,
		output			        lcd_blank				,
		output			        lcd_dclk				, 
		output			        lcd_sync				, 		
		output 		 	[15:0] 	vga_data				,				
        // 	SDRAM Interfaces
        output  wire            sdram_clk               ,
        output  wire            sdram_cke               ,
        output  wire            sdram_cs_n              ,
        output  wire            sdram_cas_n             ,
        output  wire            sdram_ras_n             ,
        output  wire            sdram_we_n              ,
        output  wire    [ 1:0]  sdram_bank              ,
        output  wire    [12:0]  sdram_addr              ,
        output  wire    [ 1:0]  sdram_dqm              	,
        inout           [15:0]  sdram_dq    
);

parameter  GRAY_THRESHOLD = 150 ;

//pll
wire	clk_24m  ;
wire	clk_25m  ;
wire	clk_50m  ;
wire	clk_100m ;

//ov5640 config data
wire	[7:0]	LUT_INDEX 	  ;	
wire	[15:0]	LUT_DATA  	  ;	
wire	[7:0]	LUT_SIZE  	  ;  

//IIC
wire			i2c_config_done;

//ov7725
wire			cmos_frame_vsync;	
wire			cmos_frame_href	;
wire			cmos_frame_clken;	
wire	[15:0]	cmos_frame_data	;
wire	[15:0]	cmos_mask_data	;
wire	[15:0]	cmos_data_Ycbcr;

//sdram
wire			wfifo_wr_clk  ;
wire			wfifo_wr_en	  ;
wire	[15:0]	wfifo_wr_data ;
wire			wfifo_rd_clk  ;
wire			rfifo_rd_en	  ;
wire	[15:0]	rfifo_rd_data ;
wire			flag_rd_ready ;
wire			img_data_req  ;
wire			flag_init_end ;

//VIP
wire [15:0] 	vga_cmos_data ;
wire			per_frame_vsync	;
wire			per_frame_href	;
wire			per_frame_clken ;

//rx
wire  	   rx_done ;
wire	[7:0]	data_byte;

wire post_frame_clken_Ycbcr;
wire initial_en;

wire cmos_frame_vsync_Ycbcr;
wire cmos_frame_href_Ycbcr;
wire cmos_frame_clken_Ycbcr;

wire per_frame_vsync_Erosion;
wire per_frame_href_Erosion;
wire per_frame_clken_Erosion;

wire post_frame_vsync_Erosion;
wire post_frame_href_Erosion;
wire post_frame_clken_Erosion;

wire vga_bit;
wire vidon;
//for sdram test
//reg 	[15:0]	cmos_frame_data_test	  ;
//reg	[10:0]		change ;
//always@(posedge clk_25m or  negedge rst_n)
//begin
//	if(!rst_n)
//		cmos_frame_data_test <= 'd0 ;
//
//	else if(change <= 300)
//		cmos_frame_data_test <= 16'B11111_000000_00000 ;
//	else if(change <= 550)
//		cmos_frame_data_test <= 16'B00000_111111_00000 ;	
//	else if(change <= 800)
//		cmos_frame_data_test <= 16'B00000_000000_11111 ;
//	else
//		cmos_frame_data_test <= 16'B11111_11111_11111 ;	
//end   

// ... 以下代码略,完整源码请下载压缩包查看

代码获取:下方公众号
“FPGA代码设计学习资料”

 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐