视频系列 24:在三重缓存模式下使用 AXI VD

引言

在本系列视频中,我们将了解如何将三重缓存模式下设置的 AXI VDMA IP 集成到 Vivado 设计的视频流水中。

该设计将针对使用 PS DDR 的 Zynq®-7000 SoC ZC702 评估套件来进行设计。然而,同样的步骤可以应用于其他基于 Zynq 的视频设计,例如 PYNQ™ 电路板上上一个视频系列中的示例。

教程 – 在三重缓存模式下将 VDMA 添加到视频设计中

注意:本教程和附加文件仅适用于 Vivado Design Suite 2018.1,且仅适用于 ZC702 评估板。

构建 Vivado 工程

1. 下载教程文件并解压缩文件夹。

2. 打开 Vivado 2018.1。

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

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

注意:构建设计需要有效的测试模式生成器(Test Pattern Generator)许可证。

将 AXI VDMA 添加到视频流水线

5. 断开 AXI4-Stream 子集转换器和 AXI4-Stream to Video Out 之间的 AXI4-Stream 接口。

6. 将 AXI 视频直接存储器访问 (VDMA) 添加到块设计 (BD)。

7. 将 AXI VDMA 的 S_AXIS_S2MM 输入连接到 AXI4-Stream 子集转换器的 M_AXIS 输出,并将 VDMA 的 M_AXIS_MM2S 输出连接到 AXI4-Stream to Video Out 的 video_in 输出。

将 AXI VDMA 连接到存储器 (PS DDR)

要将 AXI VDMA 连接到 PS DDR,我们需要通过 Zynq 处理器并在 Zynq 处理器系统上启用“AXI 存储器映射”输入。

8. 双击 ZYNQ7 处理器系统打开其设置 GUI。

9. 在“PS-PL Configuration”部分,在“HP Slave AXI Interface”下启用“S AXI HP0 Interface”。单击“OK”关闭 Zynq 设置 GUI。

10. 将 S_AXI_HP0_ACK 输入连接到 ZYNQ 处理器系统的 FCLK_CLK0 输出。

11. 单击“Run Connection Automation”,让 Vivado 自动连接 AXI VDMA 的接口。

12. 在“Run Connection Automation”窗口中,确保选中“All Automation”,然后单击“OK”。

13. Vivado 可能会再次针对 M_AXI_S2MM 接口建议“Run Connection Automation”选项。如果是这种情况,请再次单击“Run Connection Automation”,确保选中“All Automation”,然后单击“OK”。

注意:在此示例中,我们将仅用一个时钟和一个存储器来完成整个设计。

因此,在“Run Connection Automation”选项中,我们没有很多选项。使用更复杂的设计时,使用此功能时最好小心一些。

设置 VDMA

14. 验证 BD。您会收到以下警告:
CRITICAL WARNING: [BD 41-237] Bus Interface property TDATA_NUM_BYTES does not match between /v_axi4s_vid_out_0/video_in(2) and /axi_vdma_0/M_AXIS_MM2S(4)

这是因为我们缺少 AXI VDMA 中的一种设置:AXI4-Stream 接口的宽度,所以无法与设计相匹配。

15. 双击 AXIVDMA 打开其设置 GUI。将读取通道的“Stream Data Width”参数更改为 16。单击“确定”关闭 AXI VDMA 设置 GUI(将所有其他参数保持为默认值)。

注意:默认情况下,AXI VDMA 设置有 3 个帧缓存区(这就是我们称之为三重缓存模式的原因,这是此 IP 最常见的用例)

16. 重新验证 BD。您应该不会收到警告或错误信息。保存 BD。

生成设计

17. 在源窗口中右键单击 BD,然后单击“Generate Output Products”。

18. 输出产品生成结束后,在源窗口中右键单击 BD,然后单击“Generate HDL wrapper”。

19. 运行综合和实现,然后生成比特流。

20. 将硬件导出到 SDK。单击“File > Export > Export Hardware”。

21. 确保已启用“Include Bitstream”并将导出位置更改为
/XVES_0024/sdk_export。

22. 关闭 Vivado

