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

2024-01-24 06:28

本文主要是介绍【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博客

这篇关于【ZYNQ入门】第九篇、双帧缓存的原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/638774

相关文章

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis与缓存解读

《Redis与缓存解读》文章介绍了Redis作为缓存层的优势和缺点,并分析了六种缓存更新策略,包括超时剔除、先删缓存再更新数据库、旁路缓存、先更新数据库再删缓存、先更新数据库再更新缓存、读写穿透和异步... 目录缓存缓存优缺点缓存更新策略超时剔除先删缓存再更新数据库旁路缓存(先更新数据库,再删缓存)先更新数

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外