视频系列 23:在 Pynq-Z2 HDMI 输出上生成视频输出

引言

在先前的视频系列文章(视频系列 19视频系列 20 和视频系列 21)中,我们已经了解了如何在 Zynq®-7000 SoC ZC702 评估板的 HDMI 连接器上生成视频输出。ZC702 电路板将 ADV7511 HDMI 发送器用作视频接口,但并非所有解决方案都使用外部器件。

例如,在 PYNQ™-Z2 电路板(连接到 Pynq-z2 产品页面),HDMI 连接器直接连接到 Zynq 串行 I/O (请注意,这也不同于ZCU102/ZCU104或使用千兆收发器的 ZCU106 电路板上的解决方案)。同样的步骤可以应用于其他电路板(例如 Digilent Arty Z7、Arty A7 或 Zybo Z7)。

在本视频系列的这篇文章中,我们将展示一下如何通过创建一个小型设计在 Pynq-Z2 电路板的 HDMI 输出上生成图案。

关于 PYNQ-Z2

PYNQ-Z2 是一款基于 Xilinx Zynq SoC 的低成本电路板,专门设计来支持 PYNQ (全称为 Python Productivity for Zynq) 框架和嵌入式系统开发。

教程 – 在 PYNQ-Z2 电路板上使用 TMDS I/O 进行的 DVI 输出

注意:本教程仅适用于 Vivado Design Suite 2018.1,且仅适用于 PYNQ-Z2 电路板。

构建 Vivado 工程

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

2. 从下列 TUL 网页下载 PYNQ-Z2 的 Vivado 电路板文件:http://www.tul.com.tw/ProductsPYNQ-Z2.html

3. 解压缩文件夹,然后将内容复制到“Xilinx\Vivado\2018.1\data\boards”。

4. 打开 Vivado 2018.1。

5. 创建一个新的工程。

6. 在“Default Part”窗口中,您应该会在列表中看到 pynq-z2。单击此工程的 PYNQ-Z2 电路板。

7. 在 Vivado 中,创建一个新的块设计(单击“Flow > Create Block Design”)。

8. 在 Block Design (BD) 中,添加 ZYNQ7 处理器系统 IP。

9. 在 BD 的顶部,单击“Run Block Automation”。

10. 确保已启用“Apply Board Preset”,然后单击“OK”。

11. 添加 Video Test Pattern Generator (TPG) IP。

12. 在 BD 的顶部,单击“Run Connection Automation”。

13. 双击 ZYNQ7 处理器系统 IP 进行配置。在“Clock Configuration”部分的“PL Fabric Clocks”下,启用 FCLK_CLK1 并将其时钟频率设置为 40 MHz。

14. 单击“OK”关闭 ZYNQ7 处理器系统 IP 的配置 GUI。

15. 添加 Video Timing Controller (VTC) IP 并双击打开其配置 GUI。

16. 在“Detection/Generation”标签中,单击“Include AXI4-Lite Interface”并取消单击“Enable Detection”。

17. 在“Default/Constant”标签中,将视频模式设定为 800x600p。

18. 将来自 VTC 的 clk 输入连接到 Zynq PS IP 的 FLCK_CLK1 输出。

19. 将 AXI4-Stream 添加到此 BD 的 Video Out IP,然后双击此 IP 进行配置。将时钟模式更改为“Independent”。

20. 在 Tcl 控制台中,从教程文件夹(XVES_0023/src/tcl)中获取脚本 Tcl。

connect_nets_XVES0023.tcl

此脚本将连接到此设计的所有 IP。

现在,我们差不多已经构建了与 ZC702 电路版上的视频系列 21 一样的设计。在 ZC702 电路板上,HDMI 接口已通过外部 ADV7511 HDMI 发送器完成。在 PYNQ-Z2 上,我们需要处理可编程逻辑 (PL) 中的视频接口。 我们可以使用来自 Digilent 的免费 IP(称为 rgb2dvi)来完成此操作(该 IP 将生成我们可以在 PYNQ-Z2 电路板的 HDMI 输出连接器上使用的 DVI 信号)。

