天天看点

-03-实时Prewitt边缘检测,第一步:硬件平台搭建【ARM NEON加速】 S0. 设计要求 S1. 硬件平台选取 S2. FPGA逻辑设计 S3. ZYBO HDMI Demo工程导入

在上面的一篇里文章”-02-实时Prewitt边缘检测,640×480 @60fps【ARM NEON加速】 “里,提到了实时Prewitt边缘检测的硬件平台,展示了处理效果,还分享了视频:http://v.youku.com/v_show/id_XMjUyNTk3NzQwOA==.html?from=y1.7-2&spm=a2hzp.8253869.0.0。

下面将详细介绍整个系统的实现过程。

这一篇,主要介绍Prewitt边缘检测的设计要求和硬件平台的选取与设计。

S0. 设计要求

利用基于ARM处理器的可编程逻辑平台,设计如下图所示的片上系统,实现HDMI输入、VGA输出的实时视频处理系统,并运行Prewitt算子计算输入视频的二维梯度。

-03-实时Prewitt边缘检测,第一步:硬件平台搭建【ARM NEON加速】 S0. 设计要求 S1. 硬件平台选取 S2. FPGA逻辑设计 S3. ZYBO HDMI Demo工程导入

1. HDMI输入分辨率为1280×720,VGA输出分辨率为640×480,帧速率为60fps逐行扫描,每个像素的红、绿、蓝通道分别为1字节(8位)数据。系统将HDMI输入的图像数据存储在DDR RAM中的一个1280×720×3字节的帧缓冲内,同事从另一个640×480×3字节的帧缓冲区读取图像数据并输出至VGA。如果DDR RAM的数据接口为32位,计算HDMI输入和VGA输出分别需要占用的存储器贷款。

2. CPU完成Prewitt算子计算的基本过程是:顺序扫描输出图像中的每个点,设三坐标为(x/2,y/2+60),找到在输入图像中对应的点(x,y),CPU从输入图像缓冲区中读取附近8个点的数据,并计算它们的灰度

-03-实时Prewitt边缘检测,第一步:硬件平台搭建【ARM NEON加速】 S0. 设计要求 S1. 硬件平台选取 S2. FPGA逻辑设计 S3. ZYBO HDMI Demo工程导入

则改点在x、y方向的一阶梯度分别为

-03-实时Prewitt边缘检测,第一步:硬件平台搭建【ARM NEON加速】 S0. 设计要求 S1. 硬件平台选取 S2. FPGA逻辑设计 S3. ZYBO HDMI Demo工程导入

输出点的灰度为两个方向梯度的均方根:

-03-实时Prewitt边缘检测,第一步:硬件平台搭建【ARM NEON加速】 S0. 设计要求 S1. 硬件平台选取 S2. FPGA逻辑设计 S3. ZYBO HDMI Demo工程导入

CPU将计算结果G加以适当增益后,写入输出图像缓冲区的红、绿、蓝通道。输出图像上下空白处用黑色填补。

-03-实时Prewitt边缘检测,第一步:硬件平台搭建【ARM NEON加速】 S0. 设计要求 S1. 硬件平台选取 S2. FPGA逻辑设计 S3. ZYBO HDMI Demo工程导入

考虑Prewitt算子计算每个输出图像中的点时,需要8个输入图像中的点的数据。根据你使用的硬件平台性能参数,计算并验证DDR RAM存储器贷款是否满足60fps实时处理的需求。

3. 在硬件平台上实现该系统,并编写ARM处理器的程序,在不使用操作系统的情况下,仅由CPU完成Prewitt算子的计算。借助GPIO输出,观察CPU计算1帧输出图像需要的时间。

4. 利用ARM处理器中的NEON加速引擎,可以同时运算多个计算。编写程序使用NEON引擎完成这样的并行计算,以加速Prewitt算子的计算过程,观察计算1帧输出图像需要的时间,与没有NEON引擎参与的情形对比简要分析结果。

S1. 硬件平台选取

为了加速开发,我在这里直接选取开发板进行设计验证。而设计要求中说到要用HDMI输入、VGA输出、NEON功能,因此,选择的开发板需要有HDMI和VGA接口,ARM处理器需要能够支持NEON功能。

而一直以来Zynq SoC平台接触的比较多,这里就直接找一款该平台的开发板来进行设计。我手头有ZedBoard和ZyBo开发板,可惜的是ZedBoard的HDMI接口只能够支持输出,而ZyBO的HDMI接口输入输出都能够支持,因此我就选ZyBo了(ZyBo中XC7Z010芯片中的硬核ARM处理器为Cortex-A9)。

ZyBo是DIgilent公司做的开发板,网址:中文:http://www.digilent.com.cn/products/product-zybo-zynq-7000-arm-fpga-soc-trainer-board.html,英文:https://reference.digilentinc.com/reference/programmable-logic/zybo/start。

板子的链接如下图,图中的开发板有四个对外的接口,逆时针来看:USB调试接口、电源接口、HDMI输入接口(连接电脑的HDMI输出)、VGA输出接口(连接LCD显示器)。

-03-实时Prewitt边缘检测,第一步:硬件平台搭建【ARM NEON加速】 S0. 设计要求 S1. 硬件平台选取 S2. FPGA逻辑设计 S3. ZYBO HDMI Demo工程导入

Zynq系列SoC中,包含了PS(ARM)和PL(FPGA)部分,所以我们需要针对不同的部分进行设计。在FPGA中需要设计HDMI和VGA接口逻辑,以及相关的图像存储和读取逻辑功能;在ARM中需要设计图像的读取、Prewitt的NEON加速、以及结果图像的存储功能。这里虽然我就两句话说明了它们各自的任务,但是还需要进行细致的软硬件协同设计,才能够最终实现相关的功能。

