草庐IT

米联客FDMA3.1数据缓存方案全网最细讲解,自创升级版,送3套视频和音频缓存工程源码

9527华安 2023-04-14 原文

米联客的FDMA数据缓存方案发布也有五六年了,但真正能熟练使用的兄弟却很少,其实还是没有好的例程作为参考和同熟易懂的讲解,这里我做如下解析:
FDMA部分:这部分是米联客封装了用户接口的AXI4-FULL协议代码,我之前写过一篇文章,逐行讲解这个模块,感兴趣的兄弟可以去参考FDMA代码逐行讲解
米联客官方的FDMA3.1封装的IP做得不咋地,我这里对IP做了重新封装,如下:

这里的AXI数据位宽并不是任意设置的,比如设置为110,这是非法的,米联客原来的IP并没有意识到这一点,也没有提示用户,所以我修改为可选项如下:

根据AXI4协议,AXI4数据位宽必须与内存相映射,说人话就是必须是8的倍数;且最大只能是256;
AXI最大突发是长度:同理,AXI突发是长度也不是任意值,可选的只有1,2,4,8,32,64,128,256,米联客原来的IP并没有意识到这一点,也没有提示用户,所以我修改为可选项如下:

这里是指最大值,所以直接选256;
另外:重点:拿出小本本:
AXI数据位宽与AXI突发长度必须遵循如下公式:
AXI数据位宽/8*AXI突发长度<=4096;即4k边界,当然,这里米联客依然没说;
AXI ID以及ID位宽:如果需要调用多个FDMA IP,就要用到这里,我的修改如下:

最大ID位宽给到了4,即最多可同时调用16个IP,一般用不到这么多,所以这里选1;
下面看更重要的FDMA控制器:
关于FDMA控制器我之前写过文章,感兴趣的可以参考FDMA控制器
当然,同样的道理,米联客原来的IP也没有给出更细的东西,这里我来说说:
先看FDMA控制器IP:

IP配置页面如下:

下面的讲解全是干货,注意听!!!!!
SDK读使能:
一般用不到,他的作用是在SDK里读当前帧的序号等,具体取看代码吧,不懂的也可以问我;
图像场同步检测使能:
作用是检测输入视频场同步的上升沿,以触发FDMA传输,如果缓存视频肯定要使能,如果缓存其他类型数据看情况,比如后面的缓存音频的工程就没有使能该信号;
AXI读写数据使能:
即读和写可选择,这里应该表扬米联客,如果你的工程不需要用到读,那你就只使能写,这样可以节约fpga资源;
AXI数据位宽:
必须与FDMA的配置保持一致;这里我将IP做了修改,该参数修改为可选项有限,如下:

读写FIFO缓存深度:
IP内部有用到FIFO,这里就是FIFO的数据深度设置,具体为什么要用FIFO以及用FIFO的作用请看我之前的文章FDMA控制器这里我将IP做了修改,该参数修改为可选项有限,如下:

如果数据量小的话可以选1024,数据量大的话可以选4096,具体情况具体选择吧,不懂的也可以联系问我;
读写数据的起始地址:
这里指的是数据缓存的首地址,IP内部根据一帧数据的完成对起始地址进行了累加,具体看代码吧,也可以参考我之前的文章FDMA控制器
读写数据“偏移”地址:
这里的偏移打了引号,因为他不是正真的偏移,IP内部代码关于读写地址部分如下:

其中fdma_wbufn就是根据一帧数据的完成对起始地址进行了累加,W_addr就是根据突发数据进行的所谓偏移地址的增加,可能讲不清楚,具体可以联系问我吧;
读写缓存帧数:
这里很好理解,就是存几帧,这里我将IP做了修改,该参数修改为可选项有限,如下:

输入和输出数据位宽:
这里选32是为了和FIFO深度和AXI数据位宽进行适配;
FDMA单次突发的分传次数:
这里是为了解决4K边界的问题,具体参考我之前的文章FDMA控制器这里我将IP做了修改,该参数修改为可选项有限,如下:

