基于 OV2640 的以太网 RGMII 图像传输系统设计

news2024/11/18 17:46:07

相关文章:
(1)千兆以太网网络层 ARP 协议的原理与 FPGA 实现
(2)千兆以太网硬件设计及链路层 MAC 协议格式
(3)CRC校验原理及实现
(4)RGMII 与 GMII 转换电路设计
(5)千兆以太网网络层 IP 协议介绍与 IP 校 验和算法实现
(6)千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP发送)
(7)千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP接收)
(8)千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP回环)
(9)以太网初始化设计(MDIO 控制器)
(10)基于 OV2640 的以太网 RGMII 图像传输系统设计

文章目录

  • 前言
  • 一、UDP 协议的特点
  • 二、图像数据编码原理
  • 三、系统总体设计
  • 四、图像编码模块介绍
    • 4.1、图像编码模块作用
    • 4.2、图像编码模块功能实现
    • 4.3、仿真
  • 五、其他涉及模块说明
  • 六、顶层模块
  • 七、下载与验证


前言

本节主要讲述了一种对数据以行为单位的编码方法。该方法采用摄像头采集数据后经由 FPGA 的 RGMII 接口通过 UDP 协议实现以太网图像传输。以该方法进行 UDP 协议下的以太网图像传输,可以有效缓解 UDP 协议的差错控制缺陷带来的传输质量不佳问题。


提示:任何文章不要过度深思!万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」 ;不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人 。怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」

一、UDP 协议的特点

我们通过以太网进行数据传输时,通常对于一些对数据正确性要求较低
(允许少量丢失)但是不能有较大时延的场景,都会使用 UDP 协议。UDP 协议是传输层的一种协议,该协议具有以下特点:

  1. 提供不可靠传输。在进行数据传输时 UDP 提供尽最大努力的交付,但不保证可靠交付。
  2. 高效而无连接性。UDP 协议在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序等问题,如果因为网络原因没有传送到对端,UDP 也不会给应用层返回错误信息。但正因为 UDP 在进行发送时不需要建立连接,所以其在网络开销较小的同时工作时效也相当高。
  3. UDP 没有拥塞控制。应用层能够更好的控制要发送的数据和发送时间,网络中的拥塞控制也不会影响主机的发送速率,因此UDP协议常常被用于某些对数据发送速率有一定要求,能容忍一些数据的丢失,但是不能允许有较大的时延的场景,如直播,视频等。
  4. UDP 在现场测控领域,往往面向的是分布化的控制器、监测器等应用。现场测控领域的电磁环境往往较为复杂,基于此,现场通信中,若某一应用要将一组数据传送给网络中的另一个节点,可由 UDP 进程将数据加上报头后传送给 IP 进程。由于 UDP 协议省去了建立连接和拆除连接的过程,取消了重发检验机制,所以能够达到较高的通信速率。

正因为 UDP 协议有如上种种优点,所以可以对 UDP 协议图像传输的策略进行改进,而降低干扰的影响后,UDP 协议仍然可以作为图像传输的一种优质
方案。

二、图像数据编码原理

我们前面说过:以太网图像数据的传输通常采用 UDP 协议,图像数据在传输时一旦受到外界干扰发生数据丢失,而数据的丢失会导致图像发生断层,割裂,压缩等现象。
正因为如此,我们可以进行如下有针对性的改进后,仍保留使用 UDP 协议:如果我们对图像数据进行处理,将摄像头采集到的图像数据按照一定的编号方式例如以行为单位编号后,再通过 UDP 协议经由以太网传输到电脑,电脑接收FPGA 发送的图像数据解析后按照编号将相应的图像内容绘制到电脑显示屏的对应位置上,就能有效解决该问题。
经过该种编码方法改进,当数据在通过 UDP 协议传输的时候,理论上即使发生了少量数据丢失也不会出现断层割裂等效果。而对于图像传输显示这类场景,对于图像数据的准确性要求较低,即使一幅图像中有一两行数据的丢失,只要不是每幅图像都有该丢失情况,在每秒几十上百帧的刷新率下,其影响也极小。为了让上述理论能够更加加通俗易懂,我们结合图形,来对该理论进行讲解。
本次设计原理如图所示:
在这里插入图片描述
左边第一张为图像的写入过程,图像数据从左至右被依次写入。
第二张图为正常写入后所应展现出的画面,假设被标绿线的行在传输过程中丢失了,在未对行号进行编码的情况下,将会得到第三张图中被压缩的结果,而后续如果仍有图像传输过来,甚至可能出现两张图像重叠的情况,会影响后续图像数据的显示效果。
如果我们对每行图像数据进行编号,即使数据在传输过程中有部分行的数据丢失了,但因为序号的存在,它们仍会排列在自己所应处的位置。
举例来说:上图中,假设绿色行发生丢失,数据在显示屏上的显示画面如第四张图,被丢失的行由于没有数据,会显示黑色,即使数据丢失,图像也不会发生压缩等现象,只会在当前帧有影响,不会影响后续帧的图像。在每秒几十帧的刷新率下,一两行数据的丢失对人眼而言甚至无法识别到,或者只是看到黑线一闪而过。
在理解了本次设计最终目的的实现原理后,接下来可以开始进行工程的设
计。

