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 观察边缘提取效果。






部分代码
以下展示顶层模块 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
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » Sobel 实时边缘检测 Verilog Quartus