SU200P OV5640 DDR4 TFT 显示实验说明
配套工程:
ov5640_ddr4_tft工程环境:Vivado 2026.1 目标器件:xcsu200p-sbva1024-2-e
1. 实验目的
本实验使用 OV5640 摄像头、板载 DDR4 和外接 RGB565 TFT 屏搭建实时图像采集与显示系统。完成实验后,读者应能够:
- 理解摄像头配置、DVP 图像采集、DDR4 帧缓存和 TFT 显示之间的数据关系;
- 了解工程中各时钟域及异步 FIFO 的作用;
- 了解 DDR4 控制器和 OV5640 的核心配置;
- 完成摄像头、TFT、JTAG 和开发板的硬件连接;
- 下载 PDI,并根据 TFT 图像和 LED 状态判断系统是否正常工作。
2. 工程概述
ov5640_ddr4_tft 是一个自定义 RTL 图像显示工程。OV5640 输出 8 bit DVP 数据,采集模块将相邻两个字节组合成 RGB565 像素;像素经过写 FIFO 和 AXI4 接口写入板载 DDR4,再由读通道取回,经过读 FIFO 送入 800 × 480 的 TFT 时序模块。DDR4 帧缓存隔离了摄像头采集时钟与显示像素时钟,使两端能够按各自节奏工作。
<samp>工程主要文件</samp>
| 文件 | 作用 |
|---|---|
ov5640_ddr4_tft.xpr | Vivado 工程入口 |
sources_1/top/ov5640_ddr4_tft.v | 综合顶层,连接摄像头、DDR4、TFT、时钟复位和状态 LED |
sources_1/camera_init/camera_init.v | 控制 OV5640 复位、上电和 SCCB 寄存器初始化 |
sources_1/camera_init/ov5640_init_table_rgb.v | OV5640 RGB565 模式初始化寄存器表 |
sources_1/DVP_Capture/DVP_Capture.v | 采集 DVP 数据并将两个 8 bit 字节组合为一个 RGB565 像素 |
sources_1/ddr4_ctrl/ddr4_ctrl_2port.v | 封装读写 FIFO、AXI4 访问和 DDR4 帧缓存控制 |
sources_1/disp_driver/disp_driver.v | 产生 800 × 480 TFT 显示时序和 RGB 输出 |
sources_1/test_pattern/ddr_colorbar.v | 静态彩条测试模式的数据发生器,内部模块名为 ddr_static_pattern_writer |
sources_1/ip/ddr4_0/ddr4_0.xci | 板载 DDR4 控制器 IP 配置 |
sources_1/ip/pll/pll.xci | 系统各功能时钟的时钟 IP 配置 |
constrs_1/new/io.xdc | 摄像头、TFT、DDR4、时钟、复位和 LED 管脚约束 |
bit/ov5640_ddr4_tft.pdi | 当前工程生成的器件下载文件 |
bit/ov5640_ddr4_tft.ltx | 与当前 PDI 配套的调试探针文件 |
3. 设计结构与工作原理
3.1 总体结构
整个设计可以分为时钟复位、摄像头配置、图像采集、DDR4 帧缓存、TFT 显示和状态指示六个部分。

