基于Xilinx Zynq的物距测量系统设计与实现

FPGA/ASIC技术

206人已加入

描述

摘 要:为了对障碍物距离精确测量,基于最新Zedboard FPGA(现场可编程逻辑阵列)开发板,采用软硬件协同的设计 方法,设计了障碍物距离测量系统的软硬件。系统为智能小车平台提供了完整的距离测量服务,测距范围能够达到2cm~4.5m,精度可达0.2cm。该设计包含从底层硬件电路设计、可编程逻辑IP(IntellectualProperty)核设计、到Linux设备驱动的设计全部流程,对于在Zynq⁃7000FPGA上软硬件从事开发的人员有一定的参考价值。

随着集成电路的制造和应用技术的快速发展,嵌入式系统的性能也不断提升,已经被广泛应用于工业控制、航空航天、军事以及消费电子等领域。在硅工艺的发展以及市场推动下,Xilinx公司推出了基于7系列FPGA的新一代全可编程(AllProgrammable)Zynq⁃7000系列产品。该系列产品,集成了嵌入式领域集大成者——双核ARM CortexA9处理器和7系列28nm工艺FPGA芯片。Zedboard正是这样一款基于Zynq⁃7000产品的实验 开发板卡,提供了软件和硬件设计的更多可能。本文基于目前FPGA业界最先进的Zedboard FPGA(现场可编程逻辑阵列)开发板,从底层硬件电路设计、可编程逻辑IP(IntellectualProperty)核设计、到Linux设备驱动的设计,实现了障碍物距离测量的软硬件系统,并在智能小车平台上,实现了距离测量服务。该方法对于在Zynq⁃7000FPGA上软硬件的开发具有指导作用。

1、系统设计

传统上,FPGA中嵌入处理器内核,都是以FPGA为 主、处理器为辅,设计思路以可编程逻辑为主。然而新一代全可编程的Zynq⁃7000采取不同的思路,它是以处理器为主,FPGA为辅。FPGA变成了ARM处理器的一个协处理器[1]。图1为Zynq⁃7000SoC芯片的结构图。 简单来说,Zynq由PS和PL两部分组成:PS(Pro⁃cessingSystem,处理系统)相当于一片ARM芯片,而PL (ProgrammableLogic,可编程逻辑)相当于一片FPGA芯片。

Linux

图1:Zynq结构图

PS系统结构为:双核A9处理器,其是整个平台的控制中心,处理速度高达1GHz,可通过NEON扩展及单精度浮点单元进行增强,拥有32KB指令及数据L1 缓存,统一的512KBL2缓存和256KB片上存储器;存储接口,用以管理片内系统的存储状态,包含DDR3,DDR2和LPDDR2动态存储控制器和两个QSPI,NANDFLASH及NORFLASH控制器;通用外设,PS中的通用外设是ARM直接和外部设备通信的接口,含SPI,I2C, CAN,UART,GPIO,USB2.0等;其他组成部分。

PL部分结构为:低功耗可编程逻辑,包含28K~ 350K个逻辑单元,240K~2180K可扩展式BlockRAM和80~900个DSPSlice;XADC,为PL内置的12b模/数转换器;通用/定制外设,PL中的外设是PL中的器件和 外部通信的接口。在ARM接口不够用时,可以利用PL的外设接口。PS和PL之间的数据交互,则是通过AXI(AdvancedeXtensibleInterface)接口实现的。具体有:高性能AXI接口(HighPerformanceAXISlavePorts),共4个;通用AXI接口,包括两个主设备接口和两个从设备接口,共4个;加速一致性端口,是ARM多核架构下定义的一种接口。

根据Zynq结构特点,在应用系统结构设计时注意,使用由Zynq这样一款功能强大的SoC芯片,与一般的ARM芯片不同,与常用的FPGA,更存在区别。它要求 硬件和软件之间进行协同设计,共同实现既定的性能指标要求。在SoC设计中,IP(IntellectualProperty,知识产权)核重用技术是一个很重要的概念,它是软硬件协同设计的关键,通过标准化IP核可以实现模块复用,可以完成大规模的、复杂的SoC设计[3]。

本文以一个超声波测距系统为例,介绍如何在ZynqSoC上,定制IP、设计Linux设备驱动等,并完整的阐述了从硬件到软件的设计流程。设计的系统结构如图2所示。PS上,运行Linux操作系统,为LinaroUbuntu发行版。根据文献[2]的指导操作,使用Xilinx公司的开发软件完成配置,使PS可以运行操作系统。

Linux

图2:系统结构图

PL部分按照系统控制的需求进行定制。设计基于 XilinxAXI总线的超声波处理外设IP核,与外部的超声波发射和接收电路交互。在Linux操作系统下,这个IP核就成为了一个设备,这就需要编写相应的设备驱动程序,实现超声波测距功能的封装。

