使用视频帧缓冲区的直方图均衡化

视频处理应用程序通常存储一整帧的视频数据来处理这一帧并修改下一帧。在这种设计中,视频帧存储在外部存储器中,而FPGA资源用于处理相同的数据。这个例子展示了如何设计一个视频应用程序与HDMI输入和输出执行直方图均衡化使用外部存储器为视频帧缓冲。

金宝app支持的硬件平台

  • 赛灵思Zynq®ZC706评估套件+ FMC-HDMI-CAM夹层卡

设计任务和系统需求

考虑一个通过FPGA实现视频数据连续流的应用程序。最顶尖的模特soc_histogram_equalization_top的FPGA计算输入视频流的直方图,在“FPGA”子系统,而流相同的视频流,以用于存储外部存储器。一旦直方图已经计算并在整个视频帧积累,一个同步信号被触发时触发从外部存储器所存储的帧的读回。然后将累积直方图向量被施加到所述视频流中读取从外部存储器回执行均衡算法。外部存储器帧缓冲器使用“记忆的频道”块建模axi4流视频帧缓冲区模式。

在“HDMI输入”块读取的视频文件,并且提供视频数据和控制信号到下游FPGA的处理块。视频数据是在的YCbCr 4:2:2格式,并且所述控制信号是在像素控制总线格式。在“HDMI输出”块读取的视频数据和控制信号,以相同的格式作为由“HDMI输入”块的输出,并提供了使用视频显示块视觉输出。

按钮块允许绕过直方图均衡算法的,路由从外部存储器帧缓冲器到输出未处理输出。

当设计一个与外部内存接口的应用程序时,有许多需求需要考虑:

  • 吞吐量:什么是你需要的数据从内存传输到/来满足你的算法要求的速度?特别是对于视觉应用,什么是帧大小和帧率,你必须能够维持?

  • 潜伏:什么是你的算法可以请求和接收数据之间的容忍时间的最大金额是多少?对于视觉应用,你需要连续的数据流,没有差距?你能当访问内存被阻断缓冲到你的算法样品的内部,以防止数据丢失?

对于这个直方图均衡化示例,我们定义了以下要求:

  • 可以通过必须足以以60帧每秒保持1920x1080p的视频流。

  • 延迟必须足够低,以便不会丢失帧。

与吞吐量要求上述情况,我们可以计算出所需的帧缓冲器中的值:

美元1920美元\ times1080 \ times60 = 124.416 \ \ mathrm{议员}$ $

作为视频格式的YCbCr是4:2:2中,我们需要2个字节每像素(BPP),这相当于一个吞吐量要求

$$ 2 \ times124.416 = 248.832 \,\ mathrm {MB / S} $$

因为算法必须同时从外部存储器写入和读取视频数据,这个吞吐量要求必须加倍,为总吞吐量要求

$$ 2 \ times248.832 = 497.664 \,\ mathrm {MB / S} $$

设计中使用的SoC模块库

通常,您的算法将成为更大的SoC应用程序的一部分。在这样的应用中,很可能还有其他算法也需要访问外部内存。在此场景中,您必须考虑其他算法的内存访问对性能和算法需求的影响。假设你的算法与其他组件共享内存通道,你应该考虑以下几点:

  • 什么是在SoC系统总的可用内存带宽?

  • 你的算法将如何适应共享内存带宽?

  • 你的算法能容忍增加的读/写延迟吗?

通过对整个应用程序中的额外内存使用者进行适当的建模,您可以系统地设计算法,以满足在访问内存不是算法独有的情况下的需求。

为了避免对整个系统中的所有内存读写器建模,可以使用“内存流量生成器”块通过创建访问请求来消耗系统中的读/写带宽。通过这种方式,您可以在不进行显式建模的情况下模拟系统中的其他内存访问。

建模的附加内存消耗

当在硬件上实现时,HDMI输出需要一个额外的帧缓冲区来同步时钟域之间的视频流数据,并在整个系统中引入一个额外的内存消费者。您可以使用内存流量发生器块来模拟额外的内存消耗。由于我们对读事务和写事务都建模,所以我们将使用两个内存流量发生器块 - 每一个用于读取和写入。

基于吞吐量计算为我们的1080p视频流,我们知道更多的帧缓冲要求$ 497.664 \,\ mathrm {MB / S} $带宽的同时读取和写入访问。

写事务由建模HDMI缓冲区写读取事务被建模HDMI缓冲器读。两者的阻挡掩模如下所示。

总突发请求被配置为INF正如我们想从存储器模拟数据的连续流至/。这将确保流量发生器模块将继续发出模拟的整体交易请求。