<kbd>OV5640 图像采集与显示结构</kbd>
3.2 时钟与复位
图像采集、存储和显示对时钟的要求不同,因此工程没有让所有模块共用同一个工作时钟,而是分别为控制、摄像头、TFT 和 DDR4 建立对应的时钟域。
板载 266.67 MHz 差分系统时钟首先送入 PLL。PLL 从该时钟产生 50 MHz、24 MHz 和 33 MHz 三路时钟:50 MHz 用于摄像头寄存器配置和系统控制,24 MHz 通过 camera_xclk 提供给 OV5640,33 MHz 则作为 TFT 像素时钟,用于产生 800 × 480 显示时序。
OV5640 接收到 24 MHz 外部时钟后,会根据内部配置产生 DVP 输出时序,并通过 camera_pclk 将像素数据送回 FPGA。DVP_Capture 以 camera_pclk 为采样时钟接收 camera_data,因此 24 MHz 的 camera_xclk 负责驱动摄像头工作,camera_pclk 才是 FPGA 实际采集图像数据时使用的时钟。
DDR4 使用另一路独立的 266.67 MHz 差分参考时钟。该时钟直接送入 DDR4 控制器,用于初始化、校准和 AXI 数据传输,不经过前述 PLL。摄像头采集、DDR4 用户接口和 TFT 显示处于不同的时钟域,工程通过读写异步 FIFO 在这些时钟域之间传递像素数据。
<samp>主要时钟与复位</samp>
| 信号 | 来源或器件 | 作用 |
|---|---|---|
sys_clk_p/n | 板载时钟器件 | PLL 输入,标称 266.67 MHz |
clk_50m | FPGA PLL 输出 | 摄像头寄存器配置和系统控制时钟 |
camera_xclk | FPGA PLL 输出 | 向 OV5640 提供 24 MHz 外部工作时钟 |
camera_pclk | OV5640 | FPGA 采集 DVP 像素数据的时钟 |
TFT_clk | FPGA PLL 输出 | 33 MHz TFT 像素时钟 |
ddr4_clk_p/n | 板载 DDR4 参考时钟 | DDR4 控制器参考时钟,标称 266.67 MHz |
reset_n | SW13,FPGA 管脚 F23 | 低电平有效的系统复位 |
SW13 按下时,PLL、DDR4 数据通路、FIFO、摄像头初始化和显示控制进入复位。松开按键后,PLL 先建立稳定时钟,随后 DDR4 控制器开始初始化和校准;DDR4 准备完成后,系统再启动 OV5640 配置、图像采集和 TFT 显示。这样的启动顺序可以避免摄像头或显示模块在时钟和帧缓存尚未就绪时提前读写数据。
3.3 OV5640 配置与 DVP 图像采集
camera_init 使用类似 I²C 的 SCCB 总线配置 OV5640。当前寄存器表将图像输出设置为 800 × 480、RGB565,关闭上下翻转和左右镜像,并通过 camera_rst_n、camera_pwdn 管理传感器复位与掉电状态。
初始化完成后,OV5640 通过 camera_vsync 指示帧边界,通过 camera_href 指示当前行的有效图像区,并在 camera_pclk 节拍下输出 8 bit 数据。DVP_Capture 将连续两个字节组合为一个 16 bit RGB565 像素,同时产生像素有效信号供写 FIFO 使用。
<samp>摄像头接口信号</samp>
| 信号 | 方向 | 作用 |
|---|---|---|
camera_sclk、camera_sdat | FPGA 与摄像头之间 | SCCB 配置时钟和双向数据 |
camera_xclk | FPGA → OV5640 | 24 MHz 传感器输入时钟 |
camera_rst_n、camera_pwdn | FPGA → OV5640 | 复位和掉电控制 |
camera_pclk | OV5640 → FPGA | DVP 数据采样时钟 |
camera_vsync、camera_href | OV5640 → FPGA | 帧同步和行有效 |
camera_data[7:0] | OV5640 → FPGA | 8 bit 图像数据 |
3.4 DDR4 帧缓存
摄像头时钟和 TFT 像素时钟彼此独立,不能直接用一组寄存器稳定传递整帧数据。工程使用写异步 FIFO 跨越摄像头与 DDR4 用户时钟域,再通过 AXI4 将像素连续写入板载 DDR4;显示侧从相同帧区域连续读回数据,经读异步 FIFO 跨越到 33 MHz 像素时钟域。
一帧图像包含 800 × 480 个像素,每个 RGB565 像素占 2 字节,因此当前帧缓存占用 768000 字节,地址范围从 0 开始循环。显示开始前,读 FIFO 会先积累一定数量的像素,以减小 AXI 突发访问间隔导致的瞬时断流。
DDR4 在这里既保存完整画面,也隔离摄像头与显示端的速率差异。当摄像头产生新帧时,写通道持续更新帧缓存;显示端按固定的 TFT 时序读取当前图像。
3.5 TFT 显示
disp_driver 产生 800 × 480 显示时序。当前像素时钟为 33 MHz,水平总周期为 1056 个像素时钟,垂直总周期为 525 行,因此刷新率约为:
刷新率 = 33,000,000 ÷ (1056 × 525) ≈ 59.5 Hz
显示有效区内,模块从读 FIFO 取出 RGB565 像素,并输出 TFT_rgb[15:0];同时产生 TFT_hs、TFT_vs、TFT_de 和 TFT_clk。TFT_pwm 在当前设计中保持有效,用于打开屏幕背光。
<samp>TFT 输出信号</samp>
| 信号 | 作用 |
|---|---|
TFT_rgb[15:0] | RGB565 图像数据 |
TFT_hs、TFT_vs | 行同步和场同步 |
TFT_de | 有效显示区指示 |
TFT_clk | 33 MHz 像素时钟 |
TFT_pwm | TFT 背光控制 |
3.6 状态指示与彩条测试
默认参数 DDR_COLORBAR_TEST=0时,工程使用真实摄像头图像。四个板载 LED 对应的状态位如下;LED 实际点亮电平取决于板上驱动电路,因此判断时应结合状态变化,而不只按高电平等同于点亮来理解。
<samp>默认摄像头模式状态指示</samp>
| 顶层信号 | 板载器件 | 状态含义 |
|---|---|---|
led[0] | LED1 / Q26 | PLL 已锁定 |
led[1] | LED2 / Q27 | DDR4 初始化与校准完成 |
led[2] | LED3 / Q28 | OV5640 已解除复位 |
led[3] | LED4 / Q29 | OV5640 寄存器初始化完成 |
工程还保留了 DDR_COLORBAR_TEST=1 的板内彩条模式。该模式不依赖摄像头,ddr_static_pattern_writer 生成一帧带白色边框、竖向彩条和横向黑线的 RGB565 图像,经相同 DDR4 读写链路送到 TFT。它适合在没有画面时判断问题位于摄像头输入侧,还是 DDR4 与显示侧。
4. 核心配置
4.1 DDR4 IP 配置
DDR4 IP 负责把用户侧的 AXI4 访问转换为板载 DDR4 所需的命令、地址和数据信号。配置时需要同时匹配板载存储器型号、参考时钟、工作速率和用户侧 AXI 接口,不能把这些参数看成彼此独立的选项。

