[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_图像入门连载-2FPGA 实现 CMOS 图像采集_ov5640

文档创建者:FPGA课程
浏览次数:35
最后更新:2024-10-16
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 8-FPGA图像入门
本帖最后由 FPGA课程 于 2024-10-16 18:55 编辑


软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!



1ov5640 简介
说到 OV5640 OV7725 等入门级摄像头大部分读者应该并不陌生,这些摄像头基础成为教学实验开发板必配摄 像头。如下图所示,为我们米联客提供的 OV5640 摄像头,采用的是 DVP 接口。通过普通的连接器接入到开发板的的 FPGA IO 实现数据采集。
c40130ae5f414031926963c737a1f5fb.jpg
OV5640 是一款靶面大小为 1/4 英寸的图像光学传感器芯片。最高支持 2592*1944@15fps QSXVGA 格式图像采 集,或者 640*480@90fps VGA 图像采集。芯片内部集成了图像处理的功能,包括自动曝光控制(AEC)、自动白 平衡(AWB)等功能。
OV5640 的数据输出格式支持 MIPI(移动产业处理器接口)、DVP(数字视频并行)我们米联客暂时只有 DVP 接 口的 OV5640 摄像头,受限于硬件接口速度,目前最高可以实现 720p@30fps,对于部分转接卡只能实现 720p@15fps 的采集速度,能够满足大部分实验性质的图像数据采集要求。
由于米联客 7X 没有 PL 端 DDR,所以将数据通过 PS DDR 从底板上的 HDMI  口输出。(以下课程都是)

1.1OV5640 的框图
dd436963fc034e6b90ff70c509fb4c8b.jpg
我们通过框图可以看到 OV5640 摄像头大概的功能结构包括:
1:PLL 模块,输入的 XCLK 时钟经过 PLL 后提供给芯片的内部逻辑工作  2:时序产生以及系统控制逻辑模块(timing generator and system control logic)
3:图像传感器核心单元(image sensor core)包含:感光阵列(image array)、放大器(AMP)、放大器增益控制(gain contro)、 ADC 模块(10-bit ADC)  、50HZ/60HZ 干扰自动检测单元
4:图像处理单元包含(image sensor processor):ISP 图像处理单元、数据压缩单元、格式转换单元 5:图像输出接口(image out interface)包含:数据 FIFO 、DVP 接口、MIPI 接口
6:寄存器配置接口(SCCB interface) 7:微控制器(microcontroller)
1.2 摄像头参数概述
                        
厂家
                        
                        
OmniVision
                        
                        
色彩
                        
                        
彩色
                        
                        
曝光模式
                        
                        
卷帘
                        
                        
靶面尺寸
                        
                        
1/4``
                        
                        
相机 ID
                        
                        
0x78
                        
                        
支持的分辨率
                        
                        
最大分辨率支持 2592*1944@15。受限于硬件设计我们的摄像头最大支持 1280*@30 或者 1280*720@15,满足一般实验要求绰绰有余。
                        
                        
镜头
                        
                        
M12 4MM 500W
                        
                        
视场角
                        
                        
约 70°
                        
                        
感光特性
                        
                        
可见光(红外弱)
                        
                        
接口
                        
                        
DVP
                        
                        
ISP
                        
                        
内置 ISP 算法
                        
                        
尺寸
                        
                        
30mm*30mm*35mm
                        
1.3 摄像头接口定义
米联客 CEP(Camera expansion interface)接口定义如下:
d8dfece66beb4d179f9e208013b9c91c.jpg
标准 DVP OV5640 摄像头定义如下:
03cb0181b442445e8f2036f0eb0ad3ca.jpg
读者可以发现,相比标准的 DVP  接口,米联客的 CEP  接口烧了 RESET 、CMOS_CTL0 、CMOS_CTL1、 CMOS_CTL2 这几个信号脚。
另外细心的读者可以发现米联客的 CEP 扩展接口预先以差分形式走线,具体差分信号传输能力。 信号功能如下:
                        
信号名称
                        
                        
功能描述
                        
                        
输入/输出
                        
                        
D3V3
                        
                        
3.3V 输入接口给摄像头芯片供电
                        
                        
电源
                        
                        
GND
                        
                        
数据、模拟 GND
                        
                        
电源
                        
                        
SCLK
                        
                        
I2C 时钟/SCCB 协议时钟
                        
                        
input
                        
                        
SDAT
                        
                        
I2C 数据/SCCB 协议数据
                        
                        
inout
                        
                        
VSYNC
                        
                        
帧同步信号
                        
                        
output
                        
                        
HREF
                        
                        
行同步信号
                        
                        
output
                        
                        
PCLK
                        
                        
像素时钟,对于 RGB565 一个像素需要 2 个时钟
                        
                        
output
                        
                        
XCLK
                        
                        
FPGA 输入给摄像头的参考时钟一般是 24MHZ
                        
                        
input
                        
                        
D2~D9
                        
                        
对应 d0~d8,8bit 有效数据
                        
                        
output
                        
1.4 分辨率
91450dc8f6ea4c1287caf95794b13e5e.jpg
OV5640 使用寄存器 0x3800 ~ 0x3814 进行图像窗口调整。上图中说明了那些寄存器如何定义窗口大小。对于物理像素大小是固定的,由传感器中所有像素阵列的大小决定。ISP 输入大小是从像素阵列读取的像素数据总量。一 般情况下,ISP 的输入量越大,所能达到的最大帧速率越小。数据输出大小为 OV5640 的图像输出大小。这个大小 从 ISP 输入大小中窗口化,由 x_offset 和y_offset 定义。
下表我们给出以上寄存器的功能定义说明:

                        
address
                        
                        
register name
                        
                        
default value
                        
                        
R/W
                        
                        
description
                        
                        
0x3800
                        
                        
TIMING HS
                        
                        
0x00
                        
                        
RW
                        
                        
Bit[3:0]有效,对应 X_ADDR_ST[11:8]bits
                        
                        
0x3801
                        
                        
TIMING HS
                        
                        
0x00
                        
                        
RW
                        
                        
Bit[7:0]有效,对应 X_ADDR_ST[7 :0]bits
                        
                        
0x3802
                        
                        
TIMING VS
                        
                        
0x00
                        
                        
RW
                        
                        
Bit[2:0]有效,对应 Y_ADDR_ST [10:8]bits
                        
                        
0x3803
                        
                        
TIMING VS
                        
                        
0x00
                        
                        
RW
                        
                        
Bit[7:0]有效,对应 X_ADDR_ST [7 :0]bits
                        
                        
0x3804
                        
                        
TIMING HW
                        
                        
0x0A
                        
                        
RW
                        
                        
Bit[3:0]有效,对应 X_ADDR_END[11:8]bits
                        
                        
0x3805
                        
                        
TIMING HW
                        
                        
0x3F
                        
                        
RW
                        
                        
Bit[7:0]有效,对应 X_ADDR_ END [7 :0]bits
                        
                        
0x3806
                        
                        
TIMING VH
                        
                        
0x07
                        
                        
RW
                        
                        
Bit[2:0]有效,对应 Y_ADDR_ END [10:8]bits
                        
                        
0x3807
                        
                        
TIMING VH
                        
                        
0x9F
                        
                        
RW
                        
                        
Bit[7:0]有效,对应 X_ADDR_ END [7 :0]bits
                        
                        
0x3808
                        
                        
TIMING DVPHO
                        
                        
0x0a
                        
                        
RW
                        
                        
Bit[3:0]有效,对应图像水平像素 hsize[11:8]bits
                        
                        
0x3809
                        
                        
TIMING DVPHO
                        
                        
0x20
                        
                        
RW
                        
                        
Bit[7:0]有效,对应图像水平像素 hsize [7 :0]bits
                        
                        
0x380A
                        
                        
TIMING DVPVO
                        
                        
0x07
                        
                        
RW
                        
                        
Bit[3:0]有效,对应图像垂直像素 vsize[11:8]bits
                        
                        
0x380B
                        
                        
TIMING DVPVO
                        
                        
0x98
                        
                        
RW
                        
                        
Bit[7:0]有效,对应图像垂直像素 vsize [7 :0]bits
                        
                        
0x380C
                        
                        
TIMING HTS
                        
                        
0x0B
                        
                        
RW
                        
                        
Bit[3:0]有效,对应图像水平像素总大小 total_hsize[11:8]bits
                        
                        
0x380D
                        
                        
TIMING HTS
                        
                        
0x1C
                        
                        
RW
                        
                        
Bit[7:0]有效,对应图像水平像素总大小 total_hsize [7 :0]bits
                        
                        
0x380E
                        
                        
TIMING VTS
                        
                        
0x07
                        
                        
RW
                        
                        
Bit[3:0]有效,对应图像垂直像素总大小 total_vsize[11:8]bits
                        
                        
0x380F
                        
                        
TIMING VTS
                        
                        
0xB0
                        
                        
RW
                        
                        
Bit[7:0]有效,对应图像垂直像素总大小 total_vsize [7 :0]bits
                        
                        
0x3810
                        
                        
TIMING HOFFSET
                        
                        
0x00
                        
                        
RW
                        
                        
Bit[3:0]有效,对应图像水平像素裁剪大小 xoffset_size[11:8]bits
                        
                        
0x3811
                        
                        
TIMING_HOFFSET
                        
                        
0x10
                        
                        
RW
                        
                        
Bit[7:0]有效,对应图像水平像素裁剪大小 xoffset_size [7 :0]bits
                        
                        
0x3812
                        
                        
TIMING VOFFSET
                        
                        
0x00
                        
                        
RW
                        
                        
Bit[3:0]有效,对应图像垂直像素裁剪大小 xoffset_size[11:8]bits
                        
                        
0x3813
                        
                        
TIMING VOFFSET
                        
                        
0x04
                        
                        
RW
                        
                        
Bit[7:0]有效,对应图像垂直像素裁剪大小 xoffset_size [7 :0]bits
                        
1:有效像素大小:图像采集窗口的物理大小 physical pixel size 为 2623*1951,其中有效像素部分 2592*1944。由上表中 X_ADDR_ST (0x3800、0x3801)、Y_ADDR_ST(0x3802、0x3803)、X_ADDR_END(0x3804、0x3805)、 Y_ADDR_END(0x3806、0x3807)寄存器和 X_OFFSET(0x3810 、 0x3811)和 Y_OFFSET(0x3812 、0x3813)寄存器 共同决定。
2:预缩放窗口(pre-scaling-size):可以通过设置 X_OFFSET(0x3810 、 0x3811)和 Y_OFFSET(0x3812 、0x3813)对图像做裁剪,可以看到裁剪的后的图像可以观察到的像素面较少了。
3:DVP 图像数据输出窗口(data-output-size):通过 X_OUT_PUT(0x3808, 0x3809), Y_OUT_PUT(0x380A, 0x380B) 设置。
当 pre-scaling-size 和 data-output-size 不一致的时候,OV5640 的 ISP 部分会自动完成对图像的缩放处理。

1.5RGB565 格式
OV5640 支持的图像数据格式包括 YUV、RGB、RAW,可以通过修改寄存器 0x4300 进行配置。在演示基本的图像采集,图像算法中,以 RGB656 格式最常用。
                        
address
                        
                        
register name
                        
                        
default value
                        
                        
R/W
                        
                        
description
                        
                        
0x4300
                        
                        
FORMAT CONTROL
                        
                        
0xF8
                        
                        
RW
                        
                        
Bit[7:4]:数据输出格式 0 :RAW
                        
1 :Y8
                        
2 :YUV444/RGB888 3 :YUV422
                        
4 :YUV420
                        
5 :YUV420(仅 MIPI 支持)
                        

                        
                        
                        
                        
                        
                        
                        
                        
                        
6 :RGB565 Bit[3:0]:输出顺序
                        
0:{b[4:0],g[5:3]},{g[2:0],r[4:0]} 1:{r[4:0],g[5:3]},{g[2:0],b[4:0]} 2:{g[4:0],r[5:3]},{r[2:0],b[4:0]}  3:{b[4:0],r[5:3]},{r[2:0],g[4:0]}  4:{g[4:0],b[5:3]},{b[2:0],r[4:0]} 5:{r[4:0],b[5:3]},{b[2:0],g[4:0]} 6~14:不支持
                        
15:{g[2:0],b[4:0]},{r[4:0],g[5:3]}
                        
7 :RGB555 格式 1   8 :RGB555 格式 2   9 :RGB444 格式 1   10 :RGB444 格式 2 11~14:不支持
                        
15 :Bypass formatter module
                        

1.6OV5640 的时钟
13980670e20643f6a22fc649fc1af045.jpg
                        
address
                        
                        
register name
                        
                        
default value
                        
                        
R/W
                        
                        
description
                        
                        
0x3034
                        
                        
SC PLL CONTRL0
                        
                        
0x1A
                        
                        
RW
                        
                        
Bit[6:4]: PLL 电荷泵控制
                        
Bit[3:0]: MIPI 位模式 0x8: 8-bit mode
                        
0xA: 10-bit mode
                        
                        
0x3035
                        
                        
SC PLL CONTRL1
                        
                        
0x11
                        
                        
RW
                        
                        
Bit[7:4]:系统时钟分频 Bit[3:0]:MIPI 分频
                        
                        
0x3036
                        
                        
SC PLL CONTRL2
                        
                        
0x69
                        
                        
RW
                        
                        
Bit[7:0]:PLL 倍频器(4~252)我们定义为 clk_multi[7:0]
                        
在 4~127 范围内支持任意整数倍频;在 128~252 范围内仅支持偶数倍频
                        
                        
0x3037
                        
                        
SC PLL CONTRL3
                        
                        
0x03
                        
                        
RW
                        
                        
Bit[4]:锁相环根分频器
                        

                        
                        
                        
                        
                        
                        
                        
                        
                        
0:Bypass 1:2 分频
                        
Bit[3:0]:PLL 预分频 1, 2, 3, 4, 6, 8
                        
                        
0x3108
                        
                        
SC PLL CONTRL5
                        
                        
0x16
                        
                        
RW
                        
                        
始终为 0x01
                        
                        
0x303B
                        
                        
SC PLLS CTRL1
                        
                        
0x19
                        
                        
RW
                        
                        
Bit[7:5]:调试模式  Bit[4:0]:PLLS  倍频
                        
                        
0x303C
                        
                        
SC PLLS CTRL2
                        
                        
0x11
                        
                        
RW
                        
                        
Bit[7]:调试模式
                        
Bit[6:4]:PLL 充电泵控制 Bit[3:0]:PLL 系统分频
                        
                        
0x303D
                        
                        
SC PLLS CTRL3
                        
                        
0x30
                        
                        
RW
                        
                        
Bit[7:6]:调试模式 Bit[5:4]:
                        
00:/1
                        
01:/1.5 10:/2
                        
11:/3
                        
Bit[3]:调试模式
                        
Bit[3]:PLL 根分频器
                        
0:/1 1:/2
                        
Bit[1:0]: 00: /1  01:/2
                        
11:/2.5
                        
Bit[3:0]:PLL 系统分频
                        
                        
0x3824
                        
                        
                        
                        
                        
                        
RW
                        
                        
PLL  手动分频,这个参数没有查到但是有用。
                        
我们现在以开发板上的 OV5640 为例,配置参数来用上图的公式来计算下。

fbe0854f764b4effbf2424ed04f27941.jpg
以上分析中比如 3037[7]?3036[7:1]*2 : 3036[6:0]  描述的是如果 0x3037 寄存器的 bit7 为 1 这倍频系数为 0x3036 寄 存器的 bit[7:1]*2  否则 为 bit[6:0]
掌握了原理,以上是 1280*720 15fps 的 PCLK 时钟,掌握了以上原理,我们只要简单修改(0x3035,0x21)就可以实现 PCLK 84MHZ。
读者请注意,米联客目前的 FEP  扩展卡经过多次转接到 CEP  后最高的 PCLK   目前是 42Mhz,也就是实现 1280*720@15fps。
1.7 软件复位
软件复位后需要等待 5ms 才能确保所有寄存器恢复到初始值。

                        
Address
                        
                        
register name
                        
                        
default value
                        
                        
R/W
                        
                        
description
                        
                        
0x3008
                        
                        
SYSTEM CTROL0
                        
                        
0x02
                        
                        
RW
                        
                        
Bit[7]:软件复位
                        
Bit[6]:软件关闭电源
                        

1.8DVP 时序
f8a28a5e831344eb9f5b4814e069f4f2.jpg
OV5640 的 DVP 时序包含场同步信号 VSYNC,上同步信号 HSYNC、数据有效信号 HREF,以及数据部分所以是 标准的视频时序。我们可以只关心 VSYNC HREF  以及 DATA 部分。下面是我们自己画的一张 RGB565 的时序图:
cc70f3c3eb8c46a59504d162b187a383.jpg
以上时序图中可以看到每个 pclk 输出有 2 个 1 个有效的 RGB 数据。

1.9SCCB 传输协议
7d56508674904e528c57b19cf02bea24.jpg
以上是 SCCB 配置寄存器的时序图,下图是如何配置寄存器。可以看出下图的配置寄存器过程非常类似 I2C 写 操作。分别具有 1 个 7bit 器件地址+1bit 的起始位、16bit 的地址、8bit 数据、停止位。其中X 代表了OV5640 发给 配置主机的 ACK 可以不管。所以我们可以通过 GPIO 实现 SCCB 也可以通过 I2C 配置寄存器。
4691d1118c8640509525fb20c9242a69.jpg
2 系统框图
本系统中通过 miliankeuifdma_dbufip 的写通道将摄像头采集到的数据通过 AXI intercomment  写入 DDR3,同 时 使 用 milianke  uifdma_dbuf  ip   的 读通 道读 取 DDR3   中 的视 频 数 据通 过 HDMI   接 口 输 出 至 显 示 屏。
7151155b2f5a434db4c947b723e6425e.jpg
3 可视化图形界面
7c48c56e6cd94c4c925bb618a60d5d2c.jpg
4 搭建 Vitis-sdk 工程
创建 soc_base  sdk  platform  和 APP  工程的过程不再重复,可以阅读 3-3-01_sdk_base_app。以下给出创建好 soc_base sdk platform 的截图和对应工程 APP 的截图。


4.1 创建 SDK Platform 工程
adba4010c2a447f3b111b483ffc0ad21.jpg
4.2SDK APP 工程
3f0202634b5d482cb60e0aa572f4fe13.jpg
5 硬件连接
如图所示:
2060994320b644d59ac0e6c276240ecd.jpg
HDMI 线连接到显示器,ov5640 摄像头通过 FEP 接口连接在板子上。

6 实验结果
1f01f7a72a814fa682011144381a88b1.jpg






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则