本帖最后由 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 实现数据采集。
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 的框图
我们通过框图可以看到 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)接口定义如下:
标准 DVP OV5640 摄像头定义如下:
读者可以发现,相比标准的 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 分辨率
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 的时钟
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 为例,配置参数来用上图的公式来计算下。
以上分析中比如 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 时序
OV5640 的 DVP 时序包含场同步信号 VSYNC,上同步信号 HSYNC、数据有效信号 HREF,以及数据部分所以是 标准的视频时序。我们可以只关心 VSYNC HREF 以及 DATA 部分。下面是我们自己画的一张 RGB565 的时序图:
以上时序图中可以看到每个 pclk 输出有 2 个 1 个有效的 RGB 数据。
1.9SCCB 传输协议
以上是 SCCB 配置寄存器的时序图,下图是如何配置寄存器。可以看出下图的配置寄存器过程非常类似 I2C 写 操作。分别具有 1 个 7bit 器件地址+1bit 的起始位、16bit 的地址、8bit 数据、停止位。其中X 代表了OV5640 发给 配置主机的 ACK 可以不管。所以我们可以通过 GPIO 实现 SCCB 也可以通过 I2C 配置寄存器。
2 系统框图本系统中通过 miliankeuifdma_dbufip 的写通道将摄像头采集到的数据通过 AXI intercomment 写入 DDR3,同 时 使 用 milianke uifdma_dbuf ip 的 读通 道读 取 DDR3 中 的视 频 数 据通 过 HDMI 接 口 输 出 至 显 示 屏。
3 可视化图形界面
4 搭建 Vitis-sdk 工程
创建 soc_base sdk platform 和 APP 工程的过程不再重复,可以阅读 3-3-01_sdk_base_app。以下给出创建好 soc_base sdk platform 的截图和对应工程 APP 的截图。
4.1 创建 SDK Platform 工程
4.2SDK APP 工程
5 硬件连接
如图所示:
HDMI 线连接到显示器,ov5640 摄像头通过 FEP 接口连接在板子上。
6 实验结果
|