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

news2024/11/16 20:26:57

第七章 实战项目提升,完善简历

19.OV7725摄像头实时采集送HDMI显示(三)

       在详细介绍过OV7725 CMOS Sensor的相关背景知识和如何初始化其内部寄存器达到输出预期视频流的目的后,就到了该例程的核心内容即把OV7725输出的视频流预先缓存到外部DDR3颗粒,接着按照HDMI的视频格式把DDR3颗粒内存储的一帧一帧图像数据送显到屏幕上显示,如图1所示是OV7725摄像头实时采集送HDMI显示整体设计示意图,在这里大家不妨先去停下来去思考下应该怎么设计这些模块,然后这些模块之间如何进行数据交互和缓存。

图1 OV7725摄像头实时采集送HDMI显示整体设计示意图

      如图2所示是OV7725摄像头实时采集送HDMI显示功能框图,大家可以根据这个框图通过自顶向下的思路来进行具体模块划分,最后再去层层分层逐一实现每个模块的具体功能。

图2 OV7725摄像头实时采集送HDMI显示功能框图

      在这里我们可以理一理整个项目功能工程的编码思路,按照数据来源、数据流向、数据缓存、数据处理来思考。

      首先OV7725实时采集的视频流是该项目中数据来源,但对于这么大批量的跨时钟域数据如果再用XC7A35T的片内BRAM资源去缓存是远远不够用的,所以必须借助片外的DDR3内存颗粒去缓存640像素*480像素的图像视频数据;其次需要按照VGA的行场时序逻辑把DDR3中存储的每帧图像数据送显到屏幕上;再次如果这里我们同时去读写同一个地址段的DDR3内存则必然会出现帧交错的情况,这个现象完全可以从“SD卡存放图片VGA送显屏幕”例程中观察到,因为OV7725采集视频流数据写入DDR3和HDMI读取DDR3数据送显屏幕两者是相互独立的事件,所以在程序设计中需要引入乒乓操作规避,当然具体细节会在后面详细介绍;最后还要回归OmniVision的官方手册搞清楚OV7725工作在640像素*480像素RG565模式下以怎么样的形式去输出视频流,以及怎么才能把图像数据按照帧的格式完整存储到DDR3上。

  图3 OV7725 CMOS Sensor在VGA帧模式下的输出时序图

       如图3所示是OV7725 CMOS Sensor在VGA帧模式下的输出时序图,在详细介绍OV7725视频采集cmos_capture模块的时序设计前还是先来了解一些基本的概念:

       VSYNC:场同步信号,该信号由OV7725 CMOS Sensor摄像头端输出,用来标志着一帧数据的开始或者结束,如上图7-39所示VSYNC高电平作为一帧的同步信号,并在低电平时输出的数据有效,但是场同步信号可以通过物理地址为0x15的寄存器进行初始化配置的,在这里为了保持和VGA场同步信号一致,故笔者将其配置成高电平同步有效即于图中电平相反;

      HREF:行同步信号,该信号由OV7725 CMOS Sensor摄像头端输出,用于标志一行数据的开始或者结束。如上图7-39所示当HREF为高电平时图像输出有效,同样的也可以通过物理地址为0x15的寄存器进行初始化配置的,为了保持和VGA场同步信号一致,默认为高电平有效即和图中电平一致;

     D[9:0]:数据信号,该信号由OV7725 CMOS Sensor摄像头端输出,但是在RGB模式下输出中,默认只有高8位即D[9:2]是有效的;

     tPCLK:一个像素时钟的周期;

     tp:单个数据周期,请注意上图7-39中左下角所示的部分,手册里说明了在RGB模式中,tp代表2个像素时钟tPCLK。以RGB565数据格式为例,RGB565使用了16bit数据来表示一个像素点,又因为OV7725 在一个像素时钟tPCLK里只能传输8bit数据,所以需要两个时钟周期才能传输一个RGB565的像素点数据;

     tLine:摄像头输出一行数据的时间,包含了784个 tp,包含640tp个高电平和 144tp 个低电平,其中640tp为有效像素数据输出的时间,同样的以RGB565 数据格式为例,640tp 实际上是640*2=1280个tPCLK;由上图7-39可知VSYNC的上升沿作为一帧的开始,高电平同步脉冲的时间为4*tLine,接着等待18*tLine时间后HREF开始拉高,这时候输出有效数据,HREF由640tp个高电平和144tp个低电平共同构成,输出480行数据后等待8*tLine时间一帧数据传输结束,所以输出一帧图像的时间实际上是tFrame =(4+18+480+8)*tLine = 510tLine。