<kbd>DDR4 IP基础与存储器配置</kbd>
Basic 页面选择 Controller and physical layer 并启用 AXI4 Interface,由 IP 同时完成 DDR4 控制器和物理层功能。用户逻辑不直接驱动 DDR4 的地址、命令和 DQ/DQS 信号,而是通过 AXI4 接口读写帧数据。
存储器型号选择 MT40A512M16TB-062E,与 SU200P 板载 DDR4 器件一致。该器件为 8 Gbit、x16、单 Rank 结构,对应 1 GB 容量。物理数据位宽设置为 16 bit,工作电压为 1.2 V,突发长度为 8;一次完整突发包含 16 bit × 8 = 128 bit 数据,因此用户侧采用 128 bit AXI 数据宽度。
Memory Device Interface Speed 设置为 1600 ps,对应 625 MHz DDR4 时钟和 1250 MT/s 数据速率。Reference Input Clock Speed 设置为 3733 ps,对应约 267.86 MHz,与开发板约 266.67 MHz 的 DDR4 差分参考时钟匹配。PHY 与控制器采用 4:1 时钟比,使控制器能够用较低的内部时钟并行处理高速 DDR4 数据。

<kbd>DDR4 IP的AXI接口配置</kbd>
AXI Options 页面将数据宽度设置为 128 bit、地址宽度设置为 30 bit、ID 宽度设置为 4 bit。30 bit 字节地址可以覆盖 2^30 byte,即完整的 1 GB 存储空间;本工程只使用从地址 0 开始的 768000 byte 保存一帧 800 × 480 RGB565 图像。
仲裁方式选择 RD_PRI_REG,使读请求采用带寄存的优先处理方式。AXI Narrow Burst 未启用,因此帧缓存控制模块按照完整的 128 bit 数据宽度发起突发访问。16 bit RGB565 像素在写 FIFO 后被整理成 AXI 数据,读回时再拆分成像素送入显示 FIFO。

