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 进行上电操作时,需要 ...
随机推荐
- 快学Scala 第十七课 (trait 入门)
trait 入门: trait类似于java的接口,不过比java接口功能更强大,可以有实体成员,抽象成员,实体方法,抽象方法. 如果需要混入的特质不止一个用with关键字. 带有特质的对象:(特质可 ...
- 【WPF】EntityframeworkCore NLog出力设置
最近在用EFcore,由于不熟悉,经常出现一些异常都不知道如何排查,只能把EFcore的执行记录打印出来调查.确实简化了很多问题的调查. 官网提供了Asp.net Core与.net core 应用的 ...
- python编程基础之二十六
偏函数:当一个函数有大量的参数时候,调用时候非常不方便,于是就可以用偏函数解决,将一些参数固定(默认值),达到简化函数调用的目的 使用偏函数需要导入functools import functools ...
- java集合类之ArrayList详解
一.ArrayList源码分析 1.全局变量 (1)默认容量(主要是通过无参构造函数创建ArrayList时第一次add执行扩容操作时指定的elementData的数组容量为10) private s ...
- unittest生成测试报告
1.先导入HTMLTestRunner模块 2.实例一脚本如下 #coding=utf-8 import unittest import HTMLTestRunner #封装批量执行用例 def al ...
- Ubuntu16.04换源
换成国内最快的阿里云源 第一步:备份原来的源文件 cd /etc/apt/ 然后会显示下面的源文件sources.list 输入命令 sudo cp sources.list sources.list ...
- 生产环境下,MySQL大事务操作导致的回滚解决方案
如果mysql中有正在执行的大事务DML语句,此时不能直接将该进程kill,否则会引发回滚,非常消耗数据库资源和性能,生产环境下会导致重大生产事故. 如果事务操作的语句非常之多,并且没有办法等待那么久 ...
- c使用二叉链表创建二叉树遇到的一些疑问和思考
二叉链表存储二叉树 学习的时候参考的是<大话数据结构>,书中是这样定义的 typedef char TElemType; typedef struct BiTNode { TElemTyp ...
- Halcon一日一练:图像设备介绍
Halcon在设计之初就提供了完整的图像采集方案,适应了多种图像设备采集图像,以及各种不同环境的采集方案. 通常情况下,图像的采集应该是所有机器视觉项目首要解决的任务,不幸的是,需要解决图像采集的问题 ...
- Ubuntu中用户名密码和root密码修改
用户名密码和root密码不是同一个密码 重置(修改)root密码 ubuntu的root初始密码是随机的,每次开机都有一个新的root密码修改方法如下: 1.sudo passwd root 2.此处 ...