跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言算法

基于 FPGA 的 OV5640 摄像头视频采集与 VGA 显示实现

FPGA 设计流程涵盖 OV5640 初始化、DVP 数据采集、RAM 缓存及 VGA 显示输出。通过 SCCB 协议配置摄像头寄存器,利用 DVP 接口接收 RGB565 数据并暂存于 BlockRAM,最后由 VGA 控制器按标准时序输出至屏幕。实测中发现画面撕裂与边缘切割问题,主要源于 RAM 读写同步不足及帧同步逻辑偏差,建议采用双缓冲机制优化。

怪力乱神发布于 2026/4/10更新于 2026/7/2540 浏览
基于 FPGA 的 OV5640 摄像头视频采集与 VGA 显示实现

工程概述

本方案利用 FPGA 完成 OV5640 摄像头的视频数据采集,并通过 VGA 接口输出至显示器。系统主要包含四个核心模块:OV5640 初始化、DVP 接口数据采集、图像数据缓存以及 VGA 控制器。设计遵循模块化思想,便于调试与维护。

OV5640 初始化

SCCB 控制器

OV5640 的配置寄存器需要通过 SCCB 协议进行读写。虽然 SCCB 与 I2C 时序相似且兼容,但在实际工程中,针对特定芯片的时序细节单独设计控制器更为稳妥。SCCB 控制器负责处理起始位、地址传输、应答信号及停止位的生成,支持读写操作。

`timescale 1ns / 1ps // 适用于 ov5640 SCCB 通信 寄存器(字节)地址 16 位,数据 8 位
module SCCB_ctrl(
    input wire clk,          // 系统时钟 100MHz
    input wire rst_n,        // 复位
    inout wire sda,          // 双向数据线
    output wire scl,         // 输出时钟线
    input wire rw_ctrl,      // 读写使能信号(0 写 1 读)
    input wire work_start,   // SCCB 启动信号
    input wire [6:0] slave_addr, // 7bit 从设备地址
    input wire [15:0] byte_addr, // 16bit 字地址
    input wire [7:0] w_data,   // 8bit 待写数据
    output reg [7:0] r_data,   // 8bit 读取数据
    output reg work_done       // SCCB 读写完成信号
);
    // ... (状态机逻辑省略,保留核心结构) ...
    // 状态机参数定义
    localparam IDLE = 5'd0, START = 5'd1, W_SLAVE_ADDR = 5'd2, ACK1 = 5'd3;
    // ... 其他状态定义 ...
    // 状态机控制逻辑
    always @(posedge clk or negedge rst_n)
    begin
        if (!rst_n)
            state <= IDLE;
        else case(state)
            // ... 状态跳转逻辑 ...
        endcase
    end
endmodule

初始化数据表

配置摄像头寄存器需参考用户手册。本设计通过状态机控制初始化流程,依次完成复位、延时、寄存器写入等操作。初始化数据存储在 data 数组中,涵盖分辨率设置(640x480)、格式配置(RGB565)、自动曝光(AEC)及白平衡(AWB)等参数。

//ov5640 寄存器初始化配置参数 : 分辨率 640*480 30fps RGB565 格式
`timescale 1ns / 1ps
module ov5640_initial_table#(
    parameter IMAGE_WIDTH = 16'd640,
    parameter IMAGE_HEIGHT = 16'd480,
    parameter IMAGE_FLIP_EN = 1'b0,
    parameter IMAGE_MIRROR_EN = 1'b0
)(
    input wire clk,
    input wire rst_n,
    input wire initial_start,
    input wire work_done,
    output reg work_start,
    output reg [23:0] initial_data,
    output reg initial_done
);
    localparam DATA_SIZE = 9'd257;
    localparam DELAY_5ms = 20'd500_000;
    // ... 状态机与数据表定义 ...
    initial begin
        data[0] = 24'h3103_11; // system clock from pad
        data[1] = 24'h3008_82; // software reset
        // ... 后续寄存器配置 ...
    end
endmodule

DVP 数据采集

摄像头配置完成后开始输出图像数据。DVP 接口接收像素时钟(PCLK)、行同步(HREF)和场同步(VSYNC)信号。模块内部对输入数据进行拼接,将 YUV 或 RAW 数据转换为 RGB565 格式,并生成有效的写地址和写使能信号。