<kbd>DDR4 IP高级时钟配置</kbd>
Advanced Clocking 页面显示了 IP 根据参考时钟和目标速率计算出的 MMCM 参数。当前设置与 3733 ps 输入周期、1600 ps DDR4 接口周期配套,用于产生控制器和物理层内部时钟。一般不需要单独修改这些倍频、分频值;若改变参考时钟或 DDR4 速率,应先回到 Basic 页面修改目标参数,再由 Vivado 重新计算整组时钟配置。
<samp>DDR4 核心配置</samp>
| 配置项 | 当前值 | 说明 |
|---|---|---|
| 控制器模式 | Controller and physical layer | 同时生成 DDR4 控制器和物理接口 |
| 存储器型号 | MT40A512M16TB-062E | 与板载 DDR4 器件匹配 |
| 物理数据位宽 | 16 bit | 对应板载单颗 x16 DDR4 |
| 存储容量 | 8 Gbit,即 1 GB | 图像只使用开头 768000 byte 作为帧缓存 |
| DDR4 速率 | 1250 MT/s | 存储器接口周期配置为 1600 ps |
| 输入参考时钟 | 约 266.67 MHz | 来自板载 DDR4 差分参考时钟 |
| AXI 数据宽度 | 128 bit | 与 x16 DDR4 的一次 BL8 突发数据量对应 |
| AXI 地址宽度 | 30 bit | 覆盖完整的 1 GB 存储空间 |
| AXI ID 宽度 | 4 bit | 区分不同的 AXI 事务 |
| ECC | 关闭 | 当前图像缓存不使用 ECC |
这些参数同时受 FPGA 管脚连接、板载 DDR4 型号和 PCB 走线约束。更换存储器或开发板时,不能只修改 RTL 中的帧地址,还需重新配置 DDR4 IP 并更新管脚约束。改变图像分辨率时,通常不需要修改 DDR4 器件参数,但必须重新计算一帧占用的字节数以及读写结束地址。
4.2 PLL 配置
摄像头配置、摄像头外部时钟和 TFT 显示使用不同频率。工程通过 Clocking Wizard 将板载 266.67 MHz 差分系统时钟转换为所需时钟,使三个部分能够在各自频率下工作。

<kbd>PLL输入时钟配置</kbd>
Clocking Options 页面将主输入时钟设置为 266.67 MHz 差分时钟。顶层通过 sys_clk_p/n 接入该时钟,并将 Clocking Wizard 的 locked 输出作为系统启动条件之一。PLL 尚未锁定时,DDR4 和后续数据通路保持复位,避免在时钟不稳定时启动摄像头或存储器访问。

