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

这篇具有很好参考价值的文章主要介绍了【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帧的时候,也不会发生冲突,因为读取的速度比写入的速度快。

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

【ZYNQ入门】第九篇、双帧缓存的原理,FPGA的学习之旅,fpga开发,ZYNQ,HDMI

第二部分、代码设计原理

        由上面的原理图可知,只需要在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) begin
		if (M_AXI_ARESETN == 1'b0) begin
			axi_awaddr <= 'd0;
			frame_flag <= 1'b1;//刚上电,写A区域,但是一开始需要读A区域(会出现帧不同步,后面就不会了)
		end
		//区域B 1920*1080*4-256*8 = 16586752
		else if (M_AXI_AWREADY == 1'b1 && axi_awvalid == 1'b1 && axi_awaddr == 'd16586752) begin
			axi_awaddr <= 'd0;//初始0地址,A区域开始地址 
			frame_flag <= 1'b0;//写A区域的时候为低电平 
		end	
		//区域A 1920*1080*4-256*8 = 8292352
		else if (M_AXI_AWREADY == 1'b1 && axi_awvalid == 1'b1 && axi_awaddr == 'd8292352) begin
			axi_awaddr <= 'd8294400;//B区域开始地址1920*1080*4
			frame_flag <= 1'b1;//写B区域的时候为高电平    
		end		
		else if (M_AXI_AWREADY == 1'b1 && axi_awvalid == 1'b1) begin
			axi_awaddr <= axi_awaddr + 'd2048;
		end
	end

2、AXI_HP_RD模块

        AXI_HP_RD模块,判断frame_flag。

	//frame flag for double buffer
	always @(posedge M_AXI_ACLK) begin
	  if(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) begin
	  		axi_araddr <= 'd8294400;
	  	end
	  	else begin
	  		axi_araddr <= 'd0;
	  	end
	  end
	  //B帧最后一个突发长度
	  else if (axi_arvalid == 1'b1 && M_AXI_ARREADY == 1'b1 && axi_araddr == 'd16586752) begin
	  	//对frame_flag进行判断
	  	if(frame_flag == 1'b0) begin
	  		axi_araddr <= 'd8294400;
	  	end
	  	else begin
	  		axi_araddr <= 'd0;
	  	end
	  end
	  
	  else if (axi_arvalid == 1'b1 && M_AXI_ARREADY == 1'b1) begin
	      axi_araddr <= axi_araddr + 'd2048;
	  end
	end

3、Block design设计

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

【ZYNQ入门】第九篇、双帧缓存的原理,FPGA的学习之旅,fpga开发,ZYNQ,HDMI

第三部分、总结

1、写在最后

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

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

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

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

2、更多文章

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

        本专栏有很多我个人总结的比较好的文章,希望对你开发有帮助:FPGA的学习之旅_大屁桃的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-819904.html

到了这里,关于【ZYNQ入门】第九篇、双帧缓存的原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL篇---第九篇

    READ UNCOMMITTED(未提交读):事务中的修改,即使没有提交,对其他事务也都是可见 的。会导致脏读。 READ COMMITTED(提交读):事务从开始直到提交之前,所做的任何修改对其他事务都是 不可见的。会导致不可重复读。这个隔离级别,也可以叫做“不可重复读”。 REPEATABLE

    2024年02月07日
    浏览(39)
  • java基础-----第九篇

    引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计 数为0时可以回收, 可达性分析法:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的,那么虚拟机就

    2024年02月10日
    浏览(41)
  • 【第九篇:接口自动化建设】

    不要问我为什这么晚发布,这可能是我有史以来加班最晚的时候了,啊啊啊 我们之前也说过进行接口自动化建设主要是为了自动化测试服务端的逻辑,客户端与后端交互使用的主要协议的就是http协议,这也是为什么我在开篇就和大家强调过相关的基本功的学习,学习这些基

    2024年02月03日
    浏览(47)
  • S7---FPGA- ZYNQ7100板级原理图硬件实战

    ZYNQ7100板级系统硬件实战01_哔哩哔哩_bilibili 板卡主要由ZYNQ7100主芯片,6片DDR3,1片eMMC,2个QSPI FLASH和一些外设接口组成。ZYNQ7100 采用Xilinx公司的Zynq7000系列的芯片,Xilinx ARM + FPGA芯片型号为XC7Z100-2FFG900。 ZYNQ710 芯片可分成处理器系统部分Processor System(PS)和可编程逻辑部分Pro

    2024年03月11日
    浏览(43)
  • 第九篇 API设计原则与最佳实践

    深入浅出HTTP请求前后端交互系列专题 第一章 引言-HTTP协议基础概念和前后端分离架构请求交互概述 第二章 HTTP请求方法、状态码详解与缓存机制解析 第三章 前端发起HTTP请求 第四章 前后端数据交换格式详解 第五章 跨域资源共享(CORS):现代Web开发中的关键机制 第六篇 提

    2024年01月23日
    浏览(43)
  • ESP32系列--第九篇 ADC的使用

            本篇主要介绍ESP32的ADC功能,ESP32有两个ADC模块,分别为ADC1/ADC2,每个ESP32系列具有的通道数不一样,详情请看下表。         在WiFi在使用时,ADC2的使用受到一些限制,实际应用场景中一般只使用ADC1即可。 ADC的IO引脚分配 ESP32系列 (下表来自ESP-IDF开发文档) GPIO

    2024年02月05日
    浏览(57)
  • 第九篇:node静态文件服务(中间件)

     🎬 江城开朗的豌豆 :个人主页  🔥 个人专栏  :《 VUE 》 《 javaScript 》  📝  个人网站  :《 江城开朗的豌豆🫛 》  ⛺️ 生活的理想,就是为了理想的生活 ! 当今互联网时代,Node.js 成为了最受欢迎的服务器端开发平台之一。作为一名小白,学习 Node.js 可能会让你感

    2024年02月20日
    浏览(42)
  • DNS入门学习:DNS缓存的原理和作用(中科三方)

    在实际业务场景中,DNS解析过程并不总是严格遵循从根域名服务器、顶级域名服务器再到权威域名服务器的一级级查询过程,这只是一个标准状态。为了节省全球查询的时间,同时减轻各级服务器的解析压力,DNS系统中引入了缓存机制。本文国科云针对DNS缓存的原理、作用以

    2024年02月14日
    浏览(38)
  • 【HarmonyOS4.0】第九篇-ArkUI布局容器组件(一)

    容器组件指的是它可以包含一个或多个子组件的组件,除了前边介绍过的公共属性外。 线性容器类表示按照水平方向或者竖直方向排列子组件的容器,ArkUI开发框架通过 Row 和 Colum 来实现线性布局。 什么是主轴和纵轴? 对于线性容器来说,有主轴和纵轴之分: 如果布局是沿

    2024年02月02日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包