`timescale 1ns / 1ps
module DVP_ctrl#(
    parameter PIC_CNT_MAX = 8'd10 // 舍弃前 10 帧不稳定图像数据
)(
    input wire rst_n,
    input wire ov5640_pclk,
    input wire ov5640_href,
    input wire ov5640_vsync,
    input wire [7:0] ov5640_data,
    output reg [15:0] RGB565_data,
    output wire data_valid,
    output reg [16:0] w_addr
);
    reg pix_flag;
    wire pic_flag;
    reg pic_valid;
    reg [7:0] pic_cnt;
    // ... 信号打拍与计数逻辑 ...
    // 场同步检测
    assign pic_flag = ((ov5640_vsync_delay == 1'b0) && (ov5640_vsync == 1'b1)) ? 1'b1 : 1'b0;
    // 行同步与数据拼接
    always @(posedge ov5640_pclk or negedge rst_n)
    begin
        if (!rst_n)
            pix_flag <= 1'b0;
        else if (ov5640_href)
            if (!pix_flag)
                pix_flag <= 1'b1;
            else
            begin
                RGB565_data <= {r_ov5640_data , ov5640_data};
                pix_flag <= 1'b0;
            end
    end
endmodule

RAM 数据缓存

由于摄像头输出速率与 VGA 显示刷新率不同步,且需要保证帧数据的完整性,必须引入缓存机制。虽然工程演示中使用了 BlockRAM,但在实际高分辨率应用中,通常建议采用 DDR/SDRAM 以提供更大的带宽和容量。

本设计显示区域为 350x218,数据格式为 RGB565(16 位),因此 RAM 深度至少需满足 350 * 218 = 76,300 个存储单元。BlockRAM 配置时需注意读写时钟域的处理,避免跨时钟域问题导致的数据错误。

VGA 控制器

VGA 控制器负责生成标准的 VGA 时序信号(HSYNC, VSYNC),并从 RAM 中读取像素数据驱动显示器。设计需严格匹配 640x480@60Hz 的时序参数,包括水平/垂直同步脉冲宽度、前后沿时间等。

`timescale 1ns / 1ps
module VGA_ctrl#(
    parameter DISP_WIDTH = 12'd256,
    parameter DISP_HEIGTH = 12'd160
)(
    input wire clk,
    input wire rst_n,
    input wire [15:0] data_in,
    output wire hsync,
    output wire vsync,
    output reg [15:0] RGB,
    output reg [16:0] data_addr
);
    reg [11:0] h_cnt;
    reg [11:0] v_cnt;
    // 640*480@60Hz 25.175MHz VGA 时序参数
    localparam H_SYNC = 12'd96, H_BACK = 12'd40, H_LEFT = 12'd8, H_DATA = 12'd640;
    localparam V_SYNC = 12'd2, V_BACK = 12'd25, V_LEFT = 12'd8, V_DATA = 12'd480;
    // ... 计数器与同步信号生成 ...
    assign hsync = (h_cnt < H_SYNC) ? 1'b0 : 1'b1;
    assign vsync = (v_cnt < V_SYNC) ? 1'b0 : 1'b1;
    // 坐标计算与数据输出
    assign disp_area = (pix_x >= (H_DATA - DISP_WIDTH )/2 && pix_x < (H_DATA + DISP_WIDTH )/2 
                        && pix_y >= (V_DATA - DISP_HEIGTH)/2 && pix_y < (V_DATA + DISP_HEIGTH)/2 );
endmodule

顶层模块集成

顶层模块将上述子模块实例化,并加入按键消抖与时钟 IP 核。按键用于触发摄像头初始化,时钟 IP 生成准确的 VGA 驱动时钟(约 25.2MHz)。注意各模块间的信号连接,特别是 RAM 的读写端口需分别对应 DVP 时钟和 VGA 时钟。

`timescale 1ns / 1ps
module TOP(
    input wire sys_clk,
    input wire ov5640_pclk,
    input wire ov5640_vsync,
    input wire ov5640_href,
    input wire [7:0] ov5640_data,
    input wire rst_n,
    input wire start,
    inout wire sda,
    output wire scl,
    output wire initial_done,
    output wire hsync,
    output wire vsync,
    output wire[3:0] red,
    output wire[3:0] green,
    output wire[3:0] blue
);
    // 信号声明与模块实例化
    // ... 具体实例化代码 ...
endmodule

效果与优化

系统运行后,VGA 显示屏中心区域可正常显示视频画面。实测发现画面存在轻微撕裂感,这通常是由于 RAM 读写未完全同步导致的单帧内出现两帧数据混合。此外,右侧画面部分被切割到左侧,表明帧同步信号可能存在偏差。

针对上述问题,建议引入双缓冲(Ping-Pong Buffer)机制,确保一帧数据完整写入后再切换读取;同时检查 VSYNC 信号的边缘检测逻辑,确保帧计数准确。降低摄像头输出帧数也能在一定程度上缓解撕裂现象,但最佳方案仍是完善内存管理策略。

目录

  1. 工程概述
  2. OV5640 初始化
  3. SCCB 控制器
  4. 初始化数据表
  5. DVP 数据采集
  6. RAM 数据缓存
  7. VGA 控制器
  8. 顶层模块集成
  9. 效果与优化
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 宇树机器人 SDK2 开发指南:环境搭建与 Demo 测试
  • 用 Tauri 2.0 搓一个 5MB 的股票盯盘小窗
  • 国内 Stable Diffusion 与 LLaMA 模型镜像站推荐及下载加速指南
  • 国内主流AI大模型企业及产品布局解析
  • 钉钉 AI 助手集成指南:构建智能办公机器人
  • FPGA 入门指南:从点亮 LED 开始
  • STL-thumbnail:Windows 资源管理器 STL 文件预览方案
  • FLUX.1-dev 与 Stable Diffusion 深度对比:画质、速度与实战体验
  • 基于统一接口的大模型成本优化与选型实践
  • 算法方向选题推荐:机器学习/深度学习/数据挖掘
  • agent-browser:Vercel 开源的 AI 智能体浏览器自动化 CLI 工具
  • MySQL Workbench 导入 SQL 文件操作指南
  • VSCode 本地部署 DeepSeek 模型实现私有化 AI 编码辅助
  • 黑客与程序员的本质区别及核心技能树解析
  • Llama-3.2-3B 部署优化:Ollama 上下文窗口与 Token 限制配置
  • 基于 AI 分类器与飞书机器人的智能工单系统搭建
  • 《人工智能的底层逻辑》:清华大学 AI 通识经典
  • 基于 LangChain 的 RAG 与对话记忆实现
  • Lychee多模态重排序模型:AR场景下3D模型与操作指南匹配
  • DeepSeek-R1-Distill-Llama-8B 模型 Ollama 部署及 HTTP API 鉴权配置

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online