【一、视频处理】FPGA驱动OV7725摄像头模块

article/2025/9/13 20:37:23

使用的模块是正点原子的ov7725不带fifo的摄像头,开发板是正点原子的开拓者。


一、SCCB协议与IIC协议的不同

摄像头采用的是SCCB协议,这个协议与I2C协议很像,但是有细微的区别。差别在于

  • SCCB传输协议中,第9位为不必关心位,而IIC写传输协议位答应位
  • SCCB每次传输过程不超过3个阶段,即不能连续读写
  • SCCB读传输协议中没有重复开始的概念,在写完寄存器地址后,发起停止信号

在这里插入图片描述

在这里插入图片描述
OV7725支持不同分辨率图像的输出,包括VGA(640480)、QCVGA(320240)等。OV7725支持多种不同的数据像素格式,包括YUV(亮度参量和色度参量分开表示的像素格式)、RGB(其中RGB格式包含RGB565、RGB555)以及8位的RAW(原始图像数据)和10位的RAW。

二、OV7725图像输出时序

在这里插入图片描述

在这里插入图片描述

三、硬件接口和系统框图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、i2c_ov7725_rgb565_cfg代码

这个模块需要跟i2c_dri模块搭配一起使用,i2c_ov7725_rgb565_cfg模块复制将参数传送给i2c_dri模块,然后由i2c_dri模块完成摄像头的配置