2、 主要模块设计

2.1 超声波测距模块
该模块基本工作原理是:通过超声波发射探头,发射频率为40kHz的超声波信号;当超声波信号遇到障碍物时,会发生反射;当超声波接收探头接收到40kHz频率附近的声波信号时,经过信号调理电路;再通过系统计算接收与发射之间的时间差计算障碍物距离。

Linux

图3测距模块

设计中共使用到了三个相同测距模块,分别测量三个不同的方向上障碍物距离。测距模块分为超声波发射部分和接收部分,模块的电路结构如图4所示。具体是采用HC⁃SR04超声波测距模块,进行硬件设计[6]。该电路的对外接口为触发(TRIG)控制端和回响(ECHO)信号接收端。通过I/O口TRIG触发测距,提供了一个10ms以上的高电平触发信号,该模块将发出8个40kHz的方波用于探测,并自动检测是否有回波信号。一旦检测到有回波信号则通过I/O口ECHO输出一个高电平回响信号,且回响信号的高电平时间tH(单位:ms)即高电平持续的时间与所测的距离S成正比。其对应关系为:

Linux

式中:S为测试距离;tH为高电平时间(单位:s);v为声速340m/s。

发射部分:利用串口转换芯片的升压功能,采用MAX232将输入JN1和JN2的3.3VTTL电平转换,得到5V电平。它激励超声波发射探头的信号压差为10V, 发出40kHz的超声波。如图4所示。

Linux

图4 发射电路

接收部分:对回波信号进行滤波、放大处理。接收电路图如图5所示。其中NET9为控制接收电路工作的使能端口,NET10为接收电路工作且接收到了回波信号时的响应信号。

Linux

图5: 接收电路图

2.2 IP核设计
使用Xilinx的设计工具XPS(XilinxPlatformStudio) 建立IP的流程,新建一个Ultrasonic(超声波)IP核模块。该IP核的模块结构如图2所示中的超声波处理外设部分,其中Triggercounter,Clockgen和Echocounter使用VerilogHDL实现。根据超声波测距模块的测距时序要求,设计触发和回响信号的逻辑,由Triggercounter和Echocounter实现。最终将测量到的数据放到AXI4定义的寄存器中,使处理器能从AXI总线上读取数据。本IP核有4个寄存器(reg0~reg3),与AXI4总线相连,用户可以通过这4个寄存器控制发射超声波,获取测量的距离。其中,reg0的功能是使能一次测距以及三个方向上测量完毕标志,图6为reg0寄存器映射表;reg1~reg3为计数后计算得到的三个方向上超声波测量到的距离数值。将设计的IP核添加到XPS工程中去,分配得到的地址空间为0x6E000000~0x6E00FFFF。

Linux

图6:reg0寄存器映射表

2.3 Linux驱动设计
Linux设备驱动分为三类:字符设备、块设备和网络 设备。在这里需要编写的是一个字符设备[5]。另外,编写的设备将通过模块化的方式加载到操作系统中,而不是静态编译到内核中。驱动程序在交叉编译环境下,进 行模块化编译。得到以.ko为扩展名的驱动文件,使用 insmod和rmmod进行加载或者卸载,同时也可以通过lsmod查看是否已被加载。

建立一个ultrasonic_driver.c文件,使用交叉编译环 境进行编译,得到对应的可加载文件ultrasonic_driver.ko。在ultrasonic_driver.c中声明设备名称和模块的物理地址,该物理地址对应于XPS中建立的嵌入式系统的地址。具体如下:
#defineDEVICE_NAME"ULTRASONIC_MOUDLE"#defineULTRASONIC_MOUDLE_PHY_ADDR0x6E000000

该设备驱动的主要函数有:设备初始化ultrason⁃ic_driver_module_init();三个方向上的距离测量函数,sys_ultrasonic_front_get(),sys_ultrasonic_right_get()和sys_ultrasonic_left_get();设备注销ultrasonic_driv⁃ er_module_exit()。

(1)设备初始化函数,完成注册信息,当进行ins⁃mod操作时,操作系统会自动调用初始化函数,完成各 项信息的注册。而设备注销操作,与它相反,不做赘述。该初始化函数中,需要完成如下工作[4]:内核注册设备驱动;创建ultrasonic_driver设备类;为ultrasonic_driver设备类创建一个ultrasonic_driver_device设备;为设备创建以下几个文件:dev_attr_ultrasonic_trigger,dev_attr_ultra⁃sonic_front,dev_attr_ultrasonic_right,dev_attr_ultrason⁃ic_left,分别对应三个方向上的距离数值;将模块的物理基地址映射到虚拟地址上;同时将其他几个寄存器地址计算得到虚拟地址;打印调试信息,表明完成初始化工作。

