垂直视频翻转使用外部内存
这个例子展示了如何设计一个应用程序来垂直翻转传入的视频流。
您将使用外部内存存储视频帧来完成此任务。您可以使用这种技术来设计和实现其他需要访问外部内存的视觉应用程序。
支持的硬件平台
Xilinx®Zynq®ZC706评估试剂盒+ FMC-HDMI-CAM夹层卡
简介
为了翻转来自HDMI源(RX)的传入视频流,FPGA逻辑一次一行地将视频帧写入外部存储器。随后,FPGA逻辑以相反的顺序读取存储的图像,每次一行,从而垂直翻转图像。然后将读取的视频帧发送到HDMI Out (TX)。视频帧存储在PL-DDR的乒乓缓冲区中,允许独立的内存读写操作。一个单独的PS-DDR用于在将数据传输到HDMI Out期间存储视频帧。下图突出显示了总体数据流。
建模
在顶层模型中,soc_video_flipping_topFPGA逻辑与外部存储器和HDMI In/Out块连接。
的soc_video_flipping_fpga模型包括FPGA逻辑。它作为顶层模型的引用模型被链接。此图像显示soc_video_flipping_fpga模型内的VideoFlipping子系统的内容。
FPGA逻辑由四个关键组件组成:
AXI4主写控制器从HDMI Rx接收视频并将数据写入DDR。每次爆发写入一行数据。当一个帧结束时,它发送帧结束(EOF)信号来触发AXI4主读控制器。
AXI4主读控制器从外部存储器乒乓缓冲区中按倒序读取视频帧的行。每次爆发读取一行数据。如果下行读FIFO块还没有准备好处理数据,新的读请求将被暂停。当一个帧从内存中完全读取时,读控制器等待来自写控制器的下一个EOF信号开始在一个新的帧中读取。如果内存控制器没有足够的带宽,当写控制器完成对下一帧的写入时,读控制器可能还在处理前一帧。在这种情况下,读控制器将使用errframdrop信号抛出一个错误。
写先进先出当DDR内存控制器断言背压信号(突出的红色箭头)时,缓冲写入乒乓缓冲区的数据,以允许处理来自HDMI源的视频数据。写FIFO应该足够大,以防止溢出,并容纳写入外部存储器的任何延迟。在本例中,写入FIFO的深度设置为2048,以容纳1条HD反压线。
读取FIFO当HDMI Tx中的DMA断言背压信号(突出显示的红色箭头)时,缓冲来自读控制器的数据。反压力被传播到上游AXI4主读控制器,以停止从DDR请求数据。请注意,由于AXI4主读控制器在读突发期间不会暂停,因此确保Read FIFO即使在就绪信号解除断言之后也有足够的空间存储数据是很重要的。在此例中,Read FIFO的深度设置为2048,几乎满阈值设置为128。当FIFO有128个样本时,读FIFO发送'Full'信号到上游块以停止任何新的读请求。同时,它可以缓冲2048-128 = 1920个样本而不会溢出。即使对于1080p帧,该设置也足够了。
在硬件实现中,HDMI Tx包括两个DMA帧缓冲区和一个视频定时控制器(VTC),用于鲁棒和无撕裂的视频输出。当内存控制器忙于其他读写事务时,dma可能会向DUT发送回压。在FPGA模型中,背压信号hdmiOutputReady
仅为模拟设置为始终为true(这表明内存控制器始终可用)。实际上,这个信号经常在高电平和低电平之间切换。DUT中的Read FIFO块用于处理这种反压力。
模拟
在设计与外部内存接口的应用程序时,必须考虑内存带宽要求。为了满足你的算法的要求,你需要从内存中传输数据的速率是多少?具体来说,对于视觉应用程序,您必须能够保持的帧大小和帧速率是多少?
对于所选的ZC706单板,PL DDR控制器配置有64位AXI4-Slave接口,工作频率为200mhz。结果带宽为1600mb /s。让我们首先评估内存带宽是否足以以每秒60帧的速度维持1920x1080p视频流。由于视频格式为YCbCr 4:2:2,所以我们要求2字节/像素。但是,对于DUT AXI4读写,每个像素都是由0填充到4个字节,这相当于吞吐量要求为
计算出的吞吐量满足带宽要求。
要模拟1080p 60fps的情况,运行以下命令,然后模拟模型
soc_video_flipping_set_parameters (“1080 p”)
输出如下所示。
如果您想对访问相同外部内存的另一个DUT建模,可以在实现之前使用内存流量生成器块来模拟争用,这样就可以节省硬件调试方面的工作。在这个模型中,两个内存流量产生器块,争用写
而且争用读
块,被建模来模拟另一个帧缓冲区的AXI事务。两个内存流量发生器的吞吐量计算为
内存控制器需要的总带宽为小于其最大带宽1600mb /s。取消注释争写和争读块,再次模拟1080P的模型,输出在底部被撕裂。你也会得到通过'soc_video_flipping_fpga/VideoFlipping/ assertion '块的断言,帧被丢弃。
仿真结果表明,内存控制器不能满足DUT和内存流量发生器的带宽要求。你可能需要考虑降低帧分辨率,或使DUT算法更有效,例如实现16位YCbCr像素打包/解包到32位,而不是零填充。
top model默认运行在加速模式。如果您想在Logic Analyzer中检查记录的数据,请将顶部模型更改为正常模式。为了得到更快的结果,最好使用480p或更小的帧大小进行模拟。
实现
本节所需的产品如下:2022世界杯八强谁会赢?
高密度脂蛋白编码器™
在实现之前,
在顶部模型上将模拟模式设置为“正常”。
注释掉
争用写
而且争用读
块。如果模型已更改为1080p以外的帧大小,则执行此命令。
soc_video_flipping_set_parameters (“1080 p”)
要在支持的SoC板上实现该模型,请使用SoC建设者工具。在实施之前,请确保您已经安装了所需的产品和FPGA供应商软件。2022世界杯八强谁会赢?打开SoC建设者点击,配置、构建和部署按钮,并按照以下步骤操作:
在设置屏幕上,选择构建模型。点击下一个。
在选择构建操作屏幕上,选择构建、加载和运行。点击下一个。
在选择项目文件夹屏幕,指定项目文件夹。点击下一个。
在回顾内存映射屏幕上,查看内存映射,单击查看/编辑。点击下一个。
在验证模型屏幕上,要查看该模型的兼容性,请单击验证。点击下一个。
在构建模型屏幕上,要构建模型,单击构建。当FPGA合成开始时,会打开一个外部外壳。点击下一个。
在连接硬件界面,单击,测试主机与SoC板的连通性测试连接。去运行应用程序屏幕上,单击下一个。
FPGA合成通常需要30分钟以上才能完成。为了节省时间,您可以按照以下步骤使用提供的预生成的比特流。
关闭外壳以终止合成。
复制预生成的比特流到您的项目文件夹通过运行这个
拷贝文件
下面的命令。加载预生成的比特流,并通过单击在SoC板上运行模型加载和运行。
拷贝文件(fullfile (matlabshared.supportpkg.getSupportPackageRoot,...“工具箱”,“soc”,“supportpackages”,“xilinxsoc”,“xilinxsocexamples”,...“比特流”,“soc_video_flipping_top-zc706.bit”),”。/ soc_prj ');
ZC706上的四个led由信号驱动,可用于调试设计:
GPIO_LED_LEFT是由AXI4主驱动的有效数据写入。当应用程序运行时,它应该打开或闪烁。
GPIO_LED_CENTER由AXI4 Master驱动读取有效数据。当应用程序运行时,它应该打开或闪烁。
GPIO_LED_RIGHT由Write FIFO ready驱动。它应该始终处于开启状态,否则AXI4写入数据将被丢弃。
GPIO_LED_0由Read FIFO ready驱动。它可以开也可以关。数据不会在这个FIFO中被丢弃,因为上游控制器将正确地处理这个背压。
结论
这个例子展示了使用SoC Blockset以随机方式访问外部内存的AXI4 Master接口的建模。您可以使用这种技术来建模涉及外部内存的视觉应用程序。其中一个例子是对比有限自适应直方图均衡化与外部存储器在这个例子的基础上。