在Digilent Nexys Video板卡上实现HDMI I/O视频处理系统的软件配置介绍

作者:Adam Taylor,编译:kenshin

嵌入式视觉是当今科技最激动人心的领域之一。

关于使用Zynq SoC的嵌入式视觉应用,热心群众们说的太多,我就不赘述了。今天我们换一个新的视角,来看看如何使用纯FPGA来实现嵌入式视觉方案。

这篇文章,将带你了解如何使用Digilent Nexys Video Artix-7 FPGA多媒体音视频开发板来实现一个简单的HDMI输入/输出视频处理系统。特别是如果你是一名新手,通过本文,你会对基于FPGA的视频处理有更多基本的理解。

上篇(←点击了解),我们对如何用Nexys Video来实现一个简单的HDMI输入/输出视频处理系统做了扼要的概述。接着上篇,我们来看一下这一项目的软件配置部分

在Nexys Video Artix-7 FPGA开发卡上启动并运行MicroBlaze软核处理器系统后,我们需要使用一些软件来生成视频输出信号。在这个示例中,我们将使用MicroBlaze处理器生成测试模式。为了实现这个设计,我们将向Nexys Video板卡的DDR SDRAM中写入数据,然后VDMA读出这些数据并且通过HDMI输出。

软件部分我们首选要做的是定义视频帧,它将会被存储到内存并通过VDMA输出。我们将在内存中定义三个视频帧。每个视频帧的定义采用二维阵列:

u8 frameBuf[DISPLAY_NUM_FRAMES][DEMO_MAX_FRAME];

将参数DISPLAY_NUM_FRAME设置为3,DEMO_MAX_FRAME设置为1920 * 1080 * 3。这里需要考虑到最大帧分辨率,最后乘以3适用到每个像素(红,黄,蓝像素都采用8位来表示)。

为了能够访问这些帧,我们使用数组指针指向每个帧缓存空间。用这种方式定义会简化我们与视频帧之间的交互。

定义好视频帧后,下一步就是初始化和配置这个设计的流水线。具体如下:

  • VDMA – 使用DMA将数据从板上的DDR SDRAM搬运到视频输出链路中。
  • 动态时钟IP – 输出像素时钟频率以及这个频率的倍数用于HDMI输出。
  • 视频时序控制器0 – 根据分辨率定义输出显示时序。
  • 视频时序控制器 1 – 在输出接收端决定视频时序。在这个示例中,这个控制器从一个源获取输入视频帧。
  • 为了确保VDMA功能的正常,我们需要定义步幅,即DDR内存中每行之间的间隔。对于本项目,步幅设置为3 * 1920,这是每行的最大长度。

    在这一项目中,我们能设置不同的显示分辨率,从640x480 到 1920x1080。

    无论我们选择什么样的分辨率,我们都能够使用测试模式在屏幕上借助软件功能向DDR SDRAM写入数据。当我们改变功能时,我们还需要重新配置VDMA、视频时序生成器 0和动态时钟模块。

    下一步则是生成视频输出。在这个示例中主应用程序有很多功能可以生成、采集和显示视频。具体如下:
    1. Bar测试模式 – 在屏幕上生成多个颜色条
    2. 混合测试模式 – 在屏幕上生成混合颜色测试条
    3. 流模式,从HDMI输入到HDMI输出
    4. 抓取一个输入帧将颜色反转
    5. 抓取一个输入帧并按比例扩展到当前的显示分辨率

    按照下方的代码就可以轻松的实现设置红、蓝、绿像素的值。每个像素的颜色值都是无符号8位整数。

    frame[iPixelAddr] = wRed;
    frame[iPixelAddr + 1] = wBlue;
    frame[iPixelAddr + 2] = wGreen;

    当运行应用时,通过UART终端窗口我们可以看到输出的选项菜单,通过选择我们可以执行不同的功能来进行测试:

    设置程序输出颜色条,混合测试模式输出的效果如下图所示:

    通过本文,相信大家现在已经知道如何向DDR内存中写入信息并将它显示到屏幕上了。如果你喜欢此文,记得分享给你身边对“基于纯FPGA的视频处理”有同好的小伙伴哦~~

    项目实现全过程,可点击: http://www.digilent.com.cn/project/diy/199.html 收藏。

    声明:本文来源于Xilinx Xcell Daily Blog,由创新网赛灵思中文社区编译,转载请注明作者、出处及原文链接