读写单次突发的长度和次数:
因为DFMA控制器直接略过了AXI突发长度的问题,用FDMA单次突发的分传次数完美取代了,所以读写单次突发的长度可以由用户自定义,无需再考虑4K对齐,以1080P视频为例,完全可以设置单次直接突发为一行数据,即1920,突发次数为1080行,一次类推;
单次突发跨度:
比如我想写如720p视频,却以1080P视频时序读出来,这里就有用了,跨度直接设置为1280,后面的工程由讲解;
米联客还配套给出了一个地址切换的IP,如下:

这个ip米联客干脆就没有介绍,可能觉得太简单了,我这里解析如下:

可以看到,这个IP其实还是有点绕的,使用方法官方也没有说,这里我给的注释应该能看得懂吧,这里我将IP做了修改,该参数修改为可选项有限,如下:


工程讲解:
工程1:
开发板:Kintex7开发板;
开发环境:vivado2019.1;
输入:HDMI视频1080P,IT6802解码;
输出:HDMI视频1080P;
BD工程:

IP配置:

代码架构:

工程2:
开发板:Kintex7开发板;
开发环境:vivado2019.1;
输入:OV5640摄像头720P;
输出:HDMI视频1080P;
BD工程:
同工程1;
IP配置:

这里是720P输入1080P输出,所以跨度这里的设置不一样,要好好理解,不懂得联系问我吧;
代码架构:

工程3:
开发板:Kintex7开发板;
开发环境:vivado2019.1;
输入:音频数据,WM8731解码;
输出:音频数据,WM8731编码;
BD工程:

IP配置:

这里说明一下:
音频串并转换后一个音频点是32为数据,采样率48K,双通道,所以每秒的数据量就是:
48000*2=96000;
IP里的单次突发读写长度设置为960,实际就是单次读写10ms的音频;
IP里的突发读写次数设置为1000,实际就是一共读写10s的音频;
具体可参考我之前写得文章音频缓存
代码架构:

输出结果:工程1如下:

工程1输出效果


工程2如下:

工程2输出效果


福利:送以上3套工程及其源码,联系我吧兄弟!!!!!!

有关米联客FDMA3.1数据缓存方案全网最细讲解,自创升级版,送3套视频和音频缓存工程源码的更多相关文章

  1. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  2. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  3. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  4. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  5. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  6. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  7. ruby - 如何更改此正则表达式以从未指定 v 参数的 Youtube URL 获取 Youtube 视频 ID? - 2

    目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby​​1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url

  8. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  9. ruby-on-rails - bundle 安装尝试使用缓存文件 - 2

    当我尝试进行bundle安装时,我的gem_path和gem_home指向/usr/local/rvm/gems/我没有写入权限,并且由于权限无效而失败。因此,我已将两个路径都更改为我具有写入权限的本地目录。这样做时,我进行了bundle安装,我得到:bruno@test6:~$bundleinstallFetchinggemmetadatafromhttps://rubygems.org/.........Fetchinggemmetadatafromhttps://rubygems.org/..Bundler::GemspecError:Couldnotreadgemat/afs/

  10. ruby-on-rails - Heroku Action 缓存似乎不起作用 - 2

    我一直在Heroku上尝试不同的缓存策略,并添加了他们的memcached附加组件,目的是为我的应用程序添加Action缓存。但是,当我在我当前的应用程序上查看Rails.cache.stats时(安装了memcached并使用dalligem),在执行应该缓存的操作后,我得到current和total_items为0。在Controller的顶部,我想缓存我有的Action:caches_action:show此外,我修改了我的环境配置(对于在Heroku上运行的配置)config.cache_store=:dalli_store我是否可以查看其他一些统计数据,看看它是否有效或我做错

随机推荐