简介:
OV5640的功能框架如图:

增益放大器(AMP)以及ISP等可以通过寄存器(registers)来配置,配置寄存器的接口就是SCCB接口,该接口协议兼容IIC协议。
SCCB (Serial Camera Control Bus)串行摄像头控制总线。该总线控制着摄像头大部分的功能,包括图像数据格式、分辨率以及图像处理参数等。
输出图像参数设置
ISP (Image Signal Process)输入窗口设置、预缩放窗口设置、输出大小窗口设置
输出像素格式
YUV(亮度参量与色彩参量分开表示的像素格式)、RGB(包括RGB888、RGB565、RGB555)以及RAW(原始图像数据)
输出帧率
QSXGA:25921944@15fps
QVGA:320240@120fps
图像输出时序
(1)PCLK:像素时钟,一个PCLK时钟输出一个或者半个像素(像素数据的高8位或低8位);
(2)HREF/HSYNC:行同步信号,由摄像头输出,用于标志一行数据的开始与结束。当HREF为高电平时,图像输出有效。(HREF上升沿马上输出数据,HSYNC等待一段时间再输出图像数据)
(3)VSYNC:场同步信号,由摄像头输出,标志着一帧数据的开始与结束。
(4)D[9:0]:像素数据,由摄像头输出,在RGB565格式中只有高8位D[9:2]是有效的。
(5)tp:一个像素点的周期,在RGB565和YUV422中,tp=2*tPCLK;在RAW中,tp=tPCLK。OV5640一个时钟周期只能传输8bit数据,而RGB565采用16bit数据表示一个像素点。因此需要两个时钟周期才能输出一个RGB565像素数据,第一次输出的数据为RGB565的高8位,第二次输出的数据为RGB565的低8位。

帧时序
VSYNC的上升沿作为一帧的开始,HREF拉高开始输出有效数据。
OV5640采集的Verilog代码
module ov5640_capture_data(input rst_n , //复位信号//摄像头接口input cam_pclk , //cam 数据像素时钟input cam_vsync , //cam 场同步信号input cam_href , //cam 行同步信号input [7:0] cam_data , //cam 数据output cam_rst_n , //cmos 复位信号,低电平有效output cam_pwdn , //电源休眠模式选择//RGB888接口output cmos_frame_clk, //时钟信号output cmos_frame_ce, //时钟使能信号output cmos_frame_vsync, //帧有效信号output cmos_active_video ,//数据有效output [23:0] cmos_frame_data //有效数据
);//parameter define//寄存器全部配置完成后,先等待10帧数据
//待寄存器配置生效后再开始采集图像
localparam WAIT_FRAME = 4'd10 ; //寄存器数据稳定等待的帧个数//reg define
reg rst_n_d0 =1;
reg rst_n_syn =1;
reg cam_vsync_d0 ;
reg cam_vsync_d1 ;
reg cam_href_d0 ;
reg cam_href_d1 ;
reg [3:0] cmos_ps_cnt ; //等待帧数稳定计数器
reg wait_done ;
reg byte_flag ;
reg [7:0] cam_data_d0 ;
reg [15:0] cmos_data_16b ; //用于8位转16位的临时寄存器
reg byte_flag_d0 ;//wire define
wire pos_vsync ;//*****************************************************
//** main code
//*****************************************************//采输入场同步信号的上升沿
assign pos_vsync = (~cam_vsync_d1) & cam_vsync_d0 ;//不对摄像头硬件复位,固定高电平
assign cam_rst_n = 1'b1;//电源休眠模式选择 0:正常模式 1:电源休眠模式
assign cam_pwdn = 1'b0;assign cmos_frame_clk = cam_pclk;
//由于摄像头输入接口的两个时钟周期对应于RGB888输出接口的一个有效时钟周期
//所以要给出数据有效标志即RGB888输出接口的时钟使能信号
assign cmos_frame_ce = wait_done ? (byte_flag_d0 & cmos_active_video) || (!cmos_active_video) : 1'b0;
assign cmos_frame_vsync = wait_done ? cam_vsync_d1 : 1'b0; //输出帧有效信号
assign cmos_active_video = wait_done ? cam_href_d1 : 1'b0; //输出行有效信号
assign cmos_frame_data = wait_done ?{ cmos_data_16b[15:11],3'd0 , cmos_data_16b[10:5],2'd0 , cmos_data_16b[4:0],3'd0 }: 24'd0; //输出数据//复位信号的异步复位、同步释放处理
always @(posedge cam_pclk or negedge rst_n) beginif(!rst_n) beginrst_n_d0 <= 1'b0;rst_n_syn <= 1'b0;endelse beginrst_n_d0 <= 1'b1;rst_n_syn <= rst_n_d0;end
end//对行、场同步信号的延迟打拍
always @(posedge cam_pclk or negedge rst_n_syn) beginif(!rst_n_syn) begincam_vsync_d0 <= 1'b0;cam_vsync_d1 <= 1'b0;cam_href_d0 <= 1'b0;cam_href_d1 <= 1'b0;endelse begincam_vsync_d0 <= cam_vsync;cam_vsync_d1 <= cam_vsync_d0;cam_href_d0 <= cam_href;cam_href_d1 <= cam_href_d0;end
end//寄存器全部配置完成后,先等待10帧数据
//待寄存器配置生效后再开始采集图像
always @(posedge cam_pclk or negedge rst_n_syn) beginif(!rst_n_syn)cmos_ps_cnt <= 4'd0;else if(pos_vsync && (cmos_ps_cnt < WAIT_FRAME))cmos_ps_cnt <= cmos_ps_cnt + 4'd1; //对帧数进行计数
end//等待完成后 给出 等待完成信号
always @(posedge cam_pclk or negedge rst_n_syn) beginif(!rst_n_syn)wait_done <= 1'b0;else if((cmos_ps_cnt == WAIT_FRAME) && pos_vsync)wait_done <= 1'b1;
end//8位数据转16位RGB565数据
always @(posedge cam_pclk or negedge rst_n_syn) beginif(!rst_n_syn) begincmos_data_16b <= 16'd0;cam_data_d0 <= 8'd0;byte_flag <= 1'b0;endelse if( cam_href ) begin //cam 行同步信号byte_flag <= ~byte_flag;cam_data_d0 <= cam_data;if(byte_flag)cmos_data_16b <= {cam_data_d0,cam_data};endelse beginbyte_flag <= 1'b0;cam_data_d0 <= 8'b0;end
endalways @(posedge cam_pclk or negedge rst_n_syn) beginif(!rst_n_syn)byte_flag_d0 <= 1'b0;elsebyte_flag_d0 <= byte_flag;
endendmodule