OV5640摄像头的数据处理配置流程(一)
module RGB_init(
//系统信号输入(时钟+复位)
input cmos_clk_i, //模块控制时钟
input rst_n_i, //系统复位信号
//OV5640输出信号(从5640输入到FPGA)
input cmos_pclk_i, //摄像头时钟
input cmos_href_i, //帧输出行同步信号
input cmos_vsync_i, //场同步信号
input [:] cmos_data_i, //像素数据
//模块的输出信号
output clk_ce, //摄像头帧数据输出/捕获使能信号(12Mhz),该信号的理解是最难的
output de_o, //数据有效信号
output [:] rgb_o, //输出的24bit像素数据
output vs_o, //输出的场同步信号
output hs_o, //输出的行同步信号
//输出道5640模块的像素时钟
output cmos_xclk
); //为了保持系统稳定,需要丢弃前期一部分帧图像,此处选择丢弃15个,自行选择,也有10个的
parameter[:]CMOS_FRAME_WAITCNT=; assign cmos_xclk=cmos_clk_i; //xclk为5640驱动时钟,为24/25Mhz //在米联客的对复位信号的处理中,复位信号延迟了5个时钟,好像不延迟也可以,可以在例程2中查看
//个人认为复位信号的处理是为了使复位信号保持一个完整的信号周期
reg[:]rst_n_reg='d0;
always@(posedge cmos_clk_i) //同步于FPGA输入时钟
begin
rst_n_reg<={rst_n_reg[:],rst_n_i};
end reg cmos_href_r='b0; //将行同步信号进行缓存
reg [:]cmos_vsync_r; //将场同步信号进行缓存
reg[:]cmos_data_r; //将5640输出到FPGA的数据进行寄存,因为是处理输出16bit,就是将两个周期的输入信号进行拼接处理
//进行行、场同步信号进行缓存,输入数据进行一级缓存
always@(posedge cmos_pclk_i)
begin
cmos_vsync_r<=cmos_vsync_i;
cmos_href_r<=cmos_href_i;
cmos_data_r<=cmos_data_i;
end //为了判断一帧数据的开始&结束,同时对帧进行计数,对场同步信号进行寄存
reg [:]cmos_vsync_d;
always@(posedge cmos_pclk_i) //同步于5640输出时钟
begin
cmos_vsync_d<={cmos_vsync_d[],cmos_vsync_r};
end
//场开始与结束信号
wire vs_start;
assign vs_start=(!cmos_vsync_d[])&(cmos_vsync_d[]); //posedge mark the action
wire vs_end;
assign vs_end=(cmos_vsync_d[])&(!cmos_vsync_d[]); //行同步信号缓存
reg [:]cmos_href_d='d0;
always@(posedge cmos_pclk_i)
begin
cmos_href_d<={cmos_href_d[],cmos_href_r};
end //前期丢弃部分帧
reg [:]frame_cnt=; //帧计数器
reg out_en=; //开始正常启动操作
always@(posedge cmos_pclk_i)
if(!rst_n_reg[])
begin
frame_cnt<='d0;
out_en<='b0;
end
else begin
if(vs_start) begin
frame_cnt<=frame_cnt+;
out_en<=;
end
else if(frame_cnt>=CMOS_FRAME_WAITCNT)
begin
out_en<=;
frame_cnt<=CMOS_FRAME_WAITCNT; //保持正常帧处理完毕
end
end
//由于输出的是24bit数据,是由16bit数据转化而来,将两个帧的RGB数据进行拼接
reg href_cnt=;
reg data_en='b0;
reg [:]RGBm='d0; //middle RGB data always@(posedge cmos_pclk_i)begin
if(!rst_n_reg[])begin
href_cnt<=;
data_en<='b0;
RGBm<='d0;
end
//两个数据拼接完毕之后将data_en置一,第0次拼接使低8位有效,第1次使得低八位有效(位移)
else begin
href_cnt<=(cmos_href_r)?href_cnt+'b1:href_cnt;
data_en<=(href_cnt==);
if(href_cnt) RGBm<={RGBm[:],cmos_data_r}; //此处cmos_data_r lag 2 clocks,thus later all lag 2clks
end
end assign rgb_o={RGBm[:],'d0,RGBm[10:5],2'd0,RGBm[:],'d0};
//模块行同步输出
assign hs_o=out_en?(cmos_href_d[]):; //为了与暑促信号同步,该同步信号是滞后两个pclk
//模块场同步信号输出
assign vs_o=out_en?(cmos_vsync_r):; //行同步结束之后开始场同步,场同步信号知乎一个pclk,觉得这个程序真的很nb,考虑的太全了
//模块数据输出同步时钟信号,12M,
assign de_o=out_en?data_en:;
//输出时钟enable signal
assign clk_ce=out_en?((data_en&hs_o)||!hs_o):; //其实好像1也行,没有边沿驱动
//在init complete的情况下,d0是经过了2个pclk延迟的,该output信号同步(更准确地说是对齐)于这个数据输入时的时钟,
//同步于12Mhz的data_en时钟
//该模块每2个pclk输出一次rgb[23:0]的数据,需要听过clk_ce对时钟频率进行同步,该处理解决了模块接口之间的同步问题
/*
举例说明:
在do==0时,clk_ce恒为高,没有时钟脉冲
在do==1时,该时钟始终同步于12M时钟
*/
endmodule
OV5640摄像头的数据处理配置流程(一)的更多相关文章
- FPGA配置OV5640摄像头及RGB图像数据采集
		本文设计思想采用明德扬至简设计法.在做摄像头数据采集处理之前,需要配置OV5640传感器内部寄存器使其按要求正常工作,详细内容请参见<OV5640自动对焦照相模组应用指南>.首先要关注OV ... 
- OV5640摄像头配置一些值得注意的关键点(三)
		一.字节标志的注意点 由于摄像头的输出是RGB56格式,所以需要将两帧的数据进行拼接,之后送到上位机进行显示. reg byte_flag; always@(posedge cmos_pclk_i) ... 
- 第46章 	DCMI—OV5640摄像头—零死角玩转STM32-F429系列
		第46章 DCMI—OV5640摄像头 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com ... 
- ov5640摄像头设备驱动
		http://www.cnblogs.com/firege/p/5806121.html (驱动大神) http://blog.csdn.net/yanbixing123/article/detai ... 
- 利用AXI VDMA实现OV5640摄像头采集
		利用AXI VDMA实现OV5640摄像头采集 导读:摄像头采样图像数据后经过VDMA进入DDR,通过PS部分控制,经过三级缓存,将DDR中保持的图形数据通过VDMA发送出去.在FPGA的接收端口产生 ... 
- QT特供 CGAL配置流程(基于QT5+VS2015)
		最近做的QT项目涉及计算几何库,需要用到CGAL,其配置着实麻烦,而且相互关联的软件也存在版本兼容一类的问题,在这里就对其配置流程做一些整理说明,以便后来者能够少些烦恼.(注:以下使用Win10作说明 ... 
- 转载-Linux下svn搭建配置流程
		Linux下svn搭建配置流程 一. 源文件编译安装.源文件共两个,为: 1. 下载subversion源文件 subversion-1.6.1.tar.gz http://d136 ... 
- win10下vagrant+centos7 rails虚拟开发机配置流程
		此文写于2017.8.21 在写本文前,笔者已经尝试了多种其他的替代方法,例如wmware虚拟机安装kylin.然而发现总是还有各种问题.经大佬指点安装了virtualbox + vagrant.于是 ... 
- HI3531的DDR3配置流程
		DDR3 初始化配置流程 系统上电之后,必须先完成DDR3 SDRAM 的初始化操作,系统才能访问DDR3 SDRAM.在进行初始化之前需要注意以下几点: 对DDR3 SDRAM 进行上电操作时,需要 ... 
随机推荐
- Thinkphp5.0第四篇
			删除数据 当前模型删除 $user=UserModel::get(1); if($user->delete()){return '删除成功';} else{return '删除失败';} 根据主 ... 
- 每个新手程序员都必须知道的Python技巧
			当下,Python 比以往的任何时候都更加流行,人们每天都在实践着 Python 是多么的强大且易用. 我从事 Python 编程已经有几年时间了,但是最近6个月才是全职的.下面列举的这些事情,是我最 ... 
- 【JavaScript】使用纯JS实现多张图片的懒加载(附源码)
			一.效果图如下 上面的效果图,效果需求如下 1.还没加载图片的时候,默认显示加载图片背景图 2.刚开始进入页面,自动加载第一屏幕的图片 3.下拉界面,当一张图片容器完全显露出屏幕,即刻加载图片,替换背 ... 
- centos8安装图解
			CentOS 8 的新特性 DNF 成为了默认的软件包管理器,同时 yum 仍然是可用的 使用网络管理器(nmcli 和 nmtui)进行网络配置,移除了网络脚本 使用 Podman 进行容器管理 引 ... 
- MySQL基础(三)多表查询(各种join连接详解)
			Mysql 多表查询详解 一.前言 二.示例 三.注意事项 一.前言 上篇讲到Mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有哪些 ... 
- PMP(第六版)中的控制账户、规划包、工作包
			PMP(第六版)中的控制账户.规划包.工作包 控制账户是一个管理控制点,在该控制点上,把范围.预算和进度加以整合,并与挣值比较,以测量绩效.控制账户拥有2个或以上的工作包,但每个工作包只与一个控制账户 ... 
- Canvas动画基础之碰撞检测
			在Canvas中进行碰撞检测,大家往往直接采用游戏引擎(Cocos2d-JS.Egret)或物理引擎(Box2D)内置的碰撞检测功能,好奇的你有思考过它们的内部运行机制吗?下面将针对基本的碰撞检测技术 ... 
- [NOIp2013] luogu P1970 花匠
			scy居然开网了. 题目描述 你有一个序列 aaa,你需要保留尽量多的数,使得剩下的数满足以下条件中的一个: ∀x∈[2,n−1]∩N∗\forall x\in[2,n-1]∩\N^*∀x∈[2,n− ... 
- TensorFlow2.0(8):误差计算——损失函数总结
			.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ... 
- bcache 状态/配置 文件详细介绍(翻译自官网)
			声明: 文中 斜体带下划线 的段落为翻译不够准确的段落 原文:https://www.kernel.org/doc/Documentation/bcache.txt 官网:https://bcach ... 