module i2c_ov7725_rgb565_cfg(  input                clk      ,  //时钟信号input                rst_n    ,  //复位信号,低电平有效input                i2c_done ,  //I2C寄存器配置完成信号output  reg          i2c_exec ,  //I2C触发执行信号   output  reg  [15:0]  i2c_data ,  //I2C要配置的地址与数据(高8位地址,低8位数据)output  reg          init_done   //初始化完成信号);//parameter define
parameter  REG_NUM = 7'd70   ;       //总共需要配置的寄存器个数//reg define
reg    [9:0]   start_init_cnt;       //等待延时计数器
reg    [6:0]   init_reg_cnt  ;       //寄存器配置个数计数器//*****************************************************
//**                    main code
//*****************************************************//cam_scl配置成250khz,输入的clk为1Mhz,周期为1us,1023*1us = 1.023ms
//寄存器延时配置
always @(posedge clk or negedge rst_n) beginif(!rst_n)start_init_cnt <= 10'b0;    else if((init_reg_cnt == 7'd1) && i2c_done)start_init_cnt <= 10'b0;else if(start_init_cnt < 10'd1023) beginstart_init_cnt <= start_init_cnt + 1'b1;                    end
end//寄存器配置个数计数    
always @(posedge clk or negedge rst_n) beginif(!rst_n)init_reg_cnt <= 7'd0;else if(i2c_exec)   init_reg_cnt <= init_reg_cnt + 7'b1;
end         //i2c触发执行信号   
always @(posedge clk or negedge rst_n) beginif(!rst_n)i2c_exec <= 1'b0;else if(start_init_cnt == 10'd1022)i2c_exec <= 1'b1;//只有刚上电和配置第一个寄存器增加延时else if(i2c_done && (init_reg_cnt != 7'd1) && (init_reg_cnt < REG_NUM))i2c_exec <= 1'b1;elsei2c_exec <= 1'b0;    
end //初始化完成信号
always @(posedge clk or negedge rst_n) beginif(!rst_n)init_done <= 1'b0;else if((init_reg_cnt == REG_NUM) && i2c_done)  init_done <= 1'b1;  
end        //配置寄存器地址与数据
always @(posedge clk or negedge rst_n) beginif(!rst_n)i2c_data <= 16'b0;else begincase(init_reg_cnt)//先对寄存器进行软件复位,使寄存器恢复初始值//寄存器软件复位后,需要延时1ms才能配置其它寄存器//i2c_data 高8位地址,低8位为数据7'd0  : i2c_data <= {8'h12, 8'h80}; //COM7 BIT[7]:复位所有的寄存器7'd1  : i2c_data <= {8'h3d, 8'h03}; //COM12 模拟过程直流补偿7'd2  : i2c_data <= {8'h15, 8'h00}; //COM10 href/vsync/pclk/data信号控制7'd3  : i2c_data <= {8'h17, 8'h26}; //HSTART 水平起始位置7'd4  : i2c_data <= {8'h18, 8'ha0}; //HSIZE 水平尺寸7'd5  : i2c_data <= {8'h19, 8'h07}; //VSTRT 垂直起始位置7'd6  : i2c_data <= {8'h1a, 8'hf0}; //VSIZE 垂直尺寸            7'd7  : i2c_data <= {8'h32, 8'h00}; //HREF 图像开始和尺寸控制,控制低位7'd8  : i2c_data <= {8'h29, 8'ha0}; //HOutSize 水平输出尺寸7'd9  : i2c_data <= {8'h2a, 8'h00}; //EXHCH 虚拟像素MSB7'd10 : i2c_data <= {8'h2b, 8'h00}; //EXHCL 虚拟像素LSB7'd11 : i2c_data <= {8'h2c, 8'hf0}; //VOutSize 垂直输出尺寸7'd12 : i2c_data <= {8'h0d, 8'h41}; //COM4 PLL倍频设置(multiplier)//Bit[7:6]:  0:1x 1:4x 2:6x 3:8x7'd13 : i2c_data <= {8'h11, 8'h00}; //CLKRC 内部时钟配置 //Freq=multiplier/[(CLKRC[5:0]+1)*2]7'd14 : i2c_data <= {8'h12, 8'h06}; //COM7 输出VGA RGB565格式                                     7'd15 : i2c_data <= {8'h0c, 8'h10}; //COM3 Bit[0]: 0:图像数据 1:彩条测试//DSP 控制7'd16 : i2c_data <= {8'h42, 8'h7f}; //TGT_B 黑电平校准蓝色通道目标值7'd17 : i2c_data <= {8'h4d, 8'h09}; //FixGain 模拟增益放大器7'd18 : i2c_data <= {8'h63, 8'hf0}; //AWB_Ctrl0 自动白平衡控制字节07'd19 : i2c_data <= {8'h64, 8'hff}; //DSP_Ctrl1 DSP控制字节17'd20 : i2c_data <= {8'h65, 8'h00}; //DSP_Ctrl2 DSP控制字节27'd21 : i2c_data <= {8'h66, 8'h00}; //DSP_Ctrl3 DSP控制字节37'd22 : i2c_data <= {8'h67, 8'h00}; //DSP_Ctrl4 DSP控制字节4    //AGC AEC AWB        //COM8 Bit[2]:自动增益使能 Bit[1]:自动白平衡使能 Bit[0]:自动曝光功能7'd23 : i2c_data <= {8'h13, 8'hff}; //COM8 7'd24 : i2c_data <= {8'h0f, 8'hc5}; //COM67'd25 : i2c_data <= {8'h14, 8'h11};  7'd26 : i2c_data <= {8'h22, 8'h98}; 7'd27 : i2c_data <= {8'h23, 8'h03};  7'd28 : i2c_data <= {8'h24, 8'h40}; 7'd29 : i2c_data <= {8'h25, 8'h30};  7'd30: i2c_data <= {8'h26, 8'ha1};      7'd31: i2c_data <= {8'h6b, 8'haa}; 7'd32: i2c_data <= {8'h13, 8'hff};  //matrix sharpness brightness contrast UV7'd33 : i2c_data <= {8'h90, 8'h0a}; //EDGE1 边缘增强控制1//DNSOff 降噪阈值下限,仅在自动模式下有效7'd34 : i2c_data <= {8'h91, 8'h01}; //DNSOff 7'd35 : i2c_data <= {8'h92, 8'h01}; //EDGE2 锐度(边缘增强)强度上限7'd36 : i2c_data <= {8'h93, 8'h01}; //EDGE3 锐度(边缘增强)强度下限7'd37 : i2c_data <= {8'h94, 8'h5f}; //MTX1 矩阵系数17'd38 : i2c_data <= {8'h95, 8'h53}; //MTX1 矩阵系数27'd39 : i2c_data <= {8'h96, 8'h11}; //MTX1 矩阵系数37'd40 : i2c_data <= {8'h97, 8'h1a}; //MTX1 矩阵系数47'd41 : i2c_data <= {8'h98, 8'h3d}; //MTX1 矩阵系数57'd42 : i2c_data <= {8'h99, 8'h5a}; //MTX1 矩阵系数67'd43 : i2c_data <= {8'h9a, 8'h1e}; //MTX_Ctrl 矩阵控制7'd44 : i2c_data <= {8'h9b, 8'h3f}; //BRIGHT 亮度7'd45 : i2c_data <= {8'h9c, 8'h25}; //CNST 对比度            7'd46 : i2c_data <= {8'h9e, 8'h81}; 7'd47 : i2c_data <= {8'ha6, 8'h06}; //SDE 特殊数字效果控制7'd48 : i2c_data <= {8'ha7, 8'h65}; //USAT "U"饱和增益7'd49 : i2c_data <= {8'ha8, 8'h65}; //VSAT "V"饱和增益            7'd50 : i2c_data <= {8'ha9, 8'h80}; //VSAT "V"饱和增益   7'd51 : i2c_data <= {8'haa, 8'h80}; //VSAT "V"饱和增益//伽马控制 7'd52 : i2c_data <= {8'h7e, 8'h0c}; 7'd53 : i2c_data <= {8'h7f, 8'h16}; 7'd54 : i2c_data <= {8'h80, 8'h2a}; 7'd55 : i2c_data <= {8'h81, 8'h4e}; 7'd56 : i2c_data <= {8'h82, 8'h61}; 7'd57 : i2c_data <= {8'h83, 8'h6f}; 7'd58 : i2c_data <= {8'h84, 8'h7b}; 7'd59 : i2c_data <= {8'h85, 8'h86};   7'd60 : i2c_data <= {8'h86, 8'h8e}; 7'd61 : i2c_data <= {8'h87, 8'h97}; 7'd62 : i2c_data <= {8'h88, 8'ha4}; 7'd63 : i2c_data <= {8'h89, 8'haf}; 7'd64 : i2c_data <= {8'h8a, 8'hc5}; 7'd65 : i2c_data <= {8'h8b, 8'hd7}; 7'd66 : i2c_data <= {8'h8c, 8'he8}; 7'd67 : i2c_data <= {8'h8d, 8'h20}; 7'd68 : i2c_data <= {8'h0e, 8'h65}; //COM57'd69 : i2c_data <= {8'h09, 8'h00}; //COM2  Bit[1:0] 输出电流驱动能力//只读存储器,防止在case中没有列举的情况,之前的寄存器被重复改写default:i2c_data <=	{8'h1C, 8'h7F}; //MIDH 制造商ID 高8位endcaseend
endendmodule
		---晓凡 20227月于桂林书

