OV5640摄像头 SDRAM帧缓存 VGA显示 Verilog Quartus

名称:OV5640摄像头 SDRAM帧缓存 VGA显示 Verilog Quartus

软件:Quartus

语言:Verilog

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

功能介绍

本工程实现OV5640摄像头图像采集、SDRAM帧缓存和VGA显示的一体化Verilog设计。摄像头通过I2C完成初始化,采集的并行图像数据转换为RGB565格式后写入外部SDRAM,再由显示通道连续读出并输出到VGA接口,适合搭建实时视频采集与显示实验平台。 顶层接口同时提供cmos_scl、cmos_sda、cmos_vsync、cmos_href、cmos_pclk和8位数据总线,支持摄像头控制与数据接收;VGA侧输出hsync、vsync、lcd_blank、lcd_dclk、lcd_sync及16位vga_data。工程包含OV5640 1024×768 RGB565配置表、SDRAM控制器、异步FIFO、视频时序、PLL和I2C主控制器等模块,便于直接阅读和二次开发。 设计采用模块化结构,采集、缓存和显示之间通过请求/应答及突发读写信号衔接,可用于学习多时钟域视频数据传输、SDRAM带宽管理和FPGA摄像头接口设计。

运行环境

开发语言为Verilog,工程使用Quartus进行编译与配置,顶层模块为top。项目包含QPF/QSF工程配置、SDC时序约束、PLL与FIFO IP文件,以及OV5640、SDRAM和VGA相关RTL源文件。目标硬件为Cyclone IV FPGA开发板,视频链路按RGB565格式组织,显示配置对应1024×768分辨率。

设计思路

系统以摄像头采集时钟、存储器时钟和视频像素时钟分域工作。OV5640通过I2C配置表完成寄存器初始化,摄像头输出的并行数据经cmos_8_16bit模块整理为16位像素数据,并由写请求生成逻辑送入帧缓存通道。工程使用RGB565格式,写入数据时对颜色位段进行重排,便于后级VGA输出使用。 帧缓存部分由frame_fifo_write、frame_fifo_read和frame_read_write协同完成,异步FIFO用于连接采集、SDRAM和显示侧的不同时钟域,sdram_core负责突发读写及存储器时序。显示侧由video_timing_data产生同步时序,在有效显示区输出缓存中的像素数据;video_pll和sys_pll分别提供视频像素时钟以及摄像头、SDRAM所需时钟。lut_ov5640_rgb565_1024_768模块提供OV5640配置参数,整体形成“摄像头采集-格式转换-帧缓存-VGA显示”的数据通路。

模块结构

顶层模块top负责时钟、摄像头、SDRAM和VGA信号的连接。i2c_config、i2c_master_top、i2c_master_byte_ctrl和i2c_master_bit_ctrl组成OV5640配置链路,lut_ov5640_rgb565_1024_768提供寄存器查找表;cmos_8_16bit与cmos_write_req_gen负责采集数据整理和写请求生成。 frame_fifo_write、frame_fifo_read和frame_read_write构成帧缓存通道,sdram_core完成外部SDRAM初始化及时序控制,afifo_16_256、afifo_16_512、afifo_8i_16o_1024和afifo_8i_32o_1024用于跨时钟域缓存。video_timing_data生成显示同步信号,color_bar和rgb_to_ycbcr提供视频处理相关模块,video_pll与sys_pll负责时钟生成。

开发板验证

工程已针对Cyclone IV FPGA开发板完成管脚约束配置,覆盖摄像头I2C与并行数据接口、SDRAM控制信号以及VGA输出信号。下载工程后可依据top.qsf中的分配关系连接OV5640摄像头、外部SDRAM和VGA显示设备进行验证。

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

此工程提供完整的RTL模块与Quartus工程文件,可据此建立仿真环境并观察摄像头采集、帧缓存读写及VGA时序信号。当前文章不附加独立仿真图片。

部分代码

以下展示顶层模块 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
	
	//vga接口
		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;
assign vga_out_hs = hs;
assign vga_out_vs = vs;
assign vga_out_r  = de == 1'b1 ? vout_data[15:11] : 5'd0;
assign vga_out_g  = de == 1'b1 ? vout_data[10:5]  : 6'd0;
assign vga_out_b  = de == 1'b1 ? vout_data[4:0]   : 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                      (                         ),
	.done                       (                         ),
	.i2c_scl                    (cmos_scl                 ),
	.i2c_sda                    (cmos_sda                 )
);
//configure look-up table
lut_ov5640_rgb565_1024_768 lut_ov5640_rgb565_1024_768_m0(
	.lut_index                  (lut_index                ),
// ... 以下代码略,完整源码请下载压缩包查看

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » OV5640摄像头 SDRAM帧缓存 VGA显示 Verilog Quartus

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

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