图4 OV7725 CMOS Sensor在RGB565模式下的时序图

       如图4所示是OV7725 CMOS Sensor在RGB565模式下的时序图,其中PCLK是OV7725 输出的像素时钟,HREF是行同步信号,D[9:2]是8位像素数据。虽然OV7725最大可以输出10位数据,但是在RGB565输出模式下只有高8位是有效的。

       像素数据在HREF是高电平时有效,第一次输出的数据为RGB565数据的高8位,而第二次输出的数据RGB565数据的低8位,由first byte 和 second byte 组成一个16位RGB565数据。

       同时可以从图中看出因为数据是在像素时钟的下降沿发生改变的,为了在数据最稳定的时刻采集图像数据,所以我们可以在像素时钟的上升沿采集数据,从OmniVision的官方手册中提取出核心信息后,下面我们就开始着手实现OV7725视频采集cmos_capture模块的代码设计了。

      如图5所示是笔者通过示波器所观察到的OV7725在RGB565模式下的VSYNC和HREF波形图,其中蓝色的是VSYNC场同步信号而黄色的是HREF行同步信号,这也和上图3波形图相对应。

图5 示波器观察到的OV7725 在RGB565模式下的VSYNC和HREF波形图

     如表1所示是cmos_capture模块的信号列表,在这个模块中我们主要去实现OV7725 的视频流采集,并把其拼接成128位数据写入FIFO再由FIFO缓存到MIG IP核中,如图6所示是OV7725视频采集模块的代码设计,在这个模块设计中也需要注意2点:

  1. 手册里指出配置寄存器生效的时间最长是300ms,大概就是摄像头输出10帧图像数据,所以这里用采集VSYNC场同步信号下降沿的方式来统计帧数,计数器计数超过10次后产生数据有效的标志开始采集图像;
  2. 像素数据在HREF是高电平时有效,第一次输出的数据为RGB565数据的高8位,而第二次输出的数据RGB565数据的低8位,所以需要进行数据拼接;

信号列表

信号名

I/O

位宽

cam_pclk

I

1

rst_n

I

1

cam_vsync

I

1

cam_href

I

1

cam_data

I

8

cmos_pixel_dout

O

128

cmos_pixel_dout_vld

O

1

表1 cmos_capture模块信号列表

图6 OV7725视频采集模块的代码设计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zotero入门教程

文章目录一、生成Bibliography二、Zotero文献自动导入1. 为什么要使用SCI-HUB2. 如何自定义PDF解析器三、在Zotero中添加Extension四、文件存储位置的修改五、markdown笔记功能一、生成Bibliography 在 Document Preferences中点击“管理样式”,就可以在Zotero Styl…

我的周刊(第075期)

我的信息周刊,记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。🎯 项目elasticvue[1]基于 Vue 的 Elasticsearch 管理客户端…

Linux常见命令 16 - 权限管理命令 chown, chgrp, umask

目录 1. 改变文件/目录所有者 chown 2. 改变文件/目录的所属组 chgrp 3. 显示文件的缺省(默认)权限 umask [-S] 1. 改变文件/目录所有者 chown 改变文件权限使用chmod,只有root和当前文件拥有者可以更改,如果想要更改目录/文件的所有者&#xff0c…

MutationObserver的示例代码的使用(附示例代码)

MutationObserver的使用 首先先介绍一下MutationObserver的特点 1.MutationObserver的回调属于微队列 2.它会在触发指定 DOM 事件时,调用指定的回调函数,说白了就是用来检测DOM节点的 MutationObserver回调函数 参数 callback 一个回调函数&#xff0…

论文投稿指南——中文核心期刊推荐(环境科学 2)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

在甲骨文云容器实例(Container Instances)上部署Oracle Linux 7 Desktop

甲骨文云推出了容器实例,这是一项无服务器计算服务,可以即时运行容器,而无需管理任何服务器。 今天我们尝试一下通过容器实例部署Oracle Linux 7 Desktop。 创建容器实例 在甲骨文容器实例页面,单击"创建容器实例"&am…

分享150个PHP源码,总有一款适合您