http://chatgpt.dhexx.cn/article/IdAHEmFH.shtml

相关文章

FPGA 20个例程篇:19.OV7725摄像头实时采集送HDMI显示(三)

第七章 实战项目提升&#xff0c;完善简历 19.OV7725摄像头实时采集送HDMI显示&#xff08;三&#xff09; 在详细介绍过OV7725 CMOS Sensor的相关背景知识和如何初始化其内部寄存器达到输出预期视频流的目的后&#xff0c;就到了该例程的核心内容即把OV7725输出的视频流预先缓…

OV7725的帧率和PCLK寄存器设置

一、OV7725的PCLK的改变和以下几个寄存器有关&#xff1a; 1&#xff1a;OX0D&#xff08;COM4&#xff09;&#xff1b; ------------------------------------------------------------------------------------------------------------------ 0X0D COM4 41 …

手把手教你写Ov7725摄像头数据采集模块(带Verilog代码)

上一节咱们学习了OV7725的VGA传输协议&#xff0c;对于数据传输的特点有了初步了解&#xff0c;这篇博客主要目的在于使用Verilog实现一个OV7725摄像头的数据采集模块&#xff0c;与咱们这个模块对接的是后一级的SDRAM存储器&#xff0c;其将作为数据的缓存仓库&#xff0c;以便…

STM32+ov7725+ESP8266实现无线图传-完成上位机图像显示

一、需求 stm32f407探索者开发板和STM32F103ZET6战舰开发板。接正点原子ov5640、OV7725、OV2640摄像头,通过esp8266Wi-Fi模块(透传模式)将摄像头采集到的rgb565格式图片通过tcp/ip协议上传到上位机显示。 二、设计思路 【1】使用QT开发上位机,建立TCP服务器,接收ESP8266…

FPGA 20个例程篇:19.OV7725摄像头实时采集送HDMI显示(二)

第七章 实战项目提升&#xff0c;完善简历 19.OV7725摄像头实时采集送HDMI显示&#xff08;二&#xff09; 在正式介绍OV7725 CMOS Sensor视频采集前&#xff0c;首先需要去详细说明OV7725的寄存器配置接口&#xff0c;这里有OmniVision公司推出的官方手册 “OV7725_software_…

OV7725寄存器配置

OV7725寄存器配置&#xff08;为了替换NT99141研究了很长一段时间&#xff09; 部分参考链接&#xff1a; OV7725 电器特性和时序图&#xff1a;https://www.cnblogs.com/raymon-tec/p/5087088.html OV7725摄像头的彩色图像采集原理与液晶显示(有必要了解框图)&#xff1a;htt…

基于STM32的OV7725摄像头拍照实验

平台&#xff1a;STM32ZET6&#xff08;核心板&#xff09;ST-LINK/V2SD卡USB串口线鹰眼OV7725摄像头&#xff08;注意&#xff0c;为了减少摄像头连线的麻烦&#xff0c;建议初学者选取单片机时选用带有摄像头接口的板子&#xff09; 工程介绍&#xff1a;需要移植FatFs文件系…

OV7725鹰眼摄像头

OV7725鹰眼摄像头如何使用&#xff1f; 目前的ov7725鹰眼摄像头&#xff0c;基本上用的都是山外的库&#xff0c;所以今天我们主要根据山外的库&#xff0c;基于k60芯片&#xff0c;给大家具体的讲解。 1.摄像头初始化 首先是摄像头的第一步就是初始化&#xff0c;这个我们直…

