图像采集处理基础实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图像采集处理基础实验
班级:14060242 学号:1406024248 姓名:张新雨
一、实验目的
1、了解摄像头OV9655的功能及其接口的设计方法;
2、用硬件描述语言编程实现OV9655接口电路,能够实时采集图像数据;
3、能够识别特定的黑白图像块,并通过LED的亮、灭进行表示。
二、实验器材
1、台式计算机 1台;
2、可编程逻辑器件实验软件1套;
3、可编程逻辑器件开发套件1套;
4、OV9655转接板1套。
三、实验说明
1、台式计算机用于向可编程逻辑逻辑器件实验软件提供编程、仿真及下载
平台;
2、可编程逻辑器件实验软件硬件描述语言的编程、仿真及下载提供平台;
3、可编程逻辑器件开发套件为本实验提供硬件平台;
4、OV9655转接板用于OV9655与开发套件的连接。
四、实验原理
1、OV9655作为一种高分辨率摄像头,具有如下特性:
1)工作电压低,灵敏度高,轻便易携;
2)支持标准的SCCB接口;
3)支持输出RGB、YUV、YCbCr格式数据;
4)支持多种分辨率,包括SXGA(1280×1024)、VGA(640×480)等;
5)支持多种自动图像控制功能,包括自动曝光控制、自动增益控制,自动白平衡等;
6)支持视频缩放等。
2、 OV9655主要引脚说明:
1)PWDN:掉电模式选择引脚;
2)RESETB:复位引脚;
3)PCLK:像素时钟输出引脚;
4)XVCLK1:系统时钟引脚;
5)HREF:行同步信号;
6)VSYNC:场同步信号;
7)SIO_C:SCCB接口时钟信号;
8)SIO_D:SCCB接口数据信号;
9)D[7:0]:像素点数据信号。
3、OV9655操作说明:
在摄像头正常工作之前,必须配置好相应的寄存器才能使摄像头完成指定的功能,如配置摄像头的像素输出时钟、自动控制功能等。通过标准的SCCB时序就能配置,SCCB时序图如图1所示。
图1
此次实验中,将摄像头的输出信号配置成RGB565格式信号,其数据输出时序图如图2所示,图中为一行像素数据的时序,再配合场同步信号就能读取摄像头的输出信号,场同步信号在数据有效时地变低,在一帧数据结束后变高。
图2
由于RGB565格式数据有十六位,而当OV9655的输出信号配置成RGB565格式时的数据位为8为,所以每个像素点的数据需要两个时钟信号才能读取完成,
一个数据两个字节的数据格式如图3所示。
图3
由于此实验中图像的色彩比较单一,仅需要判断黑白色即可,具体的操作方法是判断每一帧数据的前部分像素值,为了进一步准确的判断黑白色,设定一个黑色像素点计数器和一个白色像素点的计数器,当判定一个像素点为黑色时,则黑色像素点计数器加一,反之则白色像素点计数器加一。判断像素点是黑色还是白色的操作方法是提取出一个像素点数据的R、G、B分量,分别与特定值比较,然后通过特定的关系式做出判断。最后,如果黑色像素点计数器的值大于白色像素点计数器的值,则判定为黑色,且用LED灯做出相应指示,反之亦然。
五、实验内容和步骤
1、新建工程:打开ISE软件,点击File菜单栏下的New Project菜单,弹出新建工程对话框,如图4所示。在此对话框中设定工程名、工程存储地址,在Top-level source type菜单栏下选择HDL。单击Next,弹出下一步对话框,在此对话框中设定好芯片、综合工具、仿真工具、编程语言,如图5所示。然后单击Next,再单击Finish。
2、建立I2C接口时序文件:右键点击文件管理框,如图6所示。单击New source,弹出New Source Wizard对话框,选择VHDL Module,设定好文件名,如图7所示。然后单击Next,Next,Finish。在文件管理窗口双击刚刚建立的
文件,编辑好程序然后保存。然后对文件进行语法查错操作,双击进程管理窗口
图4
图5
图6
图7
图8
中Synthesize-XST菜单栏下的Check Syntax,如图8所示。按照错误提示修改程序,直至没有错误。接口程序如下所示:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity I2C_interface is
port (
clock_i2c : in std_logic;
reset : in std_logic;
i2c_data : in std_logic_vector(23 downto 0);
start : in std_logic;
tr_end : out std_logic;
i2c_sclk : out std_logic;
i2c_sdat : inout std_logic
);
end I2C_interface;
architecture trans of I2C_interface is
signal cyc_count : integer range 0 to 63;
signal reg_sdat : std_logic;
signal sclk : std_logic;
BEGIN
i2c_sclk <= (sclk or (not clock_i2c)) when ((cyc_count >= 4) and (cyc_count <= 30)) else
sclk;
i2c_sdat <= 'Z' when (reg_sdat = '1') else
'0';
process (clock_i2c)
begin
if (clock_i2c'event and clock_i2c = '1') then
if (reset = '0') then
cyc_count <= 63;
else
if (start = '0') then
cyc_count <= 0;
elsif (cyc_count < 47) then
cyc_count <= cyc_count + 1;
end if;
end if;
end if;
end process;