FPGA部分的逻辑设计在这篇文章后面介绍,ARM部分NEON的处理在之后的文章再来介绍。

S2. FPGA逻辑设计

Zynq SoC内PL的逻辑结构设计如下图:

-03-实时Prewitt边缘检测,第一步:硬件平台搭建【ARM NEON加速】 S0. 设计要求 S1. 硬件平台选取 S2. FPGA逻辑设计 S3. ZYBO HDMI Demo工程导入

外部HDMI输入信号在PL内直接采用的DVP转RGB图像的IP模块进行数据HDMI信号的解码,再经过并行数据到串行数据的转换,并通过VDMA实现视频输入数据到DDR3存储器的存储。在一帧图像数据采集完成后PL会产生一个中断信号到ARM处理器,处理器会开使执行图像的Prewitt滤波程序,并将计算结果保存到指定的显存空间中。VDMA会同步将显存中的滤波后图像读取出来,然后将串行数据到RGB并行数据,并最终通过VGA显示IP模块实现VGA接口信号的输出。

上面的逻辑结构与设计要求中的视频数据流方式基本相同,一般的ARM芯片实现方式也是类似的。但是是以前没有用过Zynq的话,设计起来还是非常复杂的(因为涉及到了FPGA部分的调试,不像一般芯片中的视频输入输出接口是固化到芯片内的)。

HDMI TMDS

HDMI是我们常见到的一种显示接口,一端连接电脑之类设备、另外一端连接显示器进行显示。HDMI接口与DVI接口比较除了能够额外支持音频信号的输出,其它部分与DVI接口可以说是一模一样的。HDMI的数据是通过高速查分信号进行传输的,而且需要使用I2C接口传输显示器的EDID信息,可以百度一下HDMI接口或者关于TMDS的介绍:

HDMI:http://baike.baidu.com/link?url=dqa3Y8hzdBAiTGCm8abtf-WkqkskyDhwa3D5QaUo3xDpiZ_jmUe_-eEQMRxubQO3NEgNDTFj3fVb77SDVT_-cK

HDMI之TMDS:blog.sina.com.cn/s/blog_679686370100vgg1.htmlhttp://blog.sina.com.cn/s/blog_679686370100vgg1.html

DVI & HDMI 的 TMDS 原理:http://blog.sina.com.cn/s/blog_6a382cce0102vm79.html

高速查分信号看起来描述的挺简单的,在一般的嵌入式处理器中调试起来也比较简单,但是,但是,在FPGA里面去用逻辑实现还是非常复杂的!因为涉及到高速信号,必须要用的SERDES,自己重头去设计相关的接口简直是···我还是算了吧,找找现成的吧!

VGA

VGA接口的信号时序还是非常简单和易懂的,在FPGA中实现起来也很方便,我就不介绍了。

VDMA

AXI Video DMA是Xilinx Vivado中本身就包含的视频DMA IP,使用方法仔细研究官方文档:

AXI Video DirectMemory Access v6.2:https://www.xilinx.com/support/documentation/ip_documentation/axi_vdma/v6_2/pg020_axi_vdma.pdf

看起来是不是很麻烦,还不直接去用一般的嵌入式ARM芯片去实现。但是不要担心,在选用ZyBo之前我就想到了这些, 看一下这个链接:ZYBO HDMI Demo:https://reference.digilentinc.com/learn/programmable-logic/tutorials/zybo-hdmi-demo/start。

看完以后是不是很开森~~

上面说了那么多,最后还是用了别人给的Demo,是不是觉得我都说了废话。但是俗话都说 知其然不知其所以然 是不好的,他是怎么实现的还是需要仔仔细细的阅读他的RTL代码去学习。 虽然我花点时间也可以做出来相同的功能,但是时间宝贵啊,请上天宽恕我的偷懒··

ZYBO HDMI Demo的源码地址:

ZIP:https://github.com/Digilent/ZYBO/archive/master.zip

GitHub:https://github.com/Digilent/ZYBO

这个仓是ZyBo的所有例子,HDMI Demo在子目录/tree/master/Projects/hdmi_in中

S3. ZYBO HDMI Demo工程导入

下载源码文件后,打开子目录:ZYBO-master\Projects\hdmi_in,即是HDMI Demo工程。工程没有包含所有的文件,需要运行tcl脚本进行创建。我下载的源码是在Vivado 2016.2中设计的,所以又得重新下载一个2016.2的软件了(之前用的2015.4和2016.3,好烦啊~~~)。

如何运行tcl脚本创建工程参考文档:How to Generate a Project from Digilent’s Github Repository:https://reference.digilentinc.com/learn/software/tutorials/vivado-projects-from-digilent-github/start?redirect=1

运行脚本后我们就可以打开hdmi_in.xpr工程了。

hdmi_in.bd文件的模块连接如下图,看起来有点复杂,其实跟S2中说到的FPGA逻辑结构图功能基本相同。

-03-实时Prewitt边缘检测,第一步:硬件平台搭建【ARM NEON加速】 S0. 设计要求 S1. 硬件平台选取 S2. FPGA逻辑设计 S3. ZYBO HDMI Demo工程导入

接下来就是常规的点按钮!:综合、实现、生成bitstream、Export Hardware、Launch SDK。

Xilinx SDK打开后,就可以进行PS部分ARM程序的设计了,下一篇再来详细介绍~~