<kbd>PLL输出时钟配置</kbd>
配置界面生成了多路输出,但当前顶层只使用其中三路:
| Clocking Wizard 输出 | 文档采用频率 | 顶层信号 | 用途 |
|---|---|---|---|
clk_out1 | 50 MHz | clk_50m | SCCB 配置、摄像头初始化和彩条发生器 |
clk_out3 | 24 MHz | clk_24m | 输出到 camera_xclk,作为 OV5640 外部输入时钟 |
clk_out4 | 33 MHz | clk_33m | 产生 800 × 480 TFT 扫描时序 |
截图中 clk_out4 的 Actual 一栏约为 33.33375 MHz,这是 Clocking Wizard 在当前输入频率和 PLL 分频条件下无法精确得到 33 MHz 时给出的近似结果。工程功能和本文分析均按目标频率 33 MHz 说明。
clk_out2 和 clk_out5 在当前顶层中保持悬空,不参与图像链路。50 MHz 控制时钟负责较慢的初始化和测试控制,24 MHz 时钟满足 OV5640 外部时钟需求,33 MHz 像素时钟配合 disp_driver 的行场参数形成约 59.5 Hz 的 TFT 刷新率。
如果改变 TFT 分辨率或刷新率,需要同时修改 Clocking Wizard 的像素时钟和 disp_driver 中的水平、垂直时序参数;如果改变 OV5640 的 XCLK,则还需要重新检查摄像头寄存器表中的 PLL 与帧率配置。
4.3 OV5640 图像配置
OV5640 的核心配置位于 ov5640_init_table_rgb.v。当前设置使用 24 MHz 外部输入时钟,输出 800 × 480 RGB565 数据。寄存器表决定传感器的输出格式、裁剪缩放、帧率和图像方向;修改这些参数后,应同步检查 DVP 采集格式、DDR4 每帧地址范围和 TFT 显示分辨率。
5. 板级验证
5.1 硬件准备与连接
实验需要 SU200P 开发板、OV5640 DVP 摄像头模块、支持 800 × 480 RGB565 并行输入的 TFT 屏和 JTAG 下载线。
关闭开发板电源后完成以下连接:
- 将 OV5640 模块接到摄像头接口,确认接口方向和 1 脚位置正确;
- 将 TFT 接到并行显示接口,确认 RGB565 数据、行场同步、DE、像素时钟、背光和电源信号对应;
- 连接 JTAG 下载线和开发板电源;
- 检查摄像头与 TFT 排线无反接、错位或松动后再上电。

<kbd>OV5640 摄像头与 TFT 屏硬件连接</kbd>
图中 OV5640 模块安装在开发板右侧的 CAMERA 接口,TFT 屏通过排线连接到板上方的 LCD_RGB 接口,开发板同时连接了电源和 JTAG 下载线。摄像头和显示排线的触点方向必须与连接器一致;如果排线反接或错位,可能出现摄像头无法配置、TFT 背光亮但无图像等现象。
硬件安装完成后,应轻拉排线确认锁扣已经固定,再给开发板上电。摄像头镜头朝向只影响取景方向,不影响电气连接;实际显示方向可以通过 OV5640 的镜像和翻转寄存器调整。
5.2 下载步骤
工程入口路径以 SU200P 工作目录为基准,bit 文件夹中的文件路径以 ov5640_ddr4_tft 工程根目录为基准。
- 从
SU200P工作目录打开相对路径ov5640_ddr4_tft/ov5640_ddr4_tft.xpr; - 单击 Open Hardware Manager,选择 Open Target → Auto Connect;
- 在识别到的 FPGA 器件上选择 Program Device;
- 选择
bit/ov5640_ddr4_tft.pdi; - 若 Vivado 要求探针文件,选择同目录下与该 PDI 配套的
ov5640_ddr4_tft.ltx; - 单击 Program 完成下载;
- 松开复位按键 SW13,等待 PLL、DDR4 和摄像头依次完成启动。
如果修改了顶层参数、摄像头配置、DDR4 IP 或管脚约束,应重新综合、实现并生成 PDI,不能继续使用旧下载文件判断修改结果。
5.3 板级显示结果

