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
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » OV5640摄像头 SDRAM帧缓存 VGA显示 Verilog Quartus