团队名称:就你手搓CPU是吧
报名编号:CICC1607
文章编号:3
我们组计划基于E203内核搭建用于手势识别任务的智能Soc,为了实现图像获取,一个完整的视频通路是必须的,在图像传感器上,我们采用了ov5640作为输入端,下面介绍一下我们的配置方法。
OV5640是一款1/4英寸单芯片图像传感器,其感光阵列达到2592*1944(即500W像素),能实现最快15fps QSXVGA(2592*1944)或者90fps VGA(640*480)分辨率的图像采集。其主要引脚如下所示:
管脚 | 作用 | 管脚 | 作用 |
---|---|---|---|
VCC3.3 | 3.3V供电 | GND | 接地 |
PCLK | 像素时钟 | PWDN | 掉电使能 |
SCL | SCCB通信时钟 | SDA | SCCB通信数据 |
VSYNC | 帧同步信号 | HREF | 行同步信号 |
RESET | 复位 | DATA[7:0] | 数据输出 |
在OV5640正常工作之前,必须先对传感器进行初始化,即通过配置寄存器使其工作在预期的工作模式,以及得到较好画质的图像。因为SCCB的写传输协议和IIC几乎相同,因此我们可以直接使用IIC的驱动程序来配置摄像头。当然这么多寄存器也并非都需要配置,很多寄存器可以采用默认的值。OV公司提供了OV5640的软件应用手册(OV5640 Software Application Note)
在实际配置过程中主要分三个模块编写,分别是I2C驱动模块,ov5650 I2C配置模块以及图像获取模块编写,配置完成后的Schematic如下图所示:
采取8位数据转16位RGB565的模式,代码如下所示:
always @(posedge cam_pclk or negedge rst_n) begin
if(!rst_n) begin
cmos_data_t <= 16'd0;
cam_data_d0 <= 8'd0;
byte_flag <= 1'b0;
end
else if(cam_href) begin
byte_flag <= ~byte_flag;
cam_data_d0 <= cam_data;
if(byte_flag)
cmos_data_t <= {cam_data_d0,cam_data};
else;
end
else begin
byte_flag <= 1'b0;
cam_data_d0 <= 8'b0;
end
end
抓取的图像效果如下所示:(640 * 480)