【ZYNQ入门】第九篇、双帧缓存的原理

目录

第一部分、基础知识

 1、HDMI视频撕裂的原理

2、双帧缓存的原理

第二部分、代码设计原理

1、AXI_HP_WR模块

2、AXI_HP_RD模块

3、Block design设计

第三部分、总结

1、写在最后

2、更多文章


第一部分、基础知识

 1、HDMI视频撕裂的原理

        在调试摄像头的时候,摄像头采集的图像的分辨率为2200*1125@30Hz,因此摄像头采集图像的速率为30帧/s而显示器的分辨率为1920*1080@60Hz,因此显示器的显示速率为60帧/s。那么很明显,显示器得显示速率是大于摄像头采集图像的速率的

        当DDR采用单帧缓存的方式来缓存图像时,那么就存在一个问题,那就是读数据存在一个超越的过程。当摄像头前的物体在移动时,就会出现一条撕裂线,导致这条撕裂线的原因就是因为显示器上半帧显示的图像为新图,下半帧显示的图像为旧图。

        具体的撕裂效果如下:

单帧缓存带来的撕裂现象

2、双帧缓存的原理

        下图就是双帧缓存的原理流程图,核心思想就是:某一帧图像会被读两次。例如:当前A帧读完了,但是B帧还没有写完,那么HDMI就再显示一遍A帧,当B帧这个时候写完了,来写A帧的时候,也不会发生冲突,因为读取的速度比写入的速度快。

        没有学这些东西的时候,觉得好高级,学了之后发现哦,原来是这样啊。

第二部分、代码设计原理

        由上面的原理图可知,只需要在AXI HP口的写模块内部定义一个frame_flag,当写帧A的时候,就拉低,当写帧B的时候,就拉高,一直循环。接着将frame_flag导出到AXI HP口的读模块。在读模块内根据frame_flag信号的高低,来确定要读取帧的地址。

1、AXI_HP_WR模块

        AXI_HP_WR模块,用来输出frame_flag。

	//Address  //加入了双帧buffer控制代码always @(posedge M_AXI_ACLK) beginif (M_AXI_ARESETN == 1'b0) beginaxi_awaddr <= 'd0;frame_flag <= 1'b1;//刚上电,写A区域,但是一开始需要读A区域(会出现帧不同步,后面就不会了)end//区域B 1920*1080*4-256*8 = 16586752else if (M_AXI_AWREADY == 1'b1 && axi_awvalid == 1'b1 && axi_awaddr == 'd16586752) beginaxi_awaddr <= 'd0;//初始0地址,A区域开始地址 frame_flag <= 1'b0;//写A区域的时候为低电平 end	//区域A 1920*1080*4-256*8 = 8292352else if (M_AXI_AWREADY == 1'b1 && axi_awvalid == 1'b1 && axi_awaddr == 'd8292352) beginaxi_awaddr <= 'd8294400;//B区域开始地址1920*1080*4frame_flag <= 1'b1;//写B区域的时候为高电平    end		else if (M_AXI_AWREADY == 1'b1 && axi_awvalid == 1'b1) beginaxi_awaddr <= axi_awaddr + 'd2048;endend

2、AXI_HP_RD模块

        AXI_HP_RD模块,判断frame_flag。

	//frame flag for double bufferalways @(posedge M_AXI_ACLK) beginif(M_AXI_ARESETN == 1'b0) begin axi_araddr <= 'd0;end//A帧最后一个突发长度else if (axi_arvalid == 1'b1 && M_AXI_ARREADY == 1'b1 && axi_araddr == 'd8292352) begin//对frame_flag进行判断if(frame_flag == 1'b0) beginaxi_araddr <= 'd8294400;endelse beginaxi_araddr <= 'd0;endend//B帧最后一个突发长度else if (axi_arvalid == 1'b1 && M_AXI_ARREADY == 1'b1 && axi_araddr == 'd16586752) begin//对frame_flag进行判断if(frame_flag == 1'b0) beginaxi_araddr <= 'd8294400;endelse beginaxi_araddr <= 'd0;endendelse if (axi_arvalid == 1'b1 && M_AXI_ARREADY == 1'b1) beginaxi_araddr <= axi_araddr + 'd2048;endend