<kbd>OV5640 采集画面的 TFT 显示结果</kbd>
下载完成并松开复位后,实测 TFT 能够显示 OV5640 拍摄的彩色画面。图中两个模型的轮廓、颜色和位置均能够完整呈现,显示区域没有明显错位、分屏或异常色块,表明 RGB565 数据位序和 800 × 480 显示时序与屏幕匹配。
这一结果覆盖了从摄像头到屏幕的完整数据通路:OV5640 已完成 SCCB 寄存器配置并输出 DVP 数据,DVP_Capture 能够将相邻字节组合成 RGB565 像素,DDR4 已完成初始化并承担帧缓存读写,读 FIFO 和 disp_driver 最终将像素按照 TFT 时序输出。
板级验证时还应连续观察画面,并移动摄像头或改变拍摄场景,确认显示内容能够实时更新。单张照片可以证明画面内容和颜色正确,但不能单独判断长时间运行时是否存在偶发撕裂或停帧。
正常运行时还应出现以下现象:
- PLL 锁定和 DDR4 初始化状态进入有效状态;
- OV5640 解除复位,SCCB 寄存器配置完成;
- TFT 背光打开,并显示摄像头拍摄的 800 × 480 彩色画面;
- 移动摄像头或改变拍摄场景时,屏幕内容随之更新;
- 画面应连续稳定,不应长期黑屏、明显滚动或频繁撕裂。
5.4 彩条模式辅助检查
若 TFT 没有正常显示摄像头图像,可先将顶层参数 DDR_COLORBAR_TEST 改为 1,重新生成并下载 PDI。此时系统不使用摄像头输入,而是向 DDR4 写入一帧静态彩条测试图。
若彩条能够正常显示,说明 PLL、DDR4 读写、读写 FIFO 和 TFT 输出链路基本正常,应重点检查 OV5640 供电、24 MHz XCLK、SCCB 配置以及 DVP 数据连接。若彩条仍无法显示,则应优先检查 DDR4 初始化状态、TFT 接线、显示时序和读 FIFO 是否发生欠载。完成排查后,将参数恢复为 0 并重新生成正式版本。
5.5 常见问题与处理
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| TFT 背光不亮 | TFT 供电或 TFT_pwm 接线错误 | 检查屏幕电源、地、背光控制和接口方向 |
| 背光亮但始终黑屏 | DDR4 未初始化、显示时序或 RGB 接线错误 | 检查 LED 状态,先运行彩条模式,再核对 TFT 时序与管脚 |
| 彩条正常但摄像头无画面 | OV5640 未初始化或 DVP 输入异常 | 检查 24 MHz XCLK、SCCB、复位、掉电和 DVP 排线 |
| 图像颜色异常 | RGB565 字节顺序、数据位顺序或屏幕格式不一致 | 核对摄像头输出格式、DVP_Capture 拼接顺序和 TFT RGB 位序 |
| 图像滚动或撕裂 | 帧同步、FIFO 或 DDR4 读写节奏异常 | 检查 vsync、href、FIFO 清零条件和 DDR4 校准状态 |
| 图像方向不正确 | 传感器翻转或镜像设置不符合安装方向 | 修改 OV5640 初始化表中的翻转、镜像寄存器后重新生成工程 |
6. 总结与扩展
本实验完成了从 OV5640 DVP 图像采集、RGB565 像素组合、DDR4 帧缓存到 800 × 480 并行 TFT 显示的完整链路。异步 FIFO 和 DDR4 解决了摄像头、存储器与显示端时钟不同的问题,板载 LED 和静态彩条模式则为分段排查提供了基础手段。
板级实测中,OV5640、TFT、JTAG 和开发板完成连接后,TFT 能够显示摄像头采集的完整彩色画面,未出现明显的颜色错位或画面分割,说明当前 PDI 与硬件连接可以完成实时图像采集、帧缓存和显示。
在此基础上,可以进一步加入双缓冲以减少画面撕裂,增加亮度、颜色、缩放或图像叠加处理,也可以调整 TFT 分辨率和刷新率以适配其他型号的并行显示屏。