21. 从 Digilent git 存储库下载并解压缩 Vivado 库(单击“Clone or Download > Download ZIP”):
https://github.com/Digilent/vivado-library

22. 在 Vivado 中,单击“Setting > IP > Repository”,然后将指向解压缩的 Vivado 库文件夹的路径添加到 IP 存储库列表中。单击“Apply > OK”。

23. 在 BD 中,将 RGB 添加到 DVI 视频编码器 (rgb2dvi) IP(该 IP 现在应该会显示在 IP 目录中)

24. 双击 rgb2dvi IP 进行配置。将 TMDS 的时钟范围更改为“<80 MHz (720p)”,然后单击“OK”。

25. 将 rgb2dvi IP 的 RGB 输入连接到 AXI4-Stream to Video Out IP 的 vid_io_out。

26. 将来自 rgb2dvi IP 的 PixelClk 输出连接到 Zynq 处理器的 FCLK_CLK1 输出。

27. 扩展 rgb2dvi IP 的 TMDS 接口,然后将所有信号(TMDS_Clk_p/n 和 TMDS_Data_p/n)置于 BD 外部(右键单击引脚,然后单击“Make External”)。

28. 验证 BD。验证应该会成功。保存 BD。

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

30. 生成结束后,右键单击 BD,然后单击“Create HDL wrapper”。

31. 从 TUL 网页下载 PYNQ-Z2 的 XDC 主文件: http://www.tul.com.tw/download/PYNQ-Z2_v1.0.xdc.zip

32. 解压缩文件夹并将 XDC 文件添加到工程中 (“File > Add Sources > Add”或 “Create constraints”)。

