Sobel 实时边缘检测 Verilog Quartus

名称:Sobel 实时边缘检测 Verilog Quartus

软件:Quartus

语言:Verilog

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

功能介绍

这是一个基于 Verilog 和 Quartus 的 FPGA 实时 Sobel 边缘检测工程,使用 OV5640 摄像头采集视频图像,经过亮度提取、3×3 邻域梯度计算和阈值二值化后,通过 VGA/LCD 接口输出黑白边缘画面。系统保留图像中的轮廓和亮度突变区域,适合用于机器视觉预处理、目标轮廓提取和 FPGA 图像算法学习。 工程同时提供独立的图像仿真环境,可使用输入 BMP、HEX 转换工具和测试平台验证 Sobel 模块的处理结果,并生成输出图像文件。完整硬件工程包含摄像头 I2C 配置、RGB565 数据转换、三行缓存、SDRAM 帧缓存、视频时钟、显示时序以及异步 FIFO 等模块,便于从算法仿真扩展到开发板实时视频验证。

运行环境

开发工具:Intel Quartus,主源代码语言为 Verilog,工程同时包含用于行缓存和图像处理辅助的 VHDL 文件。硬件平台为 Cyclone IV FPGA 开发板,外接 OV5640 摄像头、SDRAM 和 VGA/LCD 显示设备。仿真部分提供 ModelSim 工程文件 test.mpf、波形文件及 tb_sobel_image.v 测试平台,并配套 img2hex、hex2bmp 工具完成 BMP 与像素 HEX 数据转换。

设计思路

本设计面向摄像头视频流的实时边缘提取,在 OV5640 VGA 显示例程基础上加入 Sobel 算法处理链路。摄像头输出的 RGB565 数据先经过 8/16 位转换和颜色空间处理,提取亮度分量后送入三行图像缓存,形成连续的 3×3 像素窗口。行缓存采用 Verilog/VHDL 逻辑实现,使每个像素都能与其上下左右邻域同步参与梯度计算。 Sobel 运算分别计算 X、Y 方向的近似梯度,并通过绝对值相加得到边缘强度。随后将结果与阈值比较,生成黑白二值化图像:边缘区域输出黑色,非边缘区域输出白色。设计中使用 PLL 产生摄像头、视频和 SDRAM 所需时钟,I2C 控制器完成 OV5640 寄存器配置,帧缓存读写模块负责跨时钟域的视频数据暂存,最终将处理结果转换为 RGB565 并输出到 VGA/LCD 接口。该结构适合学习 FPGA 视频通路、行缓存窗口和实时图像算法的硬件实现。

模块结构

顶层模块 top 负责系统时钟、摄像头接口、SDRAM 控制、Sobel 数据通路和 VGA/LCD 输出的整体连接。sys_pll 与 video_pll 分别产生摄像头/存储器时钟和视频像素时钟;i2c_config、i2c_master_top 及相关字节控制模块完成 OV5640 寄存器初始化;cmos_8_16bit、rgb_to_ycbcr 和 video_timing_data 负责采集数据整理与亮度通道生成。 图像处理部分由 sobel 和 linebuffer_Wapper 构成,行缓存提供 3×3 像素窗口,sobel 模块完成 X/Y 方向梯度、绝对值合成及阈值比较。frame_fifo_write、frame_fifo_read、frame_read_write 和 sdram_core 组成帧缓存通路,通过 SDRAM 保存和读取视频数据;异步 FIFO、PLL 和视频输出模块负责不同时钟域之间的数据衔接与显示时序。

开发板验证

工程已在 Cyclone IV FPGA 开发板上完成验证,配合 OV5640 摄像头采集视频,经 RGB 转灰度、Sobel 边缘计算和 SDRAM 帧缓存后,通过 VGA/LCD 接口输出黑白边缘图像。工程提供 top.qsf 管脚分配及时序约束文件,包含摄像头 I2C 配置、外部存储器读写、视频时钟和显示时序等完整连接,便于按对应硬件直接进行下载测试。实际使用时需将摄像头模块正确插接并连接 VGA 显示器,摄像头镜头焦距可调,调焦后能够观察到清晰的边缘视频效果。

演示视频

演示视频展示了 OV5640 摄像头采集、Sobel 实时边缘检测以及 VGA 显示输出的完整效果。运行后画面保留物体轮廓和亮度突变区域,输出为黑白边缘视频,可直观看到摄像头焦距和场景变化对检测结果的影响。

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

设计文档包含 Sobel 边缘检测原理、3×3 窗口结构、梯度计算公式、二值化处理流程、摄像头连接方式和 VGA 显示现象说明,并配有原始图片、边缘检测输出图片及仿真相关图示。仿真工程可将 input.bmp 转换为 input.hex,经过测试平台处理后生成 output.hex,再转换为 output.bmp 观察边缘提取效果。

Sobel 实时边缘检测 Verilog Quartus 设计文档图片 image1.png

Sobel 实时边缘检测 Verilog Quartus 设计文档图片 image2.png

Sobel 实时边缘检测 Verilog Quartus 设计文档图片 image3.png

Sobel 实时边缘检测 Verilog Quartus 设计文档图片 image4.png

Sobel 实时边缘检测 Verilog Quartus 设计文档图片 image5.png

Sobel 实时边缘检测 Verilog Quartus 设计文档图片 image6.png

Sobel 实时边缘检测 Verilog Quartus 设计文档图片 image7.png

部分代码

以下展示顶层模块 top 的部分代码,完整源码请下载压缩包查看。