创建软件应用

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

从 Windows:

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

从命令行:

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

24. 在 xsct中,cd 到解压缩文件夹的路径。然后,输入命令 source create_SW_proj.tcl。

25. 打开 SDK 并选择 XVES_0024/sdk_workspace 作为工作空间。

管理存储器

在使用数据的存储器内存时要注意的一件事是要确保处理器使用的内存不是存储器内存所占用的部分。

26. 双击 vdma_zc702_app 下链接器脚本的文件 ld 将其打开。

在链接器脚本的“Section to Memory Region Mapping”表中,我们可以看到处理器将使用 PS DDR。我们可以限制处理器可用的内存量,以确保没有重叠。

27.在“Available Memory Region”,将 ps7_ddr_0 的大小更改为 0xEFFFFF,然后保存链接器脚本。

在设计中,PS 存储器 (1G) 是从 0x0 映射到 0x3FFF_FFFF 的。这就是说我们可以使用从 0x100_0000 到 0x3FFF_FFFF 的内存以存放来自 VDMA 的视频数据,而不需要处理器代码在同一位置。

设置并启动 AXI VDMA

要设置 VDMA,我们可以按照(PG020)第 72 页的一般用例(从写入通道开始)进行操作:

28. 使用以下代码将 S2MM_VDMACR (30h) 设置为 8Bh:
Xil_Out32 (XPAR_AXI_VDMA_0_BASEADDR + 0x30, 0x8B);

对于帧大小地址,我们需要知道一帧需要多少内存。进出 VDMA 的 AXI4-Stream 的宽度为 2 字节,而我们的图像尺寸为 800x600。我们需要用于一帧的内存量如下:

2 * 800 * 600 = 960,000 字节 (0xEA600)。

如果我们的第一个帧的缓存区放置在地址 0x1000_0000,那我们需要将第二个帧的缓存区放置在 0x100E_A600 或更高位置。

我们可以尝试保留一些余量,并将帧缓存区放置在每个0xF0000 所在的位置。因此,我们得到如下地址:

帧缓存 1 -> 0x1000_0000

帧缓存 2 -> 0x100F_0000

帧缓存 3 -> 0x101E_0000

29. 使用以下代码设置三个帧缓存区的起始地址:
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC, 0x10000000);
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xB0, 0x100F0000)
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xB4, 0x101E0000);

接下来,我们需要设置 STRIDE 和 HSIZE。我会在以后的用例中解释如何使用 HSTRIDE。

在大多数情况下,它的值可以与 HSIZE 的值相同。这是我们将用于此应用程序的内容。请注意,需要以字节为单位输入 HSIZE 和 STRIDE。由于我们的流接口为 2 字节宽,我们需要将水平大小乘以 2。

30. 使用以下代码配置 STRIDE 和 HSIZE:
Xil_Out32 (XPAR_AXI_VDMA_0_BASEADDR + 0xA8, 800*2);
Xil_Out32 (XPAR_AXI_VDMA_0_BASEADDR + 0xA4, 800*2);

31. 最后,要设置 VSIZE,请添加以下代码:
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA0, 600);

同理,读取通道的设置需遵循同样的步骤。我们可以使用同样的参数来进行设置:

32. 添加以下代码来设置读取通道:
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x00, 0x8B);
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x5C, 0x10000000);
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x60, 0x100F0000);
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x64, 0x101E0000);
Xil_Out32 (XPAR_AXI_VDMA_0_BASEADDR + 0x58, 800*2);
Xil_Out32 (XPAR_AXI_VDMA_0_BASEADDR + 0x54, 800*2);
Xil_Out32 (XPAR_AXI_VDMA_0_BASEADDR + 0x50, 600);

测试应用

33. 构建应用 (“Project > Build All”)。

34. 对 FPGA 进行编程 (“Xilinx > Program FPGA”),然后启动应用程序(右键单击“Application > Run As > Launch on Hardware”(系统调试器))。

您应该会在显示器上看到正确显示的彩条图案,这意味着视频正确地通过 VDMA。

想从这个视频系列中获得更多信息?

最新文章

最新文章