33. 双击源窗口中的 XDC 文件,在文本编辑器中将其打开。找到与 HDMI TX 对应的行并取消注释以下行(通过删除行开头的“#”符号):
set_property -dict { PACKAGE_PIN L17 IOSTANDARD TMDS_33 } [get_ports { hdmi_tx_clk_n }]; #IO_L11N_T1_SRCC_35 Sch=hdmi_tx_clk_n
set_property -dict { PACKAGE_PIN L16 IOSTANDARD TMDS_33 } [get_ports { hdmi_tx_clk_p }]; #IO_L11P_T1_SRCC_35 Sch=hdmi_tx_clk_p
set_property -dict { PACKAGE_PIN K18 IOSTANDARD TMDS_33 } [get_ports { hdmi_tx_d_n[0] }]; #IO_L12N_T1_MRCC_35 Sch=hdmi_tx_d_n[0]
set_property -dict { PACKAGE_PIN K17 IOSTANDARD TMDS_33 } [get_ports { hdmi_tx_d_p[0] }]; #IO_L12P_T1_MRCC_35 Sch=hdmi_tx_d_p[0]
set_property -dict { PACKAGE_PIN J19 IOSTANDARD TMDS_33 } [get_ports { hdmi_tx_d_n[1] }]; #IO_L10N_T1_AD11N_35 Sch=hdmi_tx_d_n[1]
set_property -dict { PACKAGE_PIN K19 IOSTANDARD TMDS_33 } [get_ports { hdmi_tx_d_p[1] }]; #IO_L10P_T1_AD11P_35 Sch=hdmi_tx_d_p[1]
set_property -dict { PACKAGE_PIN H18 IOSTANDARD TMDS_33 } [get_ports { hdmi_tx_d_n[2] }]; #IO_L14N_T2_AD4N_SRCC_35 Sch=hdmi_tx_d_n[2]
set_property -dict { PACKAGE_PIN J18 IOSTANDARD TMDS_33 } [get_ports { hdmi_tx_d_p[2] }]; #IO_L14P_T2_AD4P_SRCC_35 Sch=hdmi_tx_d_p[2]

34. 更改端口名称让其与 BD 中的名称相匹配。默认情况下,应如下所示:
set_property -dict { PACKAGE_PIN L17 IOSTANDARD TMDS_33 } [get_ports { TMDS_Clk_n_0 }]; #IO_L11N_T1_SRCC_35 Sch=hdmi_tx_clk_n
set_property -dict { PACKAGE_PIN L16 IOSTANDARD TMDS_33 } [get_ports { TMDS_Clk_p_0 }]; #IO_L11P_T1_SRCC_35 Sch=hdmi_tx_clk_p
set_property -dict { PACKAGE_PIN K18 IOSTANDARD TMDS_33 } [get_ports { TMDS_Data_n_0[0] }]; #IO_L12N_T1_MRCC_35 Sch=hdmi_tx_d_n[0]
set_property -dict { PACKAGE_PIN K17 IOSTANDARD TMDS_33 } [get_ports { TMDS_Data_p_0[0] }]; #IO_L12P_T1_MRCC_35 Sch=hdmi_tx_d_p[0]
set_property -dict { PACKAGE_PIN J19 IOSTANDARD TMDS_33 } [get_ports { TMDS_Data_n_0[1] }]; #IO_L10N_T1_AD11N_35 Sch=hdmi_tx_d_n[1]
set_property -dict { PACKAGE_PIN K19 IOSTANDARD TMDS_33 } [get_ports { TMDS_Data_p_0[1] }]; #IO_L10P_T1_AD11P_35 Sch=hdmi_tx_d_p[1]
set_property -dict { PACKAGE_PIN H18 IOSTANDARD TMDS_33 } [get_ports { TMDS_Data_n_0[2] }]; #IO_L14N_T2_AD4N_SRCC_35 Sch=hdmi_tx_d_n[2]
set_property -dict { PACKAGE_PIN J18 IOSTANDARD TMDS_33 } [get_ports { TMDS_Data_p_0[2] }]; #IO_L14P_T2_AD4P_SRCC_35 Sch=hdmi_tx_d_p[2]

35. 保存 XDC 文件。

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

37. 将硬件导出到 SDK,包括比特流(“File > Export>Export Hardware”)。

创建软件应用

38. 从 Vivado 启动 SDK(“File > Launch SDK”)。

39. 在 SDK 中,创建一个新的应用工程(“File> New application project”)并单击“Hello World”模板。

40. 在 SDK 文本编辑器中打开 helloworld.c 文件。

41. 编辑下面显示的文件(预知有关代码的更多详清,请参阅视频系列 21)。
include
#include "platform.h"
#include "xil_printf.h"
#include "xv_tpg.h"

XV_tpg tpg_inst;
int Status;

int main()
{
init_platform();

print("Hello World\n\r");

/* TPG Initialization */
Status = XV_tpg_Initialize(&tpg_inst, XPAR_V_TPG_0_DEVICE_ID);
if(Status!= XST_SUCCESS)
{
xil_printf("TPG configuration failed\r\n");
return(XST_FAILURE);
}

// Set Resolution to 800x600
XV_tpg_Set_height(&tpg_inst, 600);
XV_tpg_Set_width(&tpg_inst, 800);

// Set Color Space to RGB
XV_tpg_Set_colorFormat(&tpg_inst, 0x0);

//Set pattern to color bar
XV_tpg_Set_bckgndId(&tpg_inst, XTPG_BKGND_COLOR_BARS);

//Start the TPG
XV_tpg_EnableAutoRestart(&tpg_inst);
XV_tpg_Start(&tpg_inst);
xil_printf("TPG started!\r\n");
/* End of TPG code*/

cleanup_platform();
return 0;
}

42. 保存文件。

43. 使用 micro USB 电缆将 Pynq-Z2 连接到计算机,并将引导模式启动电缆设置为 JTAG。使用 HDMI 输出连接器将 PYNQ-Z2 连接到HDMI 监控器。打开 PYNQ-Z2 电路板的电源。

44. 打开 UART 终端并正确无误地将其配置为 PYNQ-Z2 的 COM 端口。

45. 对 FPGA 进行编程并启动应用。

46. 您现在应该会看到显示器上显示的图案。

文章转载自:赛灵思中文社区论坛

最新文章

最新文章