主要内容

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

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

金宝app支持的硬件平台

  • Xilinx®Zynq®ZC706评估试剂盒+ FMC-HDMI-CAM mezz扣卡

设计任务和系统需求

考虑一个通过FPGA连续传输视频数据的应用程序。在顶级模型中soc_histogram_equalization_topFPGA计算输入视频流的直方图,在“FPGA”子系统中,同时将相同的视频流流到外部存储器进行存储。一旦整个视频帧的直方图被计算和积累,同步信号被触发从外部存储器读取所存储的帧。然后将累积的直方图向量应用于从外部存储器读出的视频流,以执行均衡算法。外部内存帧缓冲区是使用“内存通道”块建模的axi4流视频帧缓冲区模式。

HDMI输入模块读取视频文件,并向下游FPGA处理模块提供视频数据和控制信号。视频数据为YCbCr 4:2:2格式,控制信号为像素控制总线格式。“HDMI输出”模块读取视频数据和控制信号,格式与“HDMI输入”模块相同,并使用视频显示模块提供视觉输出。

Push Button块允许绕过直方图均衡化算法,将未处理的输出从外部内存帧缓冲区路由到输出。

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

  • 吞吐量:为了满足算法的要求,你需要将数据传输到内存/从内存中取出的速率是多少?特别是对于视觉应用程序,您必须能够保持的帧大小和帧速率是什么?

  • 延迟:您的算法在请求和接收数据之间所能容忍的最大时间是多少?对于视觉应用,你是否需要连续的、无间隙的数据流?你能缓冲样本内部的算法,以防止数据丢失时,访问内存被阻塞?

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

  • 吞吐量必须足以维持1920x1080p视频流在60帧每秒。

  • 延迟必须足够低,以免丢失帧。

根据以上的吞吐量要求,我们可以计算帧缓冲区所需的值:

美元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系统的总可用内存带宽是多少?

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

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

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

为了避免对整个系统中的所有内存读写器和写入器建模,您可以使用“内存流量生成器”块,通过创建访问请求来消耗系统中的读/写带宽。通过这种方式,无需显式建模,就可以在系统中模拟额外的内存访问。

对额外的内存使用者建模

在没有额外内存消费者的情况下模拟系统,并从“内存控制器”块中查看内存性能图。

这里,内存主程序如下:

  1. 主控1:帧缓冲区写入

  2. 主2:读帧缓冲区

  3. Master 3:争用(内存流量生成器)(注释掉)

注意,两个活动主服务器占用248.8 MB/s的内存带宽。

消费者更多的内存:假设你的算法是一个更大系统的一部分,而另一个算法是由同事或第三方开发的。在这种情况下,出于时间和分工的考虑,将单独开发辅助算法。您可以使用内存流量生成器(memory Traffic Generator)对辅助算法的内存访问进行建模,并模拟它对算法的影响(如果有的话),而不是将这两种算法合并到一个单独的模拟中。

例如,假设你对辅助算法的内存要求如下:

  • 吞吐量:1150 MB / s

考虑到主算法占用约500mb /s的内存带宽,而总可用内存带宽为1600mb /s,我们知道我们系统的总带宽需求超过总可用带宽约50mb /s。

要启用辅助算法内存访问的建模,请取消注释争用内存流量发生器块。遮罩设置如下所示。

用辅助算法的内存访问来模拟系统,得到如下的内存带宽占用图。

正如您所看到的,在0.03左右——当辅助算法开始内存访问请求时,其他主算法无法实现所需的吞吐量。查看逻辑分析仪的波形,我们可以看到这表现为帧缓冲区写主程序的缓冲区被丢弃和帧缓冲区读主程序的空闲状态。

硬件实现和运行

本节要求的产品如下:下载188bet金宝搏

  • 高密度脂蛋白编码器™

为了在一个受支持的SoC板上实现该模型,使用金宝appSoC建设者应用程序。打开“FPGA”子系统的掩码,并将模型变体设置为“基于像素的处理”。

注释掉' competing '块。

单击工具条中的“配置,构建和部署”按钮以打开SoC建设者

  • 在“设置”屏幕上选择“构建模型”。单击“Next”。

  • 点击“查看/编辑内存地图”,在“查看内存地图”界面查看内存地图。单击“Next”。

  • 在“选择项目文件夹”屏幕上指定项目文件夹。单击“Next”。

  • 在“Select Build Action”屏幕上选择“Build, load and run”。单击“Next”。

  • 在“验证模型”界面,按“验证模型”,以检查要实施的模型是否兼容。单击“Next”。

  • 在“构建模型”屏幕上单击“构建”开始构建模型。当FPGA合成开始时,外部外壳将打开。单击“Next”。

  • 点击“Next”到“Load Bitstream”屏幕。

FPGA综合可能需要30分钟以上的时间。为了节省时间,你可以按照以下步骤使用预先生成的比特流:

  • 关闭外壳以终止合成。

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

  • 点击“加载并运行”按钮,加载预生成的比特流并在SoC板上运行模型

拷贝文件(fullfile (matlabshared.sup金宝appportpkg.getSupportPackageRoot,“工具箱”“soc”...“金宝appsupportpackages”“xilinxsoc”“xilinxsocexamples”“比特流”...“soc_histogram_equalization_top-zc706.bit”),”。/ soc_prj ');

现在模型在硬件上运行。要获得硬件中的内存带宽使用情况,请执行以下的axmaster测试台soc_histogram_equalization_top_aximaster

应用部署在硬件环境时,“内存带宽”的使用情况如下图所示。

总结

你设计了一个视频应用程序与实时HDMI I/O和外部内存的帧缓冲。您研究了其他内存使用者对总体带宽的影响。您使用SoC Builder在硬件上实现模型并验证设计。