PHP源码 分享150个PHP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 150个PHP源码下载链接:https://pan.baidu.com/s/1PWajFunhPFyoNFGc6F4qSQ?pwd0sq5 提取码&#…

Linux rm命令详解,Linux删除文件目录

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 rm 命令一、常用操作1. 删除文件2. 删除目录二、其他操作作用:删除文件或目录 参数: -f 直接删除&#xff0c…

steam/csgo搬砖项目真的假的?

本文全文干货分享,如果你想通过steam搬砖做副业赚钱,看这一篇就够了! 这个项目是什么意思? 是不是你也很好奇这个玩法?我们先看下我们自己的数据,再来解释一下我们怎么赚的钱 一、项目原理 利用steam平台…

【Spring5源码学习】Spring基础介绍及调试环境搭建

Spring 是一款用于简化企业级 Java 应用开发的分层开源框架,有着强大的扩展和融合能力,它善于整合各种单层框架并建立起完整的体系,能高效统一的构造可提供企业级服务的应用系统。 1、Spring 概述 Spring Framework 是一个分层非常清晰并且依…

[C++]深复制与浅复制

深复制与浅复制 C中,默认的复制构造函数只能实现浅复制。 浅复制指的是在对象复制前,只对对象中的数据成员进行简单的复制 大多数情况下"浅复制"已经能很好的工作了,但是当类的数据成员中有指针类型时,浅复制只会复制指…

Gulp.Task 正解

gulp task 实现过程 今天从源码的角度分析下 gulp 中 task 的实现过程。多个 task 是如何执行??? 等等 gulp 插件分布图 其实通过上述截图可以看到,其实整个 gulp 内部什么逻辑都没有,都是由一个一个插件组成的。上述的…

Java多线程案例之单例模式(饿汉,懒汉)

目录 一、饿汉模式 二、懒汉模式 前言:单例模式是校招中最常见的设计模式之一。下面我们来谈谈其中的两个模式:懒汉,饿汉。 何为设计模式? 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多…

《Linux性能优化实战》学习笔记 Day04

06 | 锁:如何根据业务场景选择合适的锁? 原文摘抄 当你无法判断锁住的代码会执行多久时,应该首选互斥锁,互斥锁是一种独占锁。 如果你能确定被锁住的代码执行时间很短,就应该用自旋锁取代互斥锁。 对于 99% 的线程…

工信部电子标准院:龙蜥操作系统获评“优秀”

近日,工信部中国电子技术标准化研究院公布第二批通过开源项目成熟度评估的开源项目名单,龙蜥操作系统(Anolis OS)凭借在生态构建、技术创新、应用落地等方面的成熟能力与卓越表现,顺利通过评估并获得优秀贰级&#xff…

简单说说什么是真的懂一道题了

昨天写了Richard的2022年一年级入学小结后,后台有读者问我怎么算真的懂一个知识点了,今天来简单说两句,大家都知道,求123…n的和,高斯的幼年成名作。Richard同学在上中班的时候,我就给他科普过高大神的事迹…

2023牛客寒假算法基础集训营3 -- E-公平守望的灯塔(向量 简单几何)

题目如下: 示例1 输入 1 0 0 1输出 0 0说明 输出1 1也是可以的。 思路 or 题解: 我们可以迅速找到 CCC 有两个位置满足题意,但 CCC 的坐标不一定是整数,我们需要 checkcheckcheck MMM 是 ABABAB 的中点 我们可以求出来 AM→…

「栈和队列」简析

前言 前言:研究一个数据结构的时候,首先讲的是增删改查。 文章目录前言一、简介1. 结构2. 特点3. 存储二、栈1. 类比举例2. 操作3. 实现1)顺序栈(常用)a. 核心b. 要素c. 入栈d. 出栈2)链式栈三、队列1. 类比…

Spring的Aware接口讲解,内含几篇参考文章

Aware接口文章一、使用Aware与不使用Aware的效果二、ApplicationContext实例介绍Aware三、从Aware顶级接口实现自己的XXXAware一、使用Aware与不使用Aware的效果 参考文章:Spring中的aware接口 定义BeanNameAware接口 public interface BeanNameAware extends Aw…

树的应用举例——并查集和树状数组

并查集 并查集是利用森林来描述一些不相交的集合,并支持集合的合并操作和查询操作。 假设有n个元素,分为m个不相交集合,一个集合构成一棵树,同一棵树(集合)中的元素地位相等。例如下图的森林表示一个包含…