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摄像头的数据处理配置流程(一)的更多相关文章

  1. FPGA配置OV5640摄像头及RGB图像数据采集

    本文设计思想采用明德扬至简设计法.在做摄像头数据采集处理之前,需要配置OV5640传感器内部寄存器使其按要求正常工作,详细内容请参见<OV5640自动对焦照相模组应用指南>.首先要关注OV ...

  2. OV5640摄像头配置一些值得注意的关键点(三)

    一.字节标志的注意点 由于摄像头的输出是RGB56格式,所以需要将两帧的数据进行拼接,之后送到上位机进行显示. reg byte_flag; always@(posedge cmos_pclk_i) ...

  3. 第46章 DCMI—OV5640摄像头—零死角玩转STM32-F429系列

    第46章     DCMI—OV5640摄像头 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com ...

  4. ov5640摄像头设备驱动

    http://www.cnblogs.com/firege/p/5806121.html  (驱动大神) http://blog.csdn.net/yanbixing123/article/detai ...

  5. 利用AXI VDMA实现OV5640摄像头采集

    利用AXI VDMA实现OV5640摄像头采集 导读:摄像头采样图像数据后经过VDMA进入DDR,通过PS部分控制,经过三级缓存,将DDR中保持的图形数据通过VDMA发送出去.在FPGA的接收端口产生 ...

  6. QT特供 CGAL配置流程(基于QT5+VS2015)

    最近做的QT项目涉及计算几何库,需要用到CGAL,其配置着实麻烦,而且相互关联的软件也存在版本兼容一类的问题,在这里就对其配置流程做一些整理说明,以便后来者能够少些烦恼.(注:以下使用Win10作说明 ...

  7. 转载-Linux下svn搭建配置流程

    Linux下svn搭建配置流程     一.    源文件编译安装.源文件共两个,为: 1.   下载subversion源文件 subversion-1.6.1.tar.gz http://d136 ...

  8. win10下vagrant+centos7 rails虚拟开发机配置流程

    此文写于2017.8.21 在写本文前,笔者已经尝试了多种其他的替代方法,例如wmware虚拟机安装kylin.然而发现总是还有各种问题.经大佬指点安装了virtualbox + vagrant.于是 ...

  9. HI3531的DDR3配置流程

    DDR3 初始化配置流程 系统上电之后,必须先完成DDR3 SDRAM 的初始化操作,系统才能访问DDR3 SDRAM.在进行初始化之前需要注意以下几点: 对DDR3 SDRAM 进行上电操作时,需要 ...

随机推荐

  1. 教你使用Cocos Creator制作国旗头像生成器,附源码!

    关注「编程小王子」公众号回复[头像生成器]获得源码! 下面我重点介绍一下Cocos Creator H5头像生成的实现方法: 获取手机相册图片 在 Cocos Creator 中加载相册图片 Coco ...

  2. 快学Scala 第一课 (变量,类型,操作符)

    Scala 用val定义常量,用var定义变量. 常量重新赋值就会报错. 变量没有问题. 注意:我们不需要给出值或者变量的类型,scala初始化表达式会自己推断出来.当然我们也可以指定类型. 多个值和 ...

  3. 后端开发实践系列之四——简单可用的CQRS编码实践

    本文只讲了一件事情:软件模型中存在读模型和写模型之分,CQRS便为此而生. 20多年前,Bertrand Meyer在他的<Object-Oriented Software Constructi ...

  4. 从0开始学FreeRTOS-(消息队列)-5

    ## 问题解答 曾经有人问我,FreeRTOS那么多API,到底怎么记住呢? 我想说,其实API不难记,就是有点难找,因为FreeRTOS的API很多都是带参宏,所以跳来跳去的比较麻烦,而且注释也很多 ...

  5. 为什么那么多自学JAVA的后来都放弃了?总结起来就这些原因

    目前信息化产业发展势头很好,互联网就成为了很多普通人想要涉及的行业,因为相比于传统行业,互联网行业涨薪幅度大,机会也多,所以就会大批的人想要转行来学习Java开发. 目前来讲市场上需要的Java人员非 ...

  6. JAVA阻塞(IO)和非阻塞(NIO)

    查看这篇文章,了解更多关于Java的阻塞和非阻塞替代创建套接字的信息. 套接字使用TCP / IP传输协议,是两台主机之间的最后一块网络通信. 您通常不必处理它们,因为它们之上构建了协议,如HTTP或 ...

  7. Vue3都使用Proxy了,你更应该了解Proxy

    vue3.0的pre-alpha版代码已经开源了,就像作者之前放出的消息一样,其数据响应这一部分已经由ES6的Proxy来代替Object.defineProperty实现,感兴趣的同学可以看其实现源 ...

  8. [Luogu3070][USACO13JAN]岛游记Island Travels

    题目描述 Farmer John has taken the cows to a vacation out on the ocean! The cows are living on N (1 < ...

  9. Zeebe服务学习5-多实例特性实践

    一.背景 在0.21版本之前,Zeebe不支持多实例元素,在2019年10月9号发布的0.21版本中,加入这一特性, 主要是体现在Zeebe Modeler 0.7.0以及之后的版本中. 二.特性介绍 ...

  10. std::wstring

    std::wstring主要用于 UTF-16编码的字符, std::string主要用于存储单字节的字符( ASCII字符集 ),但是也可以用来保存UTF-8编码的字符. UTF-8和UTF-16是 ...