(2)距离测量函数,以前向(front)测距为例,另外两个方向(right,left)上类似。Linux中,sysfs是一种基于ram的文件系统,它提供了一种用于向用户空间展现内核空间里的对象、属性和链接。sysfs与kobject层次紧密相连,它将kobject层次关系表现出来,使得用户空间 可以看见这些层次关系。可以通过CAT和ECHO接口命令来读/写sysfs。使用函数宏DEVICE_ATTR创建接口如下:
staticDEVICE_ATTR(ultrasonic_front,S_IRUSR|S_IWUSR,NULL,sys_ultrasonic_front_get);

DEVICE_ATTR宏声明有4个参数,分别是名称、权 限位、读函数、写函数。其中读函数和写函数是读/写功能函数的函数名。这样对ultrasonic_front创建一个写函 数sys_ultrasonic_front_get,其流程图如图7所示。

Linux

 

图7:sys_ultrasonic_front_get流程图

进入函数,首先会打印一条调试信息;然后向reg0(ultrasonic_trigger_addr)上写入使能,使开始发射超声波;循环检测reg0的bit1,查看数据是否有效;如果数据有效,则读取出reg1(ultrasonic_front_addr)上的数据值,并打印出来。完成一次读取操作。 完成以上设备驱动设计后,使用配置好的交叉编译环境,将该驱动代码编译为ultrasonic_driver.ko文件。将该文件放入启动的SD卡中。

3系统测试

对XPS构建的系统,建立U⁃Boot引导,编译配置内 核源码,编译设备树,并制作根文件系统,制作ramdisk镜像文件,得到所有的文件zImage,devicetreee.dtb,ram⁃disk8M.img.gz,BOOT.BIN。放入Zedboard板的SD卡中,同时也将ultrasonic_driver.ko文件放入SD卡,上电启动,直至完成。

在连接到Zedboard串口的超级终端下,挂载SD,执行如下步骤:
mount/dev/mmcblk0p1/mnt //挂载SD卡
cd/mnt//进入SD卡目录
insmod./ultrasonic_driver.ko//加载ultrasonic_driver.ko模块
dmesg//查看加载打印信息lsmod//查看加载的模块
cd/sys/class/ultrasonic_driver/ultrasonic_driver
//进入创建的设备目录,sysfs下
catultrasonic_front//读取一次前向超声波测量距离
catultrasonic_right//读取一次右边超声波测量距离
catultrasonic_left//读取一次左边超声波测量距离

系统测试后可以在终端里看到打印的加载信息“ul⁃trasonicdriverinitialsuccessfully!”和读取到的测量距离数值。调整超声波探头前方障碍物距离,还可以得到不同的距离值,最终,实现的距离测量能够达到2cm~4.5m 的范围,精度可达0.2cm。

4结语

本文基于FPGA业界最先进的芯片Zynq以及开发平台Zedboard,融合软硬件设计,从底层的各功能电路设计,VerilogHDL代码编写,VerilogIP核设计,到Linux设备驱动设计,完成了整个设计流程,在智能小车平台上实现了在Linux系统中利用超声波测距的功能,达到2cm~ 4.5m的测距范围,精度达0.2cm,为上层应用提供了支撑服务。该系统设计对基于Zynq⁃7000FPGA上的开发的多个方面(例如,对ARM+FPGA应用设计的理解、软硬件结合的设计方法;Xilinx下AXI4⁃lite总线的IP核设计;Linux字符设备驱动设计)有指导性意义。

参 考 文 献
[1]XilinxInc.Zynq⁃7000allprogrammableSoCtechnicalreference manual,v1.6.1[DB/OL].[2013⁃04⁃17].http://www.xilinx.com/sup⁃ port/documentation/user_guides/ug585⁃Zynq⁃7000⁃TRM.pdf.
[2]陆佳华,江舟,马岷.嵌入式系统软硬件协同设计实战指南:基于XilinxZynq[M].北京:机械工业出版社,2013.
[3]李洪涛,顾陈,朱晓华.FPGA技术开发(高级篇)[M].北京:国防工业出版社,2013.
[4]章立生,韩承德.SoC芯片设计方法及标准化[J].计算机研究与 发展,2002,39(1):1⁃8.
[5]KROAH⁃HARTMANCR.Linux设备驱动程序[M].魏永明,耿 岳,钟书毅,译.3版.北京:中国电力出版社,2005.
[6]深圳市捷深科技有限公司.HC⁃SR04超声波测距模块说明书 [DB/OL].[2014⁃04⁃10].

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分