PYNQ-Z2 HDMI输出图形实验

本文介绍使用Xilinx的IP搭建HDMI输出图形平台,目标输出800*600像素图像,未用DDR缓存数据。说明了用到的开发板、软件和IP,详细阐述新建工程、BD、添加IP核及各IP核配置等步骤,最后生成文件并参考代码下载到板子,实现显示器输出。

在本文中作者使用Xilinx的IP搭建一个HDMI输出图形的平台。在这个平台上设计目标是输出800*600像素的图像,本实验没有使用DDR缓存图像数据。本次实验使用到的工具:

开发板:PYNQ-Z2;

开发软件:Vivado 2018.3;

IP:TPG,VTC,Video Out,rgb2dvi。

1.新建工程

如何新建工程这里不再详解,网上有很多关于Vivado建工程的文章。唯一需要注意的是新建工程的时候要选择对应型号的ZYNQ芯片。这里我选择的是xc7z7020clg400-1。

2.新建BD

操作如下:

3添加IP核

需要添加的IP如上图所示,这是已经connected的图。其中有两个System ILA核可以不需要,这两个核是用来调试用的。至于各个IP核的配置如下。

处理器的IP配置主要是DDR的型号及地址位宽,输入时钟的频率。需要注意的是本文输出了两个时钟信号给PL部分做参考,100MHz给AXI总线做参考,40MHz给HDMI输出做PixCLK,配置如下。

在本实验中作者使用TPG(Video Test Pattern Generator)作为图像数据源,我们可以通过AXI总线来动态配置其参数。默认的设置如下。

VTC(Video Time Controller)的作用是产生HDMI输出图像的时序。其设置如下:

 

接下来是Video Out的设置。

接下来的这个IP不是Xilinx自带的IP,rgb2dvi这个IP是Digilent开源的IP,可以在其官网上下载到,https://github.com/Digilent/vivado-library。下载好这个IP后,需要添加IP依赖才能使用。

在弹出来的对话框中找到该IP存放的文件路径,点击OK即可。

rgb2dvi的设置如下:

按照上面的操作就可连接各个IP的端口了,有些连接线可以自动连接。完成之后生成设计文件,添加约束,以及生成BIT文件。然后到处硬件,启动SDK。SDK的代码参考http://xilinx.eetrend.com/content/2019/100018845.html这篇文章。

#include <stdio.h>
#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");

    /* Insert the code for the TPG here */
    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;
}

下载到板子上显示器输出如下

### PYNQ-Z2 示例程序介绍与使用教程 PYNQ-Z2 是一款基于 Xilinx Zynq SoC 的开发板,支持 Python 编程和硬件加速,广泛应用于嵌入式系统开发和 FPGA 应用。其示例程序旨在帮助开发者快速熟悉该平台的功能及其操作方式。 #### 一、示例程序的作用 PYNQ-Z2 提供了一系列示例程序,这些程序涵盖了从基本功能演示到复杂硬件交互的应用场景。它们的主要作用包括但不限于以下几个方面: - **学习工具**:通过运行和分析示例代码,用户可以理解如何利用 PYNQ 平台实现特定功能。 - **验证环境**:确保开发板及相关软件环境正常工作。 - **扩展基础**:为用户提供模板代码,便于在此基础上构建自己的应用程序。 具体而言,示例程序覆盖的内容范围较广,例如 GPIO 控制、LED 驱动、传感器读取以及更复杂的 DMA 数据传输等[^1]。 #### 二、获取示例程序的方式 要获得 PYNQ-Z2 的示例程序,可以通过以下途径: 1. **官方镜像文件**: 官方发布的 SD 卡镜像已预装多个常用示例程序,在烧录完成后即可直接访问并执行[^2]。 2. **GitCode 仓库**: 访问项目地址 `https://gitcode.com/open-source-toolkit/8d558` 下载最新版本的资源文件,其中包含丰富的示例源码[^1]。 #### 三、运行示例程序的前提条件 在尝试任何示例之前,需完成必要的准备工作: - 硬件连接:确认 PYNQ-Z2 板卡正确接入电源和其他所需外部设备。 - 软件设置:按照文档指导完成 Linux 系统部署及 Jupyter Notebook 启动[^4]。 如果需要额外安装第三方依赖项,则可借助 pip 工具轻松解决。例如命令如下所示: ```bash pip install numpy scipy matplotlib ``` #### 四、典型示例解析 以下是几个常见的 PYNQ-Z2 示例说明: ##### 1. LED Blinking (GPIO 使用) 此案例展示了如何操控板上的 LEDs 实现闪烁效果。核心逻辑涉及初始化目标引脚作为输出端口,并周期性改变状态值。 ```python from pynq import Overlay, GPIO overlay = Overlay('base.bit') # 加载比特流文件 leds = overlay.ip_dict['leds_gpio'] # 获取对应外设对象 gpio_led = GPIO(GPIO.get_gpio_pin(0), 'out') while True: gpio_led.write(1) # 设置高电平点亮灯泡 time.sleep(0.5) # 延迟半秒 gpio_led.write(0) # 切换至低电平熄灭灯光 time.sleep(0.5) ``` 上述片段体现了 MMIO 技术用于简化寄存器级通信的过程[^5]。 ##### 2. Audio Processing (音频处理) 另一个重要领域聚焦于多媒体信号捕获与回放流程设计。下面摘选自实际应用场景中的关键部分: ```python import pynq.lib.audio as audio_driver audio_dev = audio_driver.Audio() input_data = audio_dev.record(seconds=5).astype(np.int16) processed_signal = apply_filter(input_data) # 自定义滤波算法调用 output_buffer = processed_signal.tobytes() audio_dev.play(output_buffer) ``` 这里运用到了高级特性比如实时 DSP 处理单元集成方案[^2]。 #### 总结 综上所述,掌握好 PYNQ-Z2 上的各种示范材料能够极大促进个人技能提升和技术积累过程。无论是初学者还是资深工程师都能从中受益匪浅!
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值