AXI VDMA IP 的高级用例

引言   展示的是可以如何使用 axi video direct memory access (vdma) ip 来实现视频剪裁、画中画或软模式生成器功能。
示例 1:使用 axi vdma ip 的视频裁剪
视频裁剪   在某些情况下,您可能需要输出分辨率比输入分辨率小。视频剪裁是您可以通过 axi 视频直接存储器访问 (vdma) ip 执行的一项操作。
视频剪裁是对图像的特定部分进行的“剪切”。我们可以通过只读取传入视频的一部分来完成此操作。
通过 axi vdma ip 来实现   在此示例中,我要将测试模式生成器 (tpg) ip 用作源,并且将 axi vdma ip 配置为已启用读写通道。这与视频系列 24 中的设计相同。
在这个应用中,我要把 tpg ip 设置为可以生成分辨率为 1024x768 的视频(而会把 hdmi 输出分辨率固定为 800x600)
//configure the tpgapp_hdmi_conf_tpg(&tpg_inst, 768, 1024, 0x2, xtpg_bkgnd_color_bars); 必须完成的主要配置是 axi vdma ip。
写入接口被设置为 1024x768
//s2mm frame delay / stride registerxil_out32(xpar_axi_vdma_0_baseaddr + 0xa8, 1024*2);// s2mm hsize registerxil_out32(xpar_axi_vdma_0_baseaddr + 0xa4, 1024*2);// s2mm vsize registerxil_out32(xpar_axi_vdma_0_baseaddr + 0xa0, 768); 读取接口被设置为 800x600。
// mm2s frame delay / stride registerxil_out32(xpar_axi_vdma_0_baseaddr + 0x58, 1024*2);// mm2s hsize registerxil_out32(xpar_axi_vdma_0_baseaddr + 0x54, 800*2);// mm2s vsize registerxil_out32(xpar_axi_vdma_0_baseaddr + 0x50, 600); 请注意,此处的 stride 参数不等于 hsize 参数。这是我们确实可以使用此参数的一种情况。
如果 stride 等于 hsize,那么 axi vdma ip 会在没有任何跳转的情况下读取帧缓存。但是,由于输入大小大于输出大小,我们需要在地址之间跳转以便能够正确地对齐下一行的开头。
stride 参数用于描述每个视频行第一个像素之间的地址的字节数。
如果我们想在输入帧中移动剪裁窗口,我们只需在帧缓存地址中添加偏移,使 hsize 和 stride 参数值保持一致即可。
例如,如果我们想要让剪裁窗口水平居中,可以为读取接口的帧缓存地址添加 224 的偏移 ((hsize_in –hsize_out)/2 * bytes/pixel = (1024 - 800)/2 * 2 = 224)。
// mm2s start address 1xil_out32(xpar_axi_vdma_0_baseaddr + 0x5c, 0x10000000 + 224);// mm2s start address 2xil_out32(xpar_axi_vdma_0_baseaddr + 0x60, 0x10200000 + 224);// mm2s start address 3xil_out32(xpar_axi_vdma_0_baseaddr + 0x64, 0x10400000 + 224); 注意:在此示例中,偏移需要是存储器映射数据宽度字节(32 位)的倍数,因为在“axi vdma ip”配置中未启用“allow unaligned transfers”。
示例 2:使用 axi vdma ip 的画中画
画中画   如果设计中的输入分辨率小于输出分辨率,则可能采用的解决方案就是使用画中画。例如,我们可以添加蓝色背景,然后使输入居中。
通过 axi vdma ip 来实现 设计的硬件与示例 1 中的硬件相同。
在这个应用中,tpg ip 被设置为可以生成分辨率为 640x480 的视频(而 hdmi 输出分辨率固定为800x600)
//configure the tpgapp_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 colorxil_dcachedisable();//write a blue background in the memoryfor(line=0; line < output_height; line++){for(column=0; column all program > xilinx design tools > xilinx software command line tool 2018.1”。
从命令行:
使用 xsct 命令(需要设置 sdk 2018.1 的环境变量)。
在 xsct 中,使用 cd 导航到您要构建的示例的路径 (example_x/sw)。
然后输入下列命令:
source create_sw_proj.tcl
打开 sdk,然后选择“example_x/sw/sdk_workspace”作为工作空间。
构建 vivado design 打开 vivado 。
在 tcl 控制台中,使用 cd 导航到解压缩的目录 (cd example_x/hw)。
在 tcl 控制台中,用 source 来写脚本 tcl (source ./create_proj.tcl)。


芯进电子入榜“2023未来之星·川商最具价值投资企业TOP20”
爱仕达:持续拓展机器人领域,打造全产业链竞争优势
现有控制系统并行操作中的PAC提高处理及通讯性能
【北亚数据恢复】LINUX执行FSCK之前需要做那些准备工作?
丰田自动驾驶进入测试阶段,地点定在加州
AXI VDMA IP 的高级用例
智能家居解决方案惹关注 润欣参展上交会完美收官
自制超牛自动汽水机
如何为带内部或外部扬声器的产品选择音频放大器
按键式时控开关如何修改之前设置的时间
苹果13支持息屏显示功能吗
无线充电技术在实际应用中体验如何
开放原子开源基金会TOC(技术监督委员会)第六十九次全体会议
比亚迪新电动车上市,续航300公里!售价23.59万起
泰芯TX8C1260TS20 TSSOP20(兼容STM8S003F3、新唐N76E003AT20)通用8位MCU单片机
华强芯城!硬创总决赛夺冠一触即发
Android安全性:保护你的应用和用户数据
如何理解跟网型和构网型变流器的工作原理?
2019年将是中国智能锁行业的洗牌之年
高压开闭器放电的原因