module top(
	input                       clk,
	input                       rst_n,
	inout                       cmos_scl,          //cmos i2c clock
	inout                       cmos_sda,          //cmos i2c data
	input                       cmos_vsync,        //cmos vsync
	input                       cmos_href,         //cmos hsync refrence,data valid
	input                       cmos_pclk,         //cmos pxiel clock
	output                      cmos_xclk,         //cmos externl clock
	input   [7:0]               cmos_db,           //cmos data
	output                      cmos_rst_n,        //cmos reset
	output                      cmos_pwdn,         //cmos power down
	
		output 	 			    hsync					,
		output 	     			vsync					,
		output			        lcd_blank				,
		output			        lcd_dclk				, 
		output			        lcd_sync				, 		
		output 		 	[15:0] 	vga_data				,		
	
	output                      sdram_clk,         //sdram clock
	output                      sdram_cke,         //sdram clock enable
	output                      sdram_cs_n,        //sdram chip select
	output                      sdram_we_n,        //sdram write enable
	output                      sdram_cas_n,       //sdram column address strobe
	output                      sdram_ras_n,       //sdram row address strobe
	output[1:0]                 sdram_dqm,         //sdram data enable
	output[1:0]                 sdram_ba,          //sdram bank address
	output[12:0]                sdram_addr,        //sdram address
	inout[15:0]                 sdram_dq           //sdram data
);
wire                            video_clk;         //video pixel clock
	wire                      vga_out_hs;        //vga horizontal synchronization
	wire                      vga_out_vs;        //vga vertical synchronization
	wire[4:0]                 vga_out_r;         //vga red
	wire[5:0]                 vga_out_g;         //vga green
	wire[4:0]                 vga_out_b;         //vga blue
	
	assign  hsync					= vga_out_hs;
	assign  vsync					= vga_out_vs;
	assign   lcd_blank		   = vga_out_hs & vga_out_vs;
	assign   lcd_dclk				= ~video_clk; 
	assign   lcd_sync				= 1'b0; 		
	assign  	vga_data				= {vga_out_r,vga_out_g,vga_out_b};		

parameter MEM_DATA_BITS          = 16;             //external memory user interface data width
parameter ADDR_BITS              = 24;             //external memory user interface address width
parameter BUSRT_BITS             = 10;             //external memory user interface burst width
wire                            wr_burst_data_req;
wire                            wr_burst_finish;
wire                            rd_burst_finish;
wire                            rd_burst_req;
wire                            wr_burst_req;
wire[BUSRT_BITS - 1:0]          rd_burst_len;
wire[BUSRT_BITS - 1:0]          wr_burst_len;
wire[ADDR_BITS - 1:0]           rd_burst_addr;
wire[ADDR_BITS - 1:0]           wr_burst_addr;
wire                            rd_burst_data_valid;
wire[MEM_DATA_BITS - 1 : 0]     rd_burst_data;
wire[MEM_DATA_BITS - 1 : 0]     wr_burst_data;
wire                            read_req;
wire                            read_req_ack;
wire                            read_en;
wire[15:0]                      read_data;
wire                            write_en;
wire[15:0]                      write_data;
wire                            write_req;
wire                            write_req_ack;
wire                            ext_mem_clk;       //external memory clock

wire                            hs;
wire                            vs;
wire                            de;
wire[15:0]                      vout_data;
wire[15:0]                      cmos_16bit_data;
wire                            cmos_16bit_wr;
wire[1:0]                       write_addr_index;
wire[1:0]                       read_addr_index;
wire[9:0]                       lut_index;
wire[31:0]                      lut_data;
wire[7:0]                       ycbcr_y;
wire                            ycbcr_hs;
wire                            ycbcr_vs;
wire                            ycbcr_de;
wire                            sobel_hs;
wire                            sobel_vs;
wire                            sobel_de;
wire[7:0]                       sobel_out;
assign vga_out_hs = sobel_hs;
assign vga_out_vs = sobel_vs;
assign vga_out_r  = sobel_de == 1'b1 ? sobel_out[7:3] : 5'd0;
assign vga_out_g  = sobel_de == 1'b1 ? sobel_out[7:2] : 6'd0;
assign vga_out_b  = sobel_de == 1'b1 ? sobel_out[7:3] : 5'd0;
assign sdram_clk = ext_mem_clk;
assign cmos_rst_n = 1'b1;
assign cmos_pwdn = 1'b0;
assign write_en = cmos_16bit_wr;
assign write_data = {cmos_16bit_data[4:0],cmos_16bit_data[10:5],cmos_16bit_data[15:11]};
//generate the CMOS sensor clock and the SDRAM controller clock
sys_pll sys_pll_m0(
	.inclk0                     (clk                      ),
	.c0                         (cmos_xclk                ),
	.c1                         (ext_mem_clk              )
	);
//generate video pixel clock
video_pll video_pll_m0(
	.inclk0                     (clk                      ),
	.c0                         (video_clk                )
	);
//I2C master controller
i2c_config i2c_config_m0(
	.rst                        (~rst_n                   ),
	.clk                        (clk                      ),
	.clk_div_cnt                (16'd500                  ),
	.i2c_addr_2byte             (1'b1                     ),
	.lut_index                  (lut_index                ),
	.lut_dev_addr               (lut_data[31:24]          ),
	.lut_reg_addr               (lut_data[23:8]           ),
	.lut_reg_data               (lut_data[7:0]            ),
	.error                      (                         ),
// ... 以下代码略,完整源码请下载压缩包查看

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » Sobel 实时边缘检测 Verilog Quartus

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员