主要内容

使用外部存储器的对比度受限自适应直方图均衡

这个例子展示了如何在FPGA上实现对比度受限的自适应直方图均衡(CLAHE)算法,包括一个外部存储器接口。

支持的硬件

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

简介

视频处理算法通常在内存中存储一帧完整的视频数据。在FPGA上实现这种存储增加了BRAM的利用率,并可能导致输入视频分辨率的限制。这个例子展示了如何通过使用外部内存资源在fpga上实现视觉算法,以减少BRAM的使用,并支持处理更高分辨率的输入视频。

本例中的外部内存接口使用AXI4协议,并针对内存争用验证设计。AXI4随机访问接口为内存互连提供了一个简单的、直接的接口。该协议使算法可以直接提供地址和管理突发传输,从而充当内存主机。本例中的AXI4主写控制器和AXI4主读控制器块在Simulink™中建模一个简化的axis -4接口。当您使用HDL Coder™产品生成HDL代码时,生成的代码包含一个完全兼容的AXI4接口IP。

模型外部存储器

您可以使用SoC Blockset™块和可视化工具来建模、模拟和分析asic、fpga和芯片(SoC)上的系统的硬件和软件架构。这些特性可以帮助您使用内存模型、总线模型和接口模型构建系统体系结构,并帮助您模拟体系结构和算法。这个例子使用来自SoC Blockset库的两个块来建模外部内存:

  • 内存通道:这个块通过外部内存流数据。它通过共享内存为读写主算法之间的数据传输建模。本例使用AXI4随机访问通道类型。

  • 内存控制器:该块在主控制器之间进行仲裁,并授予它们对共享内存的唯一访问权。它被配置为支持多种仲裁协议的多通道。该块还记录和显示内存性能数据。该特性使您能够在模拟时分析和调试系统的性能。

HDL实现

CLAHE算法有三个步骤:平铺、直方图均衡化和双线性插值。双线性插值步骤使用来自输入帧的像素强度。存储视频数据的完整输入帧,直到双线性插值步骤需要外部存储器。

该图显示了示例模型的顶层。HDMI Rx块处理视频输入并将其传递给CLAHEAlgorithm_fpga子系统。HDMI Rx块将原始视频数据转换为YCbCr 4:2:2像素流格式。输出数据是一个适合硬件算法设计的像素流。HDMI Rx块还指示SoC建设者工具来生成从附着在硬件板上的FMC-HDMI-CAM卡接收视频数据所需的IP块。

在该模型中,AXI4- master写控制器和AXI4- master读控制器块对AXI4内存映射接口建模。AXI4-Master Write Controller块将输入帧写入外部内存,AXI4-Master Read Controller块从外部内存读取帧以进行双线性插值。AXI Read FIFO块将输出像素流发送到HDMI Tx块。HDMI Tx块将YCbCr 4:2:2格式的像素流转换为原始视频数据,以便在模拟过程中显示。该块还指示SoC建设者工具生成IP块,将视频数据传输回FMC-HDMI-CAM卡。当在硬件上运行设计时,为了指示AXI Read FIFO和AXI Write FIFO块的状态,来自这些块的四个调试信号连接到板上的led。

下一个图显示了CLAHEAlgorithm_fpga参考模型。输入像素流连接到视频流连接器块。该块提供一个视频流接口来连接FPGA实现中的任意两个ip。在本例中,视频流连接器块将HDMI输入和输出块与FPGA算法的其余部分连接起来。

下一个图显示了CLAHEAlgorithm_fpga/CLAHE子系统,它实现了从外部内存的AXI写和读,以及CLAHE算法。