3、Block design设计

        AXI HP口的写数据通道和读数据通道是分开,因此这里拆分为两个模块。

第三部分、总结

1、写在最后

        这篇博客是我在调试摄像头显示的时候,记录的笔记。关于双帧缓存的实现还是比较简单的,所以文章比较简短。

        关于AXI_HP接口的基本知识,请大家参考这篇文章:【ZYNQ入门】第五篇、AXI HP口读写数据原理-CSDN博客。

        我学习的途径是:《V3学院的视频课程》。

        我个人觉得如果大家是那种坐得住,爱调试,心态比较好的,其实你会发现搞FPGA还真的挺有意思的。

2、更多文章

        QQ交流群聊号码1020775171,有疑问的小伙伴可以加入哦🤗🤗🤗

        本专栏有很多我个人总结的比较好的文章,希望对你开发有帮助:FPGA的学习之旅_大屁桃的博客-CSDN博客

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

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

相关文章

pikachu_ssrf攻略

ssrf&#xff08;curl&#xff09;&#xff1a; 打开pikachu靶场&#xff1a; http://127.0.0.1/pikachu-master/vul/ssrf/ssrf_curl.php?urlhttp://127.0.0.1/pikachu-master/vul/ssrf/ssrf_info/info1.php 发现URL地址最后面是info1.php 猜测一下有没有可能存在info2.php?…

Socket实现服务器和客户端

Socket 编程是一种用于在网络上进行通信的编程方法&#xff0c;以下代码可以实现在不同主机之间传输数据。 Socket 编程中服务器端和客户端的基本步骤&#xff1a;服务器端步骤&#xff1a; 1.创建 Socket&#xff1a; int serverSocket socket(AF_INET, SOCK_STREAM, 0);…

npm i 报一堆版本问题

1&#xff0c;先npm cache clean --force 再下载 插件后缀加上 --legacy-peer-deps 2&#xff0c; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/yorkie/download/yorkie-2.0.0.tgz failed, reason…

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(27)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置&#xff08;26&#xff09; 2.5 非透明PCI桥 本回将结合实例说明直接地址翻译过程。 2.5.2 通过非透明桥片进行数据传递 下文以图2-16中处理器x访问处理器y存储器地址空间的实…

【IEEE会议征稿】2024年第九届智能计算与信号处理国际学术会议(ICSP 2024)

2024年第九届智能计算与信号处理国际学术会议&#xff08;ICSP 2024&#xff09; 2024年第八届智能计算与信号处理国际学术会议&#xff08;ICSP 2024&#xff09;将在西安举行&#xff0c; 会期是2024年4月19-21日&#xff0c; 为期三天, 会议由西安科技大学主办。 欢迎参会&…

Python笔记11-闭包、装饰器和设计模式

文章目录 闭包装饰器设计模式 闭包 在函数嵌套的前提下&#xff0c;内部函数使用了外部函数的变量&#xff0c;并且外部函数返回了内部函数&#xff0c;我们把这个使用外部函数变量的内部函数称为闭包。 示例 def outer(logo):def inner(msg):#logo"<"logo&quo…

【Redis】网络模型

前言 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的高性能键值对存储系统&#xff0c;广泛用于各种网络应用中作为数据库、缓存和消息代理。Redis的网络模型是其高性能的关键因素之一&#xff0c;它涉及到多个方面&#xff0c;包括内存管理、事件处理、…

MySQL:提示:The server quit without updating PID file问题的解决办法

[rootizuf62598fraqjv0qztcczxz ~]# service mysql restart MySQL server PID file could not be found![失败] Starting MySQL...The server quit without updating PID file (/usr/local/mysql/data/snsgou.pid).[失败] 具体什么原因最好的办法是先查看下错误日志&#xff1…

数灵通可以让抖音跳转企业微信并回传

抖音作为一款热门的短视频应用&#xff0c;吸引了大量用户的关注和参与。 对于企业而言&#xff0c;如何有效地将其他平台的客户引入企业微信成为了一个重要的课题。本文以利用抖音渠道进行引流&#xff0c;跳转到企业微信为例&#xff0c;介绍一种高效的方法。 在抖音上直接…

