输入: 时钟,sccb接口
XVCLK 输入时钟,SCCB 用于对 OV5640 进行配置。输入时钟100MHZ.sccb的200khz。
SCCB 可以配置很多 OV5640 的关键特性,包括 XVCLK 输入后的 PLL,输出图像的格式(YUV/RGB),输出方式 MIPI/DVP,是否需要使用 ISP 进行处理,等等。
输出
PCLK输出时钟,同样分辨率,不同帧率的输出体现在PCLK上。
VSYNC:场同步信号,由摄像头输出,用于标志一帧数据的开始与结束。
HREF/HSYNC:行同步信号,由摄像头输出,用于标志一行数据的开始与结束。
D[9:0]:数据信号,由摄像头输出,在RGB格式输出中,只有高8位D[9:2]是有效的;
tPCLK:一个像素时钟周期;
tPCLK(像素时钟)。以RGB565数据格式为例,RGB565采用16bit数据表示一个像素点,而OV5640在一个像素周期(tPCLK)内只能传输8bit数据,因此需要两个时钟周期才能输出一个RGB565数据;
Video In to AXI4-Stream
OV5460 进行输出图像数据,它输出的数据是 8bit + 8bits 的图像数据,
VDMA 管理的到内存的写入是通过 S2MM 接口进行的,输入端是 AXI-Stream 的数据流,输出端是 AXI HP 到 memory controller。
我们需要将图像数据转成为 AXI-Stream 数据,并接到 VDMA 的 S2MM 接口;
对 OV5640 的数据进行抓取,同时将数据传递到 Video In to AXI4-Stream IP ,利用 Video In to AXI4-Stream 进行输出 AXI-Stream 到 VDMA,在到 DDR
Video In to AXI4-Stream信号
1、clk:时钟信号;
2、clk_en:时钟有效信号;
3、vsync:一帧的起始;
4、active:图像有效信号;
5、data[23:0]:RGB888 的数据信号
RGB565 - RGB888 进行拼接
我们采集到数据是 2 个 pclk 产生一个像素,像素是 16bits 的 RGB565,我们需要将 RGB565 -> RGB888,并输入到 Video In to AXI4-Stream.
assign r_8 = {rgb565[15:11],rgb565[15:13]};
assign g_8 = {rgb565[10:5],rgb565[10:9]};
assign b_8 = {rgb565[4:0],rgb565[4:2]};
VDMA+VTC+AXI4S-VideoOut 视频通路硬件搭建
视频数据的 Framebuffer 在 DDR 中
数据通过高带宽的 AXI4 接口(这里用到了 HP AXI,即 64bits 带 FIFO 的 AXI),将数据导入到 VDMA 中;
VDMA 以 AXI4-Stream 的方式将数据(因为我们使用 RGB888,所以配置为数据位宽 24bits)送给 AXI4-Stream To Video Out;
最右边的 Dynamic Clock Generator 负责生成对应分辨率的像素时钟 Pixel Clock;
像素时钟 Pixel Clock 同时输出到 Video Timing Controller、AXI4-Stream To Video Out、rgb2dvi 模块,作为像素时钟;
Video Timing Controller 在像素时钟下,同时配合软件通过 AXI4-Lite 的配置 VTC 协同工作,生成所需要的 VSync、HSync、VBank、HBank、Video Active等信号,输出到 AXI4-Stream To Video Out;
AXI4-Stream To Video Out 一端接收来自 DDR 的 AXI4-Stream 的视频数据,另一端在像素时钟 Pixel Clock 下进行 RGB[23:0] 的输出;
rgb2dvi 模块将 RGB[23:0] 数据转换成为 HDMI 的 TMDS 差分信号,进行输出到显示设备;
HP AXI Interface
为了使得视频数据传送带宽最大,我们需要使用 Zynq-7000 的 High Performance 的 AXI4,也就是 64bits 的并行数据。
PL时钟
PL 的时钟可以由 PS 端提供最多 4 路,这里我们只需要 2 路时钟,一路用于 AXI4-Lite 对寄存器的配置,另一路用于视频数据的传输;
将 FCLK_CLK0 配置为 100M,FCLK_CLK1 配置为 142MHz,这个 FCLK_CLK1 就用于视频流数据时钟,为何选 142MHz 呢,因为 1080p60 定义的时钟速率为 148.5MHz。而且包含消隐区的传递,我们的 AXI4-Stream 的时钟略低于它也可以满足高带宽的数据传送。
以上均为像素时钟。
VDMA
读通道,MM2S,将 DDR 的数据通过 VDMA 读出来,通过 AXI4-Stream 输出;
读通道 Memory Map Data 位宽设置为 64bit,也就是从 DDR 那边来的数据位宽,保证高带宽。
AXI4-Stream 输出位宽设置为 24bit,为何为 24bit 呢,因为我们的数据是 RGB888 的,一个像素就是 24bits。
Line Buffer 可以设置大一些,这里配置为 4096。
Video Timing Controller
只要 Generation,不要 Detection,Generation 用于生成时序并输出,也就是提供图像数据的设备,而 Detection 用于 Sink 设备:
配置分辨率,这里默认是是 720p:
AXI4-Stream To Video Out
配置 AXI 流转视频输出控制器参数,Clock Mode 选择 Independent,指的是 AXI4-Stream 和 Video Pixel Clock 的时钟是独立的,异步的,而 common 是同步的。我们选择异步。
Timing Mode 的 Slave mode 是指 VTC 是时序的 Slave,由 Video Out 模块通过 clock enable 控制时序的输出。Master Mode 指 VTC 是时序的 master,不由 Video Out 控制。我们选择 Master。
Dynamic Clock Generator
Digilent 设计的 IP模块,可以在 GitHub 上面找到
这个模块主要功能是根据不同的分辨率配置出不同的时钟输出,本质上是调用了锁相环,但要注意的是,此模块的参考时钟必须设置为 100MHz 这就是咱们将 FCLK0 配置为 100M 的原因。
rgb2dvi
IP 也是下载的 Digilent 设计的 IP模块,可以在 GitHub 上面找到。
它用于将 RGB 数据转化为 HDMI 的 TMDS 差分信号:
数据流分两类,一类是视频的数据流,另一路是 AXI4-Lite 的配置数据流
Video Data Stream HP接口
1、DDR 通过 AXI4 HP 64bits Interconnect 到 VDMA;
2、VDMA 输出 AXI4-Stream 24bits 到 AXI4-Stream To Video Out;
3、从 AXI4-Stream To Video Out 输出 RGB 数据到 rgb2dvi;
4、rgb2dvi 到 TMDS 信号
AXI4-Lite Configure Data Stream 配置数据流 GP接口
配置数据流,统一由 PS 的 AXI GP 接口接出来到 Interconnect。
在分配到每个 IP 的 AXI Lite 接口,这样软件就可以寻址进行寄存器的读写控制,从而控制硬件。
Pixel Clock Connections 像素时钟连接
像素时钟的产生者是 Dynamic Clock Generator 的 PXL_CLK_O,它的参考时钟是 100MHz 来自 AXI GP CLK。
输出 2 路时钟:
PXL_CLK_O:像素时钟;
PXL_CLK_5X_O:5 倍像素时钟;
像素时钟用于连接 VTC 的 clk、AXI4-Stream To Video Out 的 vid_io_out_clk、以及 rgb2dvi 的 PixCLK;
5倍像素时钟直接输入到 rgb2dvi SerialClk: 串行时钟。
AXI HP Clock Connections HP接口时钟
AXI HP 的时钟是 142MHz,接入到 VDMA 的 mm2s 的 AXI 和 AXI-Stream。 同时还接入到 AXI4-Stream To Video Out 的 aclk。