该子系统包含以下区域:* AXI Write to Memory:该部分将输入数据写入DDR。它由一个AXI4 Master Write Controller块组成,该块接收来自HDMI Rx块的输入视频控制信息,并对AXI4内存映射接口进行建模,以便将数据写入DDR。它产生五个信号:wr_addrwr_lenwr_validrd_start,框架.的wr_valid信号是AXI Write FIFO块的输入,该块存储传入的像素强度。SoC Bus Creator块生成wrCtrlOut主从总线,用于将数据写入DDR。模型每次写入一行数据。写完tileHeight/ 2行(其中tileHeight对应于CLAHE中每个瓷砖的高度),模型断言rd_start开始读请求的信号。的框架Signal表示输入帧数。

  • AXI Read from Memory:该部分从DDR读取数据。它由一个AXI4-Master读控制器块组成rd_start来自AXI4-Master写控制器块的信号。AXI4-Master Read Controller块生成rd_addrrd_lenrd_avalid,rd_dready信号。一个SoC总线创建块将这些信号组合成一个总线。AXI4-Master Read Controller块还生成pixelcontrol对应的总线rd_data.模型切片32位rd_data信号提取8位(LSB)亮度分量,然后将其写入CLAHE算法的缓存存储器块。

  • CLAHE:有关用于硬件的CLAHE算法实现的详细描述,请参阅对比度受限自适应直方图均衡(视觉HDL工具箱)的例子。在本例中,CLAHEHDLAlgorithm子系统操作8位灰度图像,这就是8位亮度(Y)组件与16位YCbCr像素数据分离的原因。

CLAHEHDLAlgorithm子系统执行CLAHE的三个步骤:平铺、直方图均衡和双线性插值。在第一步中,输入框被划分为一个贴图网格。在第二步中,计算每个贴图的直方图,然后执行分布、再分配和CDF计算。计算出的CDF值存储在缓冲区中,以供进一步处理。第三步通过使用CDF值的双线性插值计算输出像素强度。输入帧的像素强度被用作存储CDF值的缓冲区的地址。这些像素强度从存储原始输入帧的外部存储器中读取。

因为从外部存储器读回的数据是在突发模式,它不能直接用于双线性插值。高速缓存缓冲区存储从外部存储器读取的行。缓存的深度足以存储等于的行数tileHeight.的rdValid信号从CLAHEHDLAlgorithm子系统生成rd_addr从缓存中读取数据的信号。从缓存读取的数据(pixValue)返回到CLAHEHDLAlgorithm子系统,完成双线性插值计算输出像素强度。

硬件实现

SoC建设者工具在FPGA板上构建、加载和执行模型。本例中使用的硬件板是Xilinx®Zynq®ZC706评估套件。要在硬件上构建、加载和执行设计,请遵循以下步骤。

  1. 为FPGA位流的合成、实现和生成设置Vivado®工具。

  2. 运行示例模型加速器模式以加速模拟。然而,SoC建设者工具要求正常的模拟模式。在“Simulink配置参数”中设置模拟模式正常的

  3. 启动SoC建设者通过点击工具配置、构建和部署在Simulink工具条中。

  4. 选择构建模型,然后回顾内存映射中的检查内存映射窗格。

  5. 选择项目文件夹窗格,指定您的项目文件夹。在选择构建操作窗格中,选择构建、加载和运行

  6. 验证模型窗格中,单击验证检查实现的模型的兼容性。然后单击构建开始构建模型。当FPGA合成开始时,一个外部外壳打开。

  7. 位流生成完成后,在连接硬件窗格中,选择测试连接测试主机与硬件板之间的连接。通过单击在硬件上加载比特流负载

这张图显示了最终结果SoC建设者完成这些步骤后的结果。

仿真和结果

本例使用一个大小为480 × 640像素的输入视频。这个大小在HDMI Rx块中配置。对于Xilinx Zynq ZC706评估套件,PL DDR控制器配置了一个运行在200 MHz的64位AXI4-Slave接口。得到的带宽为1600mb /s。这个示例有两个连接到DDR控制器的AXI主节点。这些AXI主机是DUT AXI4读和写接口。YCbCr 4:2:2视频格式每像素需要2个字节。对于DUT AXI4读和写接口,每个像素都被零填充为4个字节。在这种情况下,读写接口的吞吐量要求为2*4*480*640*60 = 147.456 MB/s。

该图显示了Memory Controller块的性能图。要查看性能图,首先打开Memory Controller块。然后,在性能选项卡上,单击查看性能的情节.选择下面的所有主控带宽,然后按更新.在DUT开始向外部内存写入和读取数据之后,吞吐量保持在154 MB/s左右,这在所需的147.456 MB/s的吞吐量范围内。

在仿真过程中记录示例模型中的信号。控件查看这些信号逻辑分析仪这个图显示了输入和输出帧的记录数据。

该图显示了模型的输入和输出帧。结果表明,输出图像的对比度得到了提高。

参考文献

[1] Zuiderveld,卡雷尔。“对比度有限的自适应直方图均衡。”在图形宝石IV,编辑保罗S.赫克伯特,474-485。美联社专业,1994年。

Baidu
map