OV7725摄像头图像采集基础知识

目前FPGA用于图像采集 传输 处理 显示应用越来越多&#xff0c;主要原因是图像处理领域的火热以及FPGA强大的并行处理能力。本文以OV7725为例&#xff0c;对摄像头使用方面的基础知识做个小的总结&#xff0c;为后续做个铺垫。 XCLK:工作时钟输入&#xff0c;由主控器产生&…

FPGA--OV7725摄像头采集与VGA显示实验--1--OV7725使用与驱动协议

目录 前言 OV7725引脚及功能框图 参数指标 引脚 功能框图 SCCB时序及读写操作 SCCB时序特点 读写实现 OV7725寄存器常用配置参数 前言 摄像头采集是图像处理的第一步&#xff0c;本章节分为多部分&#xff0c;旨在让大家学会如何使用OV7725采集图像&#xff0c;并且…

【FPGA的基础快速入门22-------OV7725摄像头模块】

OV7725摄像头模块 OV7725是Omni Vision&#xff08;豪威科技&#xff09;公司生产的CMOS图像传感器&#xff0c;该传感器功耗低、可靠性高以及采集速率快&#xff0c;主要应用在玩具、安防监控、电脑多媒体等领域。 OV7725感光阵列达到640*480&#xff0c;能实现最快60fps VGA…

STM32 OV7725 传感器

目录 OV7725 传感器1、选择输出格式2、选择输出分辨率3、帧率调整4、夜间模式5、消除光带6、白平衡7、缺陷像素矫正8、黑电平矫正9、视频模式10、数字缩减 OV7725 函数1、光模式2、颜色饱和度3、亮度4、对比度5、特效 OV7725 设置参考 OV7725 传感器 OV7725摄像机™ 图像传感器…

OV7725摄像头之OV7725芯片

近日入手了一块正点原子家的OV7725摄像头模块&#xff0c;秉着小白尽可能学得透彻些的想法&#xff0c;选择了野火家的相同摄像头教学视频。链接如下&#xff1a;【单片机】野火STM32F103教学视频 (配套霸道/指南者/MINI)【全】(刘火良老师出品) (无字幕)_哔哩哔哩_bilibili 现…

二进制加法运算

两个二进制整数相加时&#xff0c;是位对位处理的&#xff0c;从最低的一对位&#xff08;右边&#xff09;开始&#xff0c;依序将每一对位进行加法运算。两个二进制数字相加&#xff0c;有四种结果&#xff0c;如下所示&#xff1a; 0 0 00 1 11 0 1 1 1 10 1 与 1 …

二进制加减法编程

1、二进制加法基本指令 &#xff08;1&#xff09;ADD指令 格式&#xff1a;ADD DST&#xff0c;SRC 该指令把源操作数&#xff08;SRC&#xff09;指向的数据与目的操作数&#xff08;DST&#xff09;相加后&#xff0c;将结果放到目的操作数&#xff08;DST&#xff09;中…

二进制乘除法运算原理

二进制乘除法原理 计算机所能完成的最基本操作是加减法和左右移。 虽然ISA中一般都有MUL类指令&#xff0c;但是这些经过译码之后最终的元操作还是加法和移位指令。 二进制乘法 假设不能使用乘除运算求ab的结果&#xff0c;当ab123时&#xff0c;最直接的方法是通过88个88相…

二进制加法计算

读计算机原理这本书的的时候涉及到二进制数的加法&#xff0c;个人做个直观的记录&#xff0c;防止遗忘。 计算时&#xff0c;先把两个二进制数对齐&#xff08;如同十进制一样&#xff0c; 从右向左&#xff09;11为10&#xff0c;此时向上一位进1,0写在本位&#xff08;如同十…

二进制加减乘除

最重要的,理解十进制的借位和进位.十进制中,由于一个循环是10,所以借1位,就相当于从高位借过来10,也就是常说的借1当10,同时,高位需要减去10(外在体现上是减去1,因为高位已经在高位了).反过来,进1,就等于高位加上10,但因为高位已经在高位了,所以去掉位数考虑,高位实际是加1,也就…

二进制加法

计算机中二进制相关运算 有符号二进制与无符号二进制数之间的区别有符号二进制加法运算讨论关于有符号二进制数算术的溢出问题&#xff08;重点&#xff09;无符号二进制运算 有符号二进制与无符号二进制数之间的区别 对于一个有符号二进制数来讲&#xff0c;最高位是该数的符…

二进制加减法计算

二进制加减法&#xff1a;原码、反码、补码 1.十进制下的计算1.模数2.补数 2.二进制数的存储1.计算机计数2.原码3.反码4.补码 3.二进制计算1.中位对称2.循环进位3.二进制减法推算4.结论 1.十进制下的计算 1.模数 假设下文【模】定义如下&#xff1a;某个可度量系统的度量范围…