0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AXI VDMA IP 的高级用例

Hack电子 来源:Hack电子 2023-02-15 11:25 次阅读
引言

展示的是可以如何使用 AXI Video Direct Memory Access (VDMA) IP 来实现视频剪裁、画中画或软模式生成器功能。

示例 1:使用 AXI VDMA IP 的视频裁剪

视频裁剪

在某些情况下,您可能需要输出分辨率比输入分辨率小。视频剪裁是您可以通过 AXI 视频直接存储器访问(VDMA) IP 执行的一项操作。

视频剪裁是对图像的特定部分进行的“剪切”。我们可以通过只读取传入视频的一部分来完成此操作。

bdf6c57e-ac5c-11ed-bfe3-dac502259ad0.png

通过AXI VDMA IP来实现

在此示例中,我要将测试模式生成器(TPG) IP 用作源,并且将 AXI VDMA IP 配置为已启用读写通道。这与视频系列 24 中的设计相同。

be1a77c6-ac5c-11ed-bfe3-dac502259ad0.jpg

在这个应用中,我要把TPG IP设置为可以生成分辨率为1024x768的视频(而会把HDMI输出分辨率固定为800x600)

//Configure the TPG
app_hdmi_conf_tpg(&tpg_inst, 768, 1024, 0x2, XTPG_BKGND_COLOR_BARS);

必须完成的主要配置是 AXI VDMA IP。

写入接口被设置为1024x768

//S2MM Frame delay / Stride register
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA8, 1024*2);
// S2MM HSIZE register
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA4, 1024*2);
// S2MM VSIZE register
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA0, 768);

读取接口被设置为 800x600。

// MM2S Frame delay / Stride register
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x58, 1024*2);
// MM2S HSIZE register
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x54, 800*2);
// MM2S VSIZE register
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x50, 600);

请注意,此处的 STRIDE 参数不等于 HSIZE 参数。这是我们确实可以使用此参数的一种情况。

如果 STRIDE 等于 HSIZE,那么 AXI VDMA IP 会在没有任何跳转的情况下读取帧缓存。但是,由于输入大小大于输出大小,我们需要在地址之间跳转以便能够正确地对齐下一行的开头。


STRIDE 参数用于描述每个视频行第一个像素之间的地址的字节数。

be37fe4a-ac5c-11ed-bfe3-dac502259ad0.png

如果我们想在输入帧中移动剪裁窗口,我们只需在帧缓存地址中添加偏移,使 HSIZE 和 STRIDE 参数值保持一致即可。

be59ba8a-ac5c-11ed-bfe3-dac502259ad0.png

例如,如果我们想要让剪裁窗口水平居中,可以为读取接口的帧缓存地址添加 224 的偏移((hsize_in –hsize_out)/2 * bytes/pixel = (1024 - 800)/2 * 2 = 224)。

// MM2S Start Address 1
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x5C, 0x10000000 + 224);
// MM2S Start Address 2
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x60, 0x10200000 + 224);
// MM2S Start Address 3
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x64, 0x10400000 + 224);

注意:在此示例中,偏移需要是存储器映射数据宽度字节(32 位)的倍数,因为在“AXI VDMA IP”配置中未启用“Allow Unaligned Transfers”。

示例 2:使用 AXI VDMA IP 的画中画

画中画

如果设计中的输入分辨率小于输出分辨率,则可能采用的解决方案就是使用画中画。例如,我们可以添加蓝色背景,然后使输入居中。

be70d314-ac5c-11ed-bfe3-dac502259ad0.png

通过AXI VDMA IP来实现

设计的硬件与示例 1 中的硬件相同。

在这个应用中,TPG IP被设置为可以生成分辨率为640x480的视频(而HDMI输出分辨率固定为800x600)

//Configure the TPG
app_hdmi_conf_tpg(&tpg_inst,480,640, 0x2, XTPG_BKGND_COLOR_BARS);

我们需要做的第一件事就是用背景的蓝色填充帧缓存。

这是通过代码中的以下行来完成的:

UINTPTR Addr1=0x10000000,Addr2=0x10200000,Addr3=0x10400000;
…
print("Initialize frame buffer data...");
//Disable the data cache to initialize the frame buffer with a blue color
Xil_DCacheDisable();
//Write a blue background in the memory
for(line=0; line < OUTPUT_HEIGHT; line++)
{
for(column=0; column < OUTPUT_WIDTH/2; column++)
{
//Write the blue color to the frame buffer(0x6B1DFF1D in YUV422)
Xil_Out32(Addr1, 0x6B1DFF1D);
Xil_Out32(Addr2, 0x6B1DFF1D);
Xil_Out32(Addr3, 0x6B1DFF1D);

Addr1+=4;
Addr2+=4;
Addr3+=4;
}

}
//Re-enable the data cache
Xil_DCacheEnable();
print("Done

");

您可以看到,在将数据写入内存之前,我会禁用数据高速缓存(Xil_DCacheDisable())并在写入完成后重新启用它。

写入或读入高速缓存存储器而不是 DDR 存储器是一个常见的错误。使用内存时,您需要确保从正确的位置读取/写入。

然后,在进行 AXI VDMA IP 配置时,我们将执行与示例 1 中所执行操作相反的操作。

在这个示例中,我们会使用写入接口(而不是前面示例中的读取接口)上的步幅(现在已与 HSIZE 不同)在 800 * 600背景上正确地写入内存。

对于缓存存储器地址,我添加了一个偏移以便能够使输入水平和垂直居中。

//Offset to center the pattern on the buffer
offset = 0x177A0;
//S2MM Start Address 1
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC, 0x10000000 + offset);
//S2MM Start Address 2
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xB0, 0x10200000 + offset);
//S2MM Start Address 3
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xB4, 0x10400000 + offset);
//S2MM Frame delay / Stride register
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA8, OUTPUT_WIDTH*2);
// S2MM HSIZE register
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA4, 640*2);
// S2MM VSIZE register
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA0, 480);

示例 3:使用 AXI VDMA IP 的软模式发生器

通过AXI VDMA IP来实现

在此示例中,AXI VDMA IP 配置为仅启用读取接口。

在应用开始时,处理器在 DDR 中写入模式。

在 Vivado Design 中,我删除了“测试模式生成器”:

be8882ac-ac5c-11ed-bfe3-dac502259ad0.jpg

因为我们正在读取一个静止模式,所以在 AXI VDMA IP 读取时不会同时写入与帧缓存对应的存储器。因此,AAXI VDMA IP 中只需要一个帧缓存器。

bea6ffe8-ac5c-11ed-bfe3-dac502259ad0.jpg

写入存储器的方式与示例 2 中所用的方式类似,在需要访问 DDR 存储器时禁用高速缓存。

另外请注意,在配置 AXI VDMA IP 的 MM2S 接口时,同步锁相会被禁用。

构建SDK工作空间和Vivado Designs

注意:这些示例仅针对 ZC702 电路板。

构建SDK工程
  1. 下载教程文件,然后解压缩文件夹。

  2. 启动赛灵思软件命令行工具(XSCT) 2018.1。

  • 从 Windows 菜单中选择以下内容:

“Start > All Program > Xilinx Design Tools > Xilinx Software Command Line Tool 2018.1”。

  • 从命令行:

使用 xsct 命令(需要设置 SDK 2018.1 的环境变量)。

  1. 在 xsct 中,使用 cd 导航到您要构建的示例的路径(example_x/sw)。

    然后输入下列命令:
    source create_SW_proj.tcl

  2. 打开 SDK,然后选择“example_x/sw/sdk_workspace”作为工作空间。

构建Vivado Design
  1. 打开 Vivado 。

  2. 在 Tcl 控制台中,使用 cd 导航到解压缩的目录(cd example_x/hw)。

  3. 在 Tcl 控制台中,用 source 来写脚本 tcl (source ./create_proj.tcl)。


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储器
    +关注

    关注

    38

    文章

    7444

    浏览量

    163559
  • 分辨率
    +关注

    关注

    2

    文章

    1036

    浏览量

    41874
  • AXI
    AXI
    +关注

    关注

    1

    文章

    127

    浏览量

    16585

原文标题:AXI VDMA IP 的高级用例