三、系统总体设计

我们可以结合前面开发的内容,作如下设计。本次本次板级验证我们将在开发板上结合前面章节学习过的以太网传图工程对设计模块进行验证。
在这里插入图片描述
结合板级验证的硬件搭建环境,本章节的原理作如下对应与深化讲解:

  1. 整个系统在开始工作前,首先按照初始化 table 表对摄像头进行初始化参考基于 OV2640 的图像采集显示系统(camera_init 摄像头初始化模块)
  2. 然后对以太网芯片初始化(此模块可以不用),可参考以太网初始化设计(MDIO 控制器)
  3. 随 后 摄 像 头 将 采 集 到 的 数 据 经 由 DVP 接 口 输 送 给Camera_ETH_Formator模块,也就是本次设计的模块,该模块会根据输入数据行场同步信号的高低电平,以行为单位,对其进行编码。
  4. 随后数据进入一个双口 FIFO 中,当 FIFO 中的值足够进行一次以太网数据传输时,数据就会被发送模块读出。使用 UDP 协议将读出的数据经过 crc 校验后,经由以太网发送到 PC 机,参考千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP发送)、RGMII 与 GMII 转换电路设计
  5. PC 端使用显示软件接收 FPGA发送的包含行编号的图像数据,解析后还原为图像内容绘制在PC 机显示屏上。
    根据前面学习内容的基础,在本章,我们着重讲解图像编码模块的作用,

以上处顶层模块与Camera_ETH_Formator模块外其他模块均在相关文章中讲述,可以参考我的相关文章。

四、图像编码模块介绍

4.1、图像编码模块作用

根据前面介绍的设计思想,本次模块设计的目的是实现对图像数据以行为单位进行编号。如果实现数据以行为单位编号,就需要知道当前输入的数据位
于每帧图像数据的哪一行。对此,我们可以通过计数行场同步信号实现。
模块 Camera_ETH_Formator 在整个系统内,可以起到防止在图像显示的过
程中由于某一行数据的丢失,导致的图像压缩断层现象发生的作用。在加入了该模块后,数据会按照其排列序号一行行进行排列,即使有一行或多行数据丢失,其余行数据也会排列在自己所应处的位置。
综合以上信息,设计模块 Camera_ETH_Formator 的结构如图 :
在这里插入图片描述
其中各个信号的含义如表所示:
在这里插入图片描述
当 HREF由低电平转为高电平时,DATA开始输入到图像数据编码模块,当
HREF 从高电平转为低电平时代表一行的数据输出完成,当模块中的数据处理完成后便会产生 wrreq 信号,并输出 8 位的 wrdata 数据。
我们以 1280*720 的显示屏为例,在摄像头将采集到的 RGB565 格式数据通过以太网发送给 PC 的显示屏显示的过程中,每一行有两倍 1280 个字节即 2560字节有效数据。依照前文我们介绍的设计思想:为了让部分数据即使在丢失的情况下其余行数据也能显示在自己应处的位置,我们可以在每一行的数据前加上 2 个字节的行号。也就是说,以太网每一帧,需要发送一行的数据外加两个字节的行号。

4.2、图像编码模块功能实现

为了方便理解和设计,我们绘制了本次模块设计各个信号之间的时序图,如图图像编码模块时序图:
在这里插入图片描述
上图中:href_r1 和 href_r2 为对摄像头行同步 HREF 信号寄存后得到的信号,data_tmp 为 24 位的寄存器,用来完成对数据的移位转换。
如:时序图中 C0 时刻,当 HREF 出现上升沿时,代表数据开始输入。此时
我们可以用 HREF 与 href_r1 位拼接后的值表示,当{href_r1,HREF }的值为2’b01 时,HREF 的电平由低到高,数据开始输入;当{ href_r1,HREF }的值为2’b10 时,HREF 的电平由高到低,一行数据输入完毕,数据停止输入。
本次模块设计的目的是以行为单位,对数据进行编号,根据 HREF 的电平变化,我们可以利用计数器对行信号进行下降沿次数的累加生成行号,该部分代码实现如下:

