工程概述
本方案利用 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