文章出处:【微信号:Hack电子,微信公众号:Hack电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    XILINX FPGA IPAXI Traffic Generator

    AXI Traffic Generator IP 用于在AXI4和AXI4-Stream互连以及其他AXI4系统外设上生成特定序列(流量)。
    的头像 发表于 11-23 16:03 2314次阅读
    XILINX FPGA <b class='flag-5'>IP</b>之<b class='flag-5'>AXI</b> Traffic Generator

    AXI VDMA可以工作,但是少数线路不正确,总是丢包

    大家好我在Zedboard上遇到了AXI Video DMA的问题。我正在尝试在zedboard上进行简单的vdma测试演示。这是我的步骤。我想发送自己的图片(每像素32位)进行FPGA处理。我将自
    发表于 03-01 12:26

    什么会导致VDMAAXI视频直接存储器访问)的S2MM中的帧计数器中断?

    我使用VDMAAXI互连器和DDR3进行了设计,以实现视频帧缓冲。我遇到了一个问题,即在完成第一帧之后,VDMA卡在第二帧的开头。我通过AXI lite读取了
    发表于 03-14 15:28

    zynq上的AXI视频直接内存访问v6.2 IP

    大家好,有一个AXI VDMA IP,它可以很好地使用HP端口从zynq zc706上的PS DDR获取1920x1080 @ 60Hz视频。我们可以使用相同的IP在zynq zc70
    发表于 04-09 06:10

    如何将两个VDMA的同步锁相模式和Axi的定时模式设置为视频OUTIP?

    嗨,我在ZYNQ-7000 XC7Z045开发板和FMC-IMAGEON FMC模块(Avnet)上有一个系统。我的配置如下:HDMI输入 - >视频输入Axi-> VDMA
    发表于 11-08 06:02

    如何使用axi tpg和axi vdma

    嗨,我将使用axi tpg和axi vdma在zedboard上的ddr3中编写帧数据,但我不知道,如何在vivado 2014.4和我的项目的sdk c应用程序代码中设计vivado块设计,请帮帮我是zedboard的新用户。
    发表于 04-06 17:25

    请问如何扩展AXI VDMA帧缓冲器?

    为了减少VDMA调用的数量,我需要一个更大的帧缓冲32.我想扩展它,但我没有找到任何源文档或验证测试平台。有人可以推荐一种方法吗?我还考虑过使用AXI DMA。使用分辨率,我可以缓冲超过32帧,但仍然不够。感谢您的支持!
    发表于 04-27 08:05

    IP definition not found for VLNV: xilinx.com:ip:axi_vdma:6.2 ERROR: [Common 17-39] 'create_bd_cell' failed due to earlier errors.要如何解决呢

    : xilinx.com:ip:axi_vdma:6.2 ERROR: [Common 17-39] 'create_bd_cell' failed due to earlier errors. while
    发表于 10-06 22:22

    Xilinx VDMA 24位流输出与32位AXI总线的内存流数据关系

    个HDMI核是32位的,我自己写了个axis_24_32的位宽转换的ip,这个暂且按下不表: BEGIN axi_vdma PARAMETER INSTANCE = axi_vdma_0 PARAMETER
    发表于 02-09 05:53 717次阅读
    Xilinx <b class='flag-5'>VDMA</b> 24位流输出与32位<b class='flag-5'>AXI</b>总线的内存流数据关系

    PCIE通信技术:通过AXI-Lite ip配置的VDMA使用

    XDMA是Xilinx封装好的PCIE DMA传输IP,可以很方便的把PCIE总线上的数据传输事务映射到AXI总线上面,实现上位机直接对AXI总线进行读写而对PCIE本身TLP的组包和解包无感。
    的头像 发表于 12-28 10:17 3144次阅读

    你必须了解的AXI总线详解

    DMA的总结 ZYNQ中不同应用的DMA 几个常用的 AXI 接口 IP 的功能(上面已经提到): AXI-DMA:实现从 PS 内存到 PL 高速传输高速通道 AXI-HP----AXI
    的头像 发表于 10-09 18:05 7375次阅读
    你必须了解的<b class='flag-5'>AXI</b>总线详解

    全面介绍ZYNQ-AXI互联IP

    学习内容 近期设计需要用到AXI总线的IP,所以就对应常用的IP进行简要的说明,本文主要对AXI互联IP进行介绍。 基础架构
    的头像 发表于 05-11 14:52 6382次阅读
    全面介绍ZYNQ-<b class='flag-5'>AXI</b>互联<b class='flag-5'>IP</b>

    AXI4-Stream Video 协议和AXI_VDMAIP核介绍

    本文主要介绍关于AXI4-Stream Video 协议和AXI_VDMAIP核相关内容。为后文完成使用带有HDMI接口的显示器构建图像视频显示的测试工程做准备。
    的头像 发表于 07-03 16:11 8159次阅读

    什么是AXIAXI如何工作?

    Xilinx 从 Spartan-6 和 Virtex-6 器件开始采用高级可扩展接口 (AXI) 协议作为知识产权 (IP) 内核。Xilinx 继续将 AXI 协议用于针对 7 系
    的头像 发表于 09-27 09:50 1661次阅读
    什么是<b class='flag-5'>AXI</b>?<b class='flag-5'>AXI</b>如何工作?

    LogiCORE IP AXI UART 16550内核简介

    LogiCORE IP AXI 通用异步接收发送器 (UART) 16550 连接到高级微控制器总线架构 (AMBA) AXI,为异步串行数据传输提供控制器接口。该软
    的头像 发表于 10-16 11:02 4029次阅读
    LogiCORE <b class='flag-5'>IP</b> <b class='flag-5'>AXI</b> UART 16550内核简介