突发大小指定为192,这是每行的像素的1/10。如以字节为单位指定了突发大小,这等同于所述输出视频流的单个部件的单行的十分之一,即所述YCbCr 4的Y分量的一行:2:2视频流。

脉冲串之间的时间被指定为1296000分之1。这可以展开为

$$ \压裂{192} {1080 \ times1920 \ times60 \ times2} $$

在那里,

192是每次脉冲的字节数,

1080是视频流中的行数,

1920是视频流中的每行像素的数量,

60是帧每秒和的数目,

2是我们的视频流部件的数量。

把以上参数一起,我们可以计算出我们的请求处理如下:

$$ 192 \ times1296000 = 248.832 \,\ mathrm {MB / S} $$

而且,因为我们有两个流量生成器来模拟读取和写入数据,总带宽消耗会$ $ 497.664 \ \ mathrm {MB / s} $ $

模拟系统在以下内存带宽占用情节上面的设置结果。

这里,内存主机如下:

  1. Master 1:帧缓冲区写入

  2. 大师2:帧缓冲器读取

  3. 法师3:HDMI缓冲写入(存储流量发生器)

  4. 主4:HDMI缓冲器读(内存流量发生器

  5. 主5:争用(记忆流量发生器)(注释)

您可以看到,所有4个活动主机消耗了248.8 MB/s的内存带宽。

更多的内存消耗:想想看,你的算法是一个更大的系统的一部分,和一个二次算法是由同事或第三方开发的。在这种情况下,二次算法将分别的时间和分工的兴趣发展。而不是两种算法结合成一个单一的模拟,你可以,如果任何模型使用的内存流量发生器二次算法的内存访问,并模拟的影响,它会对你的算法。

例如,假设二级算法的内存需求如下:

  • 吞吐量:650 MB /秒

既然我们知道,在任何一个时间的主要算法,再加上HDMI输出帧缓存,在消费〜995 MB / s的内存带宽,而我们的总的可用内存带宽为1600 MB / s时,我们知道,同生共我们的系统带宽需求超过〜50 MB总的可用带宽/秒。

为了使二次算法存储器访问建模中,取消对争夺存储器流量发生器块。阻挡掩模设定如下所示。

模拟与次级算法的存储器访问系统,将导致以下存储器带宽使用率图。

正如你所看到的,合并所需的内存带宽超过了可用带宽大约0.03秒 - 当次算法开始的内存访问请求,导致其他大师没有达到他们所要求的吞吐量。纵观逻辑分析仪的波形,我们可以看到这表现为对于帧缓冲写入主缓冲区下降,这意味着输入视频帧将不被写入到存储器中。

落实和硬件上运行

本部分需要以下产品:下载188bet金宝搏

  • HDL编码器™

为了实现在支持的SoC板使用模型金宝appSoC的构建应用程序。打开‘FPGA’子系统掩码,将模型变量设置为‘基于像素的处理’。

注释掉“HDMI缓冲区写”,“HDMI缓冲器读”和“争”块。

在工具条来打开的点击,“配置,构建,部署和”按钮SoC的构建

  • 选择“设置”屏幕上的“构建模式”。点击下一步'。

  • 点击“查看/编辑存储器映射”查看“回顾记忆地图”屏幕上的内存映射。点击下一步'。

  • 在“选择项目文件夹”屏幕上指定项目文件夹。点击下一步'。

  • 选择“选择Build行动”屏幕上“建造,负载和运行”。点击下一步'。

  • 在“验证模型”屏幕上单击“验证模型”检查要实现的模型的兼容性。点击下一步'。

  • 点击“生成”开始“构建模式”屏幕上的模型的构建。FPGA合成开始时的外部壳将打开。点击下一步'。

  • 点击“下一步”以“加载比特流”屏幕。

该FPGA合成可能需要超过30分钟完成。为了节省时间,您可能希望通过以下步骤来使用所提供的预先生成的比特流:

  • 关闭外壳终止合成。

  • 通过运行下面,然后将命令复制生成的预流到项目文件夹,

  • 点击“加载并运行”按钮来预加载产生的比特流和运行上的SoC板模型

的CopyFile(完整文件(matlabroot,'工具箱''SOC''socexamples'“比特流”“soc_histogram_equalization_top-zc706.bit”),'./soc_prj');

现在该模型是在硬件上运行。要获得硬件的内存带宽使用情况,执行以下aximaster试验台soc_histogram_equalization_top_aximaster

下图显示了在硬件上部署应用程序时的内存带宽使用情况。

摘要

您在设计的外部存储与实时HDMI I / O的视频应用和帧缓冲。你探索其他消费者对整体带宽内存的影响。你用的SoC生成器来实现对硬件的模型和验证设计。