基于FPGA(De10-Nano-OpenCL)实现自动驾驶车道检测硬件加速(详细全流程)

  • 本实验仅供参考学习,涉及的所有软件在文中均给出了下载地址,按照本文流程可执行其他类似的硬件加速项目。
  • 若需要执行本实验中所用到的项目文件,请向cucdlh@163.com发送请求,并说明用途。
  • 博主水平有限,若有错误欢迎指正,欢迎交流。

一 实验介绍

        本实验实现了车道检测的功能,并基于FPGA实现硬件加速。具体而言,本实验基于边缘检测和霍夫变换的基本原理,使用De10-Nano开发板,通过OpenCL框架实现检测的运算加速。

        设计的整体框架如下图所示,该OpenCL项目包括OpenCL Kernel(OpenCL内核)和Host Program(主机程序),内核是SoC FPGA的FPGA部分实现的,是在Quartus中开发的,要求Windows/Linux系统中安装有OpenCL SDK;主机程序并不是SoC FPGA的ARM部分,而是在安装了Intel SoC EDS的Windows/Linux系统上交叉编译的。本实验基于Windows 64。

二 原理介绍

边缘检测部分(edgedetect函数)

边缘检测部分使用了经典的Canny边缘检测算法,包括以下几个步骤:

  • 灰度转换:将输入的RGB图像转换为灰度图像。

  • 高斯模糊:对灰度图像进行高斯模糊,以减少噪声。

  • Sobel算子:计算图像的梯度,找出图像中的边缘。

  • 非极大值抑制:通过比较像素点的梯度方向,抑制非极大值点,保留边缘的细节。

  • 双阈值检测:通过设置高低阈值,确定强边缘和弱边缘,并进行边缘连接。

霍夫变换部分(hough 函数)

霍夫变换是一种用于检测图像中几何形状(如直线、圆等)的技术,基本原理为:

  • 在图像空间中,一条直线可以表示为 y = kx + b;

  • 在霍夫空间中,直线可以表示为 rho = x * cos(theta) + y * sin(theta),其中 rho 是直线到原点的距离,theta 是直线的角度;

  • 通过遍历图像中的每个边缘点,计算其在霍夫空间中的 rho 和 theta,并在累加器数组中进行投票。最终,累加器中的峰值对应于图像中的直线。

基于De10-Nano-OpenCL实现硬件加速

  • De10 - Nano 是一款基于 FPGA(现场可编程门阵列)的开发板。

  • OpenCL是一个开放的、跨平台的并行编程框架,允许开发者使用高级编程语言(如 C、C++)来编写可以在异构计算平台(包括 CPU、GPU、FPGA 等)上运行的程序。

  • FPGA 内部的逻辑单元可以同时处理多个数据,,可以同时对矩阵的多个元素进行乘法和加法运算,极大地加快了运算速度。

三 实验过程

提醒:需要提前准备一块De10-Nano的开发板

1 软件安装

重要:

1)Quartus安装时必须确保配置了有效的License,按照参考链接中的步骤逐步完成即可。

2)AOCL(Intel FPGA SDK for OpenCL)和SoC EDS统一安装在Quartus的安装目录下,AOCL安装后对应“hld”文件夹,SoC EDS安装后对应embedded文件夹:

3)从DE10-Nano OpenCL Board Support Package中下载DE10-Nano_OpenCL_BSP_18.1.zip(从官网上下载较为麻烦,可在文末直接下载),然后在..hld/board目录下创建文件夹“terasic”,将DE10-Nano_OpenCL_BSP_18.1.zip解压缩后得到的“de10_nano”文件夹复制到“terasic”中。

2 环境变量配置及验证

2.1 License环境配置

编译OpenCL项目需要一个Quartus许可证,打开电脑的设置/系统/系统信息/环境变量,在用户变量中点击新建,将变量名设置为“LM_LICENSE_FILE”,变量值即为安装Quartus时的License:

2.2 OpenCL环境配置

为了让系统正确找到OpenCL工具,需要创建一个用户环境变量INTELFPGAOCLSDKROOT,设置如下:

 在用户变量列表中选择Path项并点击编辑按钮,新建两个变量:

  • %INTELFPGAOCLSDKROOT%\bin

  • %INTELFPGAOCLSDKROOT%\host\windows64\bin

 2.3 DE10-Nano BSP配置

为了使Intel OpenCL SDK能够正确找到DE10-Nano的套件位置,需要创建一个用户环境变量AOCL_BOARD_PACKAGE_ROOT,设置如下:

2.4 OpenCL环境验证

首先验证AOCL是否正确配置,Win+R打开“运行”对话框,输入cmd打开“命令提示符”,输入“aocl version”,显示如下:

 接着验证目标开发板,输入“aoc -list-boards”,显示如下:

 至此,实验所需的软件/资源及相应的环境配置完毕,接下来将编译和执行本次实验对应的OpenCL项目。

3 编译和执行车道检测OpenCL Program

3.1 编译OpenCL Kernel

这一步是将实现车道检测的代码文件“hough.cl”编译为FPGA的配置文件。首先将车道检测的文件夹“Exercise_3”复制到“D:\intelFPGA\18.1\hld\board\terasic\de10_nano\test”下,然后在命令提示符窗口中输入以下命令,将当前目录更改为包含hough.cl的文件夹:

d:&cd D:\intelFPGA\18.1\hld\board\terasic\de10_nano\test\Exercise_3\design_files\part2\device

接着输入以下命令,编译OpenCL内核:

aoc hough.cl -o bin\hough.aocx -board=de10_nano_sharedonly -v -report

注意:若这一步编译不成功,可能原因是由于某个目录没有写入权限,因此在编译OpenCL Kernel前先将最高级目录(这里是intelFPGA)属性中的“只读”勾选取消并应用于此文件夹、子文件夹和文件,再次打开属性,显示-号就表示可以写入了。

编译完成后会在device目录下生成bin文件夹,其中有编译生成的OpenCL镜像文件hough.aocx,作为FPGA的配置文件:

 将该bin文件夹从device目录移动到part2目录中,方便查看。

 3.2 编译Host Promgram 

Host Promgram在Intel SoC EDS中进行编译。首先执行“D:\intelFPGA\18.1\embedded”下的“Embedded_Command_Shell.bat”来启动嵌入式命令行,在该命令行中输入以下命令将当前目录切换到包含host的文件夹:

cd /cygdrive/D/intelFPGA/18.1/hld/board/terasic/de10_nano/test/Exercise_3/design_files/part2

接着输入“ls”来查看该文件夹中包含的内容:

再输入“make”来编译Host Program:

编译成功后在bin文件夹下生成了“linedetect”文件:

 3.3 将Linux系统镜像文件烧录到microSD卡中

这一步的作用是将特定的Linux操作系统镜像安装到microSD卡上,以便后续将该 microSD 卡插入到De10-Nano设备中,使设备能够从该microSD卡启动并运行Linux系统。将De10-Nano板子上的microSD卡取下,插入读卡器中,再将读卡器插入到电脑,插入后先将该microSD卡格式化。

打开Win32 Disk Imager,添加de10_nano中的镜像文件:

点击写入,写入成功:

 镜像文件写入后的microSD卡:

再将前面生成的hough.aocx、linedetect和test_images(在Exercise_3文件夹)中的测试图片复制到DE10-Nano上运行的Linux系统中(即复制到该microSD卡中):

3.4 执行OpenCL Program

(此部分参考Terasic DE10-Nano Get Started Guide中的“如何设置串行终端”

将microSD卡插回到De10-Nano板上,并检查DSP开关是否按照MSEL[4:0] = 01010设置:

接下来需要安装 FTDI D2XX 驱动程序以启用通过UART到Terasic DE10-Nano的串行连接(在安装Quartus时会有安装该驱动的提示,若跳过了该驱动的安装或未安装,这个地方需要先安装),安装成功:

将电脑通过USB线连接到DE10-Nano上的UART-to-USB端口(J4),并接通板子的电源:

启动Putty,在Connection type(连接类型)下选择Serial(串行),并将Speed(波特率)设置为115200:

打开电脑中的设备管理器,找到端口(COM和LPT):

 将端口对应的COM填写到Putty中的Serial line(根据实际情况填写,我这里是COM3):

点击Open打开一个空白终端窗口,按Enter键显示登录提示,输入root后按Enter键即可登录:

输入“source ./init_opencl.sh”以加载OpenCL Linux内核驱动程序并设置OpenCL运行时库的环境变量,再输入“ls”查看目录:

这里可以看到该目录下并没有3.3中烧录的镜像和复制的文件,这是因为Linux系统启动后,需要将SD卡的文件系统挂载到系统的某个目录下才能访问其中的内容,先输入“fdisk -l”命令查看系统是否识别到了microSD卡设备,显示信息如下:

可以看到系统已经识别到了microSD卡设备,只是还未挂载,所以看不到其中的内容。输入“mkdir sdcard”命令创建一个“sdcard”文件夹,再输入“mount /dev/mmcblk0p1 sdcard”命令将microSD卡中的第一个分区挂载到新建的“sdcard”文件夹下,再输入“cd sdcard”切换到sdcard目录,输入“ls”查看目录:

这里就可以看到前面烧录和复制的内容了,接下来开始执行“linedetect”,依次使用命令“./linedetect --img=..sdcard/1.bmp”到“./linedetect --img=..sdcard/10.bmp”对10张测试图片进行车道检测:

四 实验结果

对测试图片执行“linedetect”后的结果被写入到microSD卡中,将microSD卡插入电脑可以看到车道检测的结果图(展示部分):

 

 

五 参考

Quartus Prime v18.1 standard-QuartusPrimeV18.1标准版安装过程_quartus prime standard edition-优快云博客

DE10_Nano_OpenCL_18.1.pdf(主要参考,提取码: 8y48)

基于FPGA的车道识别硬件加速-优快云博客(重要参考)

Terasic DE10-Nano Get Started Guide(3.4节的主要参考)

DE10-Nano_OpenCL_BSP_18.1.zip下载

​​​​​​https://pan.baidu.com/s/13m119UuXkYJKEG0Cg8r89A?pwd=sfjq 提取码: sfjq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值