//---------------------------------------
	//VSYNC为高电平(有效)时,每当HREF1拉低时自加1,为记录行号
	always@(posedge PCLK or negedge Rst_n)
	if(!Rst_n)
		Vcnt <= 0;
	else if(!VSYNC)
		Vcnt <= 0;
	else if({
   href_r1,HREF} == 2'b10)
		Vcnt <= Vcnt + 1'd1;
 //---------------------------------------	

代码中:Vcnt 为行号计数器,每当 HREF 电平状态由高变低时,代表一行数据输出完毕,此时我们只需使计数器自加一即可,当VSYNC信号为低电平,即代表一幅图像数据输入完成,此时将计数器清零。完成了行号的产生,接下来就是将行号写入数据中。

如时序图中所示,C0 处检测到 HREF 信号的上升沿,由于该上升沿在时钟上升沿之后才到来,所以实质上该信号是在下一个时钟上升沿到来时才被采集到。该信号被采集后,随即将行号写入 data_tmp 寄存器中。当 2 字节的行号输出完成后,再开始输出图像数据,相应的代码如下:

//---------------------------------------
	//对HREF进行计数,用于判断奇偶,对data_tmp进行数据拼接
	reg [11:0]HREF_CNT;
	always@(posedge PCLK or negedge Rst_n)
		if(!Rst_n)	
			HREF_CNT <= 0;
		else if({
   href_r1,HREF} == 2'b01)
			HREF_CNT <= HREF_CNT + 1;
		else if(href_r1)
			HREF_CNT <= HREF_CNT + 1;
		else if(!href_r1)
			HREF_CNT <= 0;
		else 
			HREF_CNT <= HREF_CNT;
			
//---------------------------------------



//---------------------------------------
	//HREF1上升沿时移位传输数据
	always@(posedge PCLK or negedge Rst_n)
		if(!Rst_n)
			data_tmp <= 0;
		else if({href_r1,HREF} == 2'b01)
			data_tmp <= {
   Vcnt[7:0],Vcnt[15:8],DATA};
		else if(HREF_CNT[

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

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

相关文章

楼宇对讲门铃的芯片选型分析

目前很多的高层住宅都使用了对讲门铃了&#xff0c;在频繁使用中&#xff0c;门铃会出现的越来越多种类&#xff0c;下面我就简单的介绍会有用到的几款芯片. 语音通话芯片&#xff1a;D34018,D34118,D5020,D31101; D34018 单片电话机通话电路&#xff0c;合并了必 需的放大器…

Postman接口测试(附教程)

前言 之前还没实际做过接口测试的时候呢&#xff0c;对接口测试这个概念比较渺茫&#xff0c;只能靠百度&#xff0c;查看各种接口实例&#xff0c;然后在工作中也没用上&#xff0c;现在呢是各种各样的接口都丢过来…

C++力扣题目347--前k个高频元素

给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: [1] 提示&#xff1a; 1 < nums.length < 105k 的取…

uniapp中uview的text组件

基本使用&#xff1a; 通过text参数设置文本内容。推荐您使用:textvalue的形式 <u--text text"我用十年青春,赴你最后之约"></u--text>设置主题&#xff1a; 通过type参数设置文本主题&#xff0c;我们提供了五类属性。primary error success warning…

Maven之插件入门

官方文档&#xff1a;https://maven.apache.org/guides/plugin/guide-java-plugin-development.html 命名规范 <yourplugin>-maven-plugin 创建项目 生成项目 方式一、IDEA 2023 方式二、命令行 mvn archetype:generate -DgroupIdcn.lsj -DartifactIdhello-maven-pl…

【EI会议征稿通知】第五届电子商务与互联网技术国际学术会议(ECIT 2024)

2023 4th International Conference on E-Commerce and Internet Technology 第五届电子商务与互联网技术国际学术会议(ECIT 2024) 电子商务是以信息网络技术为手段&#xff0c;以商品交换为中心的商业活动。在互联网开放的网络环境下&#xff0c;基于客户端/服务端应用方式&…

微信小程序添加用户隐私保护指引

微信小程序添加用户隐私保护指引 一、官方介绍二、实现效果三、实现步骤privacyPopup.jsprivacyPopup.wxmlprivacyPopup.jsonprivacyPopup.wxss首页的index.wxml首页的index.js首页的index.json 四、配置隐私协议请求参数效果 前段时间不知道大家有没有发现很多小程序都添加了用…

AlignBench:量身打造的中文大语言模型对齐评测

对齐&#xff08;Alignment&#xff09;&#xff0c;是指大语言模型&#xff08;LLM&#xff09;与人类意图的一致性。换言之&#xff0c;就是让LLM生成的结果更加符合人类的预期&#xff0c;包括遵循人类的指令&#xff0c;理解人类的意图&#xff0c;进而能产生有帮助的回答等…

Python小工具——开发一个加密解密的小应用 windows下可执行文件exe制作

前言 本篇博客是python开发的使用案例博客&#xff0c;结合一些具体的案例进行阐述&#xff0c;本篇博客介绍如何开发一个专属的加密解密windows小应用。 其他相关的博客文章如下&#xff1a; Python开发——工具篇 & Pycharm的相关配置&#xff0c;Python相关操作 &…

OpenAI GPTs 到底是怎么工作的?

▼最近直播超级多&#xff0c;预约保你有收获 今晚直播&#xff1a;《GPTs 构建应用程序案例实现》 —1— GPTs 是如何工作的&#xff1f; OpenAI 官方对 GPTs 的定义是&#xff0c;用户为特定目的创建的 ChatGPT 版本。 GPTs 结合了技能说明、外部知识库和目前可见的 GPT 的任…

【消息中间件】Rabbitmq消息可靠性、持久化机制、各种消费

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言常见用法1.消息可靠性2.持久化机制3.消息积压批量消费&#xff1a;增加 prefetch 的数量,提高单次连接的消息数并发消费&#xff1a;多部…

最广泛应用的金融风控算法-评分卡

欢迎关注主页个人介绍及相关链接&#xff0c;获取更多算法源码材料 2023数据资源入表白皮书&#xff0c;推荐系统源码下载-CSDN博客 用友BIP数据资产入表解决方案白皮书&#xff0c;推荐系统源码下载-CSDN博客 背景 信用是一切社会金融体系的根本&#xff0c;有了每个人的信…

计算机毕业设计---ssm+mysql+jsp实现的校园二手市场交易平台源码

项目介绍 本系统主要实现的功能有&#xff1a; 前台&#xff1a;&#xff08;1&#xff09;二手物品信息查看、搜索。 &#xff08;2&#xff09;学生注册登录、个人信息修改。 &#xff08;3&#xff09;二手物品信息发布、编辑。 &#xff08;4&#xff09;二手物品评论、回…

axios进行图片上传组件封装

文章目录 前言图片上传接口&#xff08;axios通信)图片上传使用upload上传头像效果展示总结 前言 node项目使用 axios 库进行简单文件上传的模块封装。 图片上传接口&#xff08;axios通信) 新建upload.js文件&#xff0c;定义一个函数&#xff0c;该函数接受一个上传路径和一…

Gateway集成方法以及拦截器和过滤器的使用

前提&#xff1a;请先创建好一个SpringBoot项目 1. 引入依赖 SpringCloud 和 alibabaCloud 、 SpringBoot间对版本有强制要求&#xff0c;我使用的springboot是3.0.2的版本。版本对应关系请看&#xff1a;版本说明 alibaba/spring-cloud-alibaba Wiki GitHub <dependency…

python脚本抢各大平台大额优惠卷

文章目录 python脚本抢各大平台大额优惠卷写在前面准备阶段一、所需工具二、ChromeDriver下载教程 三、Seleuinm安装1、打开cmd&#xff0c;输入如下命令 开始抢券淘宝脚本京东抢购脚本 python脚本抢各大平台大额优惠卷 写在前面 当电商平台上演盛大的购物狂欢时&#xff0c;如…

MongoDB ReplicaSet 部署

文章目录 前言1. 环境准备2. 生成密钥3. 配置参数4. 创建 ReplicaSet5. 副本集维护5.1 新增成员5.2 移除节点5.4 主节点降级5.5 阻止选举5.6 允许副本节点读5.7 延迟观测 6. 连接副本集 后记 前言 本篇文章介绍 MongoDB ReplicaSet 如何搭建&#xff0c;及常用的维护方法。 1…

VScode跑通Remix.js官方的contact程序开发过程

目录 1 引言 2 安装并跑起来 3 设置根路由 4 用links来添加风格资源 ​5 联系人路由的UI 6 添加联系人的UI组件 7 嵌套路由和出口 8 类型推理 9 Loader里的URL参数 10 验证参数并抛出响应 书接上回&#xff0c;我们已经跑通了remix的quick start项目&#xff0c;接下…

【JVM】虚拟机的组成+字节码文件组成+类的生命周期

什么是JVM&#xff1f; JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 JVM的功能 1.解释和运行&#xff1a;对字节码文件中的指令实时的解释成机器码让计算机执行。 2.内存管理&#xff1a;自动为对象、方法等分配内存&#xff0c;自动…

JAVA8项目升级JDK17指南

JAVA8项目升级JDK17指南 JAVA8项目升级JDK17指南一、模块化对反射的影响二、删除的内置类 JAVA8项目升级JDK17指南 随着SpringBoot2.7的发布&#xff0c;支持jdk8~jdk21。Springboot3.X发布&#xff0c;最低需要jdk17。升级jdk17是大势所趋。 参考1&#xff1a;重磅&#xff…