Dart/Flutter工具模块:the_utils

Flutter笔记 Dart/Flutter工具模块&#xff1a;the_utils 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/detail…

java基础内容

1.聊一聊Java平台的理解&#xff01; java本身是一种面向对象的语言&#xff0c;最显著的特性有两个方面&#xff1a;一是书写一次&#xff0c;到处运行&#xff0c;也就是跨平台的特性&#xff1b;另外就是垃圾回收机制&#xff1a;java通过垃圾收集器回收分配内存&#xff0…

WPF多值转换器

背景&#xff1a;实现Slider拖动可以调整rgb 单转换器&#xff1a;WPF中数据绑定转换器Converter-CSDN博客 在View中&#xff1a; <StackPanel Orientation"Vertical"><Slider x:Name"slider_R" Minimum"0" Maximum"255" Wi…

深度学习技巧应用33-零门槛实现模型在多个GPU的分布式流水线训练的应用技巧

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下深度学习技巧应用33零门槛实现模型在多个GPU的分布式流水线训练的应用技巧&#xff0c;本文将帮助大家零门槛的实现模型在多个GPU的并行训练&#xff0c;如果你手头上没有GPU资源&#xff0c;根据本文的介绍也可实现…

dhcp服务器的ip池的待分配ip地址是否冲突的检测机制

看到有的资料说&#xff0c;dhcp服务器在分配ip地址时&#xff0c;要检测是否待分配的ip地址是否存在冲突&#xff0c;会向广播域发出&#xff0c;对应ip发出icmp的ping消息来验证是否冲突。特地用自己的公司的交换机验证一下&#xff0c;在交换机上镜像抓包观察一下。 wiresha…

机器学习实验4——CNN卷积神经网络分类Minst数据集

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1; 原理&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;CNN实现分类Minst&#x1f9e1;&#x1f9e1;代码数据预处理&#xff1a;设置基本参数&#xff1a; &#x1f9e…

接口文档swagger2的使用

Spring-接口文档swagger2 1、swagger/knife4j 接口文档配置 ​ knife4j是swagger的增强版本&#xff0c;更加的小巧、轻量&#xff0c;功能也是更加的完善&#xff0c;UI也更加的清晰&#xff1b;可以从swagger到knife4j无缝切换。 1.1 引入相关依赖 <!--接口文档的开发:…

神经网络:表述(Neural Networks: Representation)

1.非线性假设 无论是线性回归还是逻辑回归&#xff0c;当特征太多时&#xff0c;计算的负荷会非常大。 案例&#xff1a; 假设我们有非常多的特征&#xff0c;例如大于 100 个变量&#xff0c;我们希望用这 100 个特征来构建一个非线性的多项式模型&#xff0c;结果将是数量非…

Win10 如何用powershell写个WOL开机脚本

环境&#xff1a; Win10 专业版 问题描述&#xff1a; Win10 如何用powershell写个WOL开机脚本 解决方案&#xff1a; 1.脚本内容 $mac b1-10-18-52-11-12 $macBytes $mac -split - | ForEach-Object { [byte](0x $_) } $broadcastAddress [byte[]](1..6 | ForEach-O…

springboot导出数据到excel模板,使用hutool导出数据到指定excel,java写入数据到excel模板

最近遇到一个需求&#xff0c;需要从数据库查询数据&#xff0c;写入到对应的excel导入模板中。再把导出的数据进行修改&#xff0c;上传。 我们项目用的是easyExcel&#xff0c;一顿百度搜索&#xff0c;不得其法。 主要是要把数据填充到指定单元格中&#xff0c;跟平时用到的…

c++遍历文件夹下指定后缀的文件

dirent.h dirent.h是一个头文件&#xff0c;它包含了在文件系统中进行目录操作的函数和数据结构的声明。 以下是一些dirent.h头文件中常用的函数和数据结构&#xff1a; DIR结构体&#xff1a;表示一个目录流&#xff0c;用于操作目录。struct dirent结构体&#xff1a;表示…