楊曉安+羅杰+包文博
摘 要: 為了對(duì)障礙物距離精確測(cè)量,基于最新Zedboard FPGA(現(xiàn)場可編程邏輯陣列)開發(fā)板,采用軟硬件協(xié)同的設(shè)計(jì)方法,設(shè)計(jì)了障礙物距離測(cè)量系統(tǒng)的軟硬件。系統(tǒng)為智能小車平臺(tái)提供了完整的距離測(cè)量服務(wù),測(cè)距范圍能夠達(dá)到2 cm~4.5 m,精度可達(dá)0.2 cm。該設(shè)計(jì)包含從底層硬件電路設(shè)計(jì)、可編程邏輯IP(Intellectual Property)核設(shè)計(jì)、到Linux設(shè)備驅(qū)動(dòng)的設(shè)計(jì)全部流程,對(duì)于在Zynq?7000 FPGA上軟硬件從事開發(fā)的人員有一定的參考價(jià)值。
關(guān)鍵詞: Zynq?7000; Linux設(shè)備驅(qū)動(dòng); IP核; 軟硬件協(xié)同設(shè)計(jì)
中圖分類號(hào): TN710?34; TP311 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2014)15?0123?04
Design and implementation of an object distance measurement system
based on Xilinx Zynq
YANG Xiao?an1, LUO Jie2, BAO Wen?bo2
(1. Department of Information Engineering, Zhuhai Radio &TV University, Zhuhai 519000, China;
2. Department of Electronics and Information Engineering, Huazhong University of Science and Technology, Wuhan 430074, China)
Abstract: Based on development board known as the latest Zedboard FPGA (field programmable logic array), an obstacle distance measurement system was designed with the collaborative design method of hardware and software to provide a precise measurement of obstacle distance. A complete distance measurement service is provided by the distance measurement system for intelligent cars. The range of system′s rangefinding is 2~450 cm, and its precision can reach 0.2 cm. The whole design flow consists of underlying hardware circuit design, programmable logic IP (intellectual property) core design and Linux device driver design. It is useful to the hardware and software developers working with the Zynq?7000 FPGA.
Keywords: Zynq?7000; linux device driver; Intellectual property; hardware/software co?design
0 引 言
隨著集成電路的制造和應(yīng)用技術(shù)的快速發(fā)展,嵌入式系統(tǒng)的性能也不斷提升,已經(jīng)被廣泛應(yīng)用于工業(yè)控制、航空航天、軍事以及消費(fèi)電子等領(lǐng)域。在硅工藝的發(fā)展以及市場推動(dòng)下,Xilinx公司推出了基于7系列FPGA的新一代全可編程(All Programmable) Zynq?7000系列產(chǎn)品。該系列產(chǎn)品,集成了嵌入式領(lǐng)域集大成者——雙核ARM Cortex A9處理器和7系列28 nm工藝FPGA芯片。Zedboard正是這樣一款基于Zynq?7000產(chǎn)品的實(shí)驗(yàn)開發(fā)板卡,提供了軟件和硬件設(shè)計(jì)的更多可能。本文基于目前FPGA業(yè)界最先進(jìn)的Zedboard FPGA(現(xiàn)場可編程邏輯陣列)開發(fā)板,從底層硬件電路設(shè)計(jì)、可編程邏輯IP(Intellectual Property)核設(shè)計(jì)、到Linux設(shè)備驅(qū)動(dòng)的設(shè)計(jì),實(shí)現(xiàn)了障礙物距離測(cè)量的軟硬件系統(tǒng),并在智能小車平臺(tái)上,實(shí)現(xiàn)了距離測(cè)量服務(wù)。該方法對(duì)于在Zynq?7000 FPGA上軟硬件的開發(fā)具有指導(dǎo)作用。
1 系統(tǒng)設(shè)計(jì)
傳統(tǒng)上,F(xiàn)PGA中嵌入處理器內(nèi)核,都是以FPGA為主、處理器為輔,設(shè)計(jì)思路以可編程邏輯為主。然而新一代全可編程的Zynq?7000采取不同的思路,它是以處理器為主,F(xiàn)PGA為輔。FPGA變成了ARM處理器的一個(gè)協(xié)處理器[1]。圖1為Zynq?7000 SoC芯片的結(jié)構(gòu)圖。
簡單來說,Zynq由PS和PL兩部分組成:PS(Processing System,處理系統(tǒng))相當(dāng)于一片ARM芯片,而PL(Programmable Logic,可編程邏輯)相當(dāng)于一片F(xiàn)PGA芯片。
PS系統(tǒng)結(jié)構(gòu)為:雙核A9處理器,其是整個(gè)平臺(tái)的控制中心,處理速度高達(dá)1 GHz,可通過NEON擴(kuò)展及單精度浮點(diǎn)單元進(jìn)行增強(qiáng),擁有32 KB指令及數(shù)據(jù)L1緩存,統(tǒng)一的512 KB L2緩存和256 KB片上存儲(chǔ)器;存儲(chǔ)接口,用以管理片內(nèi)系統(tǒng)的存儲(chǔ)狀態(tài),包含DDR3,DDR2和LPDDR2動(dòng)態(tài)存儲(chǔ)控制器和兩個(gè)QSPI,NAND FLASH及NOR FLASH控制器;通用外設(shè),PS中的通用外設(shè)是ARM直接和外部設(shè)備通信的接口,含SPI,I2C,CAN,UART,GPIO,USB 2.0等;其他組成部分。
圖1 Zynq結(jié)構(gòu)圖
PL部分結(jié)構(gòu)為:低功耗可編程邏輯,包含28K~350K個(gè)邏輯單元,240K~2 180K可擴(kuò)展式Block RAM和80~900個(gè)DSP Slice;XADC,為PL內(nèi)置的12 b模/數(shù)轉(zhuǎn)換器;通用/定制外設(shè),PL中的外設(shè)是PL中的器件和外部通信的接口。在ARM接口不夠用時(shí),可以利用PL的外設(shè)接口。PS和PL之間的數(shù)據(jù)交互,則是通過AXI(Advanced eXtensible Interface)接口實(shí)現(xiàn)的。具體有:高性能AXI接口(High Performance AXI Slave Ports),共4個(gè);通用AXI接口,包括兩個(gè)主設(shè)備接口和兩個(gè)從設(shè)備接口,共4個(gè);加速一致性端口,是ARM多核架構(gòu)下定義的一種接口。
根據(jù)Zynq 結(jié)構(gòu)特點(diǎn),在應(yīng)用系統(tǒng)結(jié)構(gòu)設(shè)計(jì)時(shí)注意,使用由Zynq這樣一款功能強(qiáng)大的SoC芯片,與一般的ARM芯片不同,與常用的FPGA,更存在區(qū)別。它要求硬件和軟件之間進(jìn)行協(xié)同設(shè)計(jì),共同實(shí)現(xiàn)既定的性能指標(biāo)要求。在SoC設(shè)計(jì)中,IP(Intellectual Property,知識(shí)產(chǎn)權(quán))核重用技術(shù)是一個(gè)很重要的概念,它是軟硬件協(xié)同設(shè)計(jì)的關(guān)鍵,通過標(biāo)準(zhǔn)化IP核可以實(shí)現(xiàn)模塊復(fù)用,可以完成大規(guī)模的、復(fù)雜的SoC設(shè)計(jì)[3]。
本文以一個(gè)超聲波測(cè)距系統(tǒng)為例,介紹如何在Zynq SoC上,定制IP、設(shè)計(jì)Linux 設(shè)備驅(qū)動(dòng)等,并完整的闡述了從硬件到軟件的設(shè)計(jì)流程。設(shè)計(jì)的系統(tǒng)結(jié)構(gòu)如圖2所示。PS上,運(yùn)行Linux操作系統(tǒng),為Linaro Ubuntu發(fā)行版。根據(jù)文獻(xiàn)[2]的指導(dǎo)操作,使用Xilinx公司的開發(fā)軟件完成配置,使PS可以運(yùn)行操作系統(tǒng)。
PL部分按照系統(tǒng)控制的需求進(jìn)行定制。設(shè)計(jì)基于Xilinx AXI總線的超聲波處理外設(shè)IP核,與外部的超聲波發(fā)射和接收電路交互。在Linux操作系統(tǒng)下,這個(gè)IP核就成為了一個(gè)設(shè)備,這就需要編寫相應(yīng)的設(shè)備驅(qū)動(dòng)程序,實(shí)現(xiàn)超聲波測(cè)距功能的封裝。
圖2 系統(tǒng)結(jié)構(gòu)圖
2 主要模塊設(shè)計(jì)
2.1 超聲波測(cè)距模塊
該模塊基本工作原理是:通過超聲波發(fā)射探頭,發(fā)射頻率為40 kHz的超聲波信號(hào);當(dāng)超聲波信號(hào)遇到障礙物時(shí),會(huì)發(fā)生反射;當(dāng)超聲波接收探頭接收到40 kHz頻率附近的聲波信號(hào)時(shí),經(jīng)過信號(hào)調(diào)理電路;再通過系統(tǒng)計(jì)算接收與發(fā)射之間的時(shí)間差計(jì)算障礙物距離。
圖3 測(cè)距模塊
設(shè)計(jì)中共使用到了三個(gè)相同測(cè)距模塊,分別測(cè)量三個(gè)不同的方向上障礙物距離。測(cè)距模塊分為超聲波發(fā)射部分和接收部分,模塊的電路結(jié)構(gòu)如圖4所示。具體是采用HC?SR04超聲波測(cè)距模塊,進(jìn)行硬件設(shè)計(jì)[6]。該電路的對(duì)外接口為觸發(fā)(TRIG)控制端和回響(ECHO)信號(hào)接收端。通過I/O口TRIG觸發(fā)測(cè)距,提供了一個(gè)10 ms以上的高電平觸發(fā)信號(hào),該模塊將發(fā)出8 個(gè)40 kHz的方波用于探測(cè),并自動(dòng)檢測(cè)是否有回波信號(hào)。一旦檢測(cè)到有回波信號(hào)則通過I/O口ECHO輸出一個(gè)高電平回響信號(hào),且回響信號(hào)的高電平時(shí)間[tH](單位:ms)即高電平持續(xù)的時(shí)間與所測(cè)的距離[S]成正比。其對(duì)應(yīng)關(guān)系為:
[S=tHv2]
式中:[S]為測(cè)試距離;[tH]為高電平時(shí)間(單位:s);[v]為聲速340 m/s。
發(fā)射部分:利用串口轉(zhuǎn)換芯片的升壓功能,采用MAX232將輸入JN1和JN2的3.3 V TTL電平轉(zhuǎn)換,得到5 V電平。它激勵(lì)超聲波發(fā)射探頭的信號(hào)壓差為10 V,發(fā)出40 kHz的超聲波。如圖4所示。
圖4 發(fā)射電路
接收部分:對(duì)回波信號(hào)進(jìn)行濾波、放大處理。接收電路圖如圖5所示。其中NET9 為控制接收電路工作的使能端口,NET10為接收電路工作且接收到了回波信號(hào)時(shí)的響應(yīng)信號(hào)。
圖5 接收電路圖
2.2 IP核設(shè)計(jì)
使用Xilinx的設(shè)計(jì)工具XPS(Xilinx Platform Studio)建立IP的流程,新建一個(gè)Ultrasonic(超聲波) IP核模塊。該IP核的模塊結(jié)構(gòu)如圖2所示中的超聲波處理外設(shè)部分,其中Triggercounter,Clockgen和Echocounter使用Verilog HDL實(shí)現(xiàn)。根據(jù)超聲波測(cè)距模塊的測(cè)距時(shí)序要求,設(shè)計(jì)觸發(fā)和回響信號(hào)的邏輯,由Triggercounter和Echocounter實(shí)現(xiàn)。最終將測(cè)量到的數(shù)據(jù)放到AXI4定義的寄存器中,使處理器能從AXI總線上讀取數(shù)據(jù)。本IP核有4個(gè)寄存器(reg0~reg3),與AXI4總線相連,用戶可以通過這4個(gè)寄存器控制發(fā)射超聲波,獲取測(cè)量的距離。其中,reg0的功能是使能一次測(cè)距以及三個(gè)方向上測(cè)量完畢標(biāo)志,圖6為reg0寄存器映射表;reg1~reg3為計(jì)數(shù)后計(jì)算得到的三個(gè)方向上超聲波測(cè)量到的距離數(shù)值。將設(shè)計(jì)的IP核添加到XPS工程中去,分配得到的地址空間為0x6E000000~ 0x6E00FFFF。
圖6 reg0寄存器映射表
2.3 Linux驅(qū)動(dòng)設(shè)計(jì)
Linux設(shè)備驅(qū)動(dòng)分為三類:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。在這里需要編寫的是一個(gè)字符設(shè)備[5]。另外,編寫的設(shè)備將通過模塊化的方式加載到操作系統(tǒng)中,而不是靜態(tài)編譯到內(nèi)核中。驅(qū)動(dòng)程序在交叉編譯環(huán)境下,進(jìn)行模塊化編譯。得到以.ko為擴(kuò)展名的驅(qū)動(dòng)文件,使用insmod和rmmod進(jìn)行加載或者卸載,同時(shí)也可以通過lsmod查看是否已被加載。
建立一個(gè)ultrasonic_driver.c文件,使用交叉編譯環(huán)境進(jìn)行編譯,得到對(duì)應(yīng)的可加載文件ultrasonic_driver.ko。在ultrasonic_driver.c中聲明設(shè)備名稱和模塊的物理地址,該物理地址對(duì)應(yīng)于XPS中建立的嵌入式系統(tǒng)的地址。具體如下:
#define DEVICE_NAME "ULTRASONIC_MOUDLE"
#define ULTRASONIC_MOUDLE_PHY_ADDR 0x6E000000
該設(shè)備驅(qū)動(dòng)的主要函數(shù)有:設(shè)備初始化ultrasonic_driver_module_init();三個(gè)方向上的距離測(cè)量函數(shù),sys_ultrasonic_front_get(), sys_ultrasonic_right_get()和sys_ultrasonic_left_get();設(shè)備注銷ultrasonic_driver_module_exit()。
(1) 設(shè)備初始化函數(shù),完成注冊(cè)信息,當(dāng)進(jìn)行insmod操作時(shí),操作系統(tǒng)會(huì)自動(dòng)調(diào)用初始化函數(shù),完成各項(xiàng)信息的注冊(cè)。而設(shè)備注銷操作,與它相反,不做贅述。該初始化函數(shù)中,需要完成如下工作[4]:內(nèi)核注冊(cè)設(shè)備驅(qū)動(dòng);創(chuàng)建ultrasonic_driver設(shè)備類;為ultrasonic_driver設(shè)備類創(chuàng)建一個(gè)ultrasonic_driver_device設(shè)備;為設(shè)備創(chuàng)建以下幾個(gè)文件:dev_attr_ultrasonic_trigger,dev_attr_ultrasonic_front,dev_attr_ultrasonic_right,dev_attr_ultrasonic_left,分別對(duì)應(yīng)三個(gè)方向上的距離數(shù)值;將模塊的物理基地址映射到虛擬地址上;同時(shí)將其他幾個(gè)寄存器地址計(jì)算得到虛擬地址;打印調(diào)試信息,表明完成初始化工作。
(2) 距離測(cè)量函數(shù),以前向(front)測(cè)距為例,另外兩個(gè)方向(right,left)上類似。Linux中,sysfs是一種基于ram的文件系統(tǒng),它提供了一種用于向用戶空間展現(xiàn)內(nèi)核空間里的對(duì)象、屬性和鏈接。sysfs與kobject層次緊密相連,它將kobject層次關(guān)系表現(xiàn)出來,使得用戶空間可以看見這些層次關(guān)系??梢酝ㄟ^CAT和ECHO接口命令來讀/寫sysfs。使用函數(shù)宏DEVICE_ATTR創(chuàng)建接口如下:
static DEVICE_ATTR(ultrasonic_front, S_IRUSR|S_IWUSR, NULL, sys_ultrasonic_front_get);
DEVICE_ATTR 宏聲明有4個(gè)參數(shù),分別是名稱、權(quán)限位、讀函數(shù)、寫函數(shù)。其中讀函數(shù)和寫函數(shù)是讀/寫功能函數(shù)的函數(shù)名。這樣對(duì)ultrasonic_front創(chuàng)建一個(gè)寫函數(shù)sys_ultrasonic _front _get,其流程圖如圖7所示。
圖7 sys_ultrasonic_front_get流程圖
進(jìn)入函數(shù),首先會(huì)打印一條調(diào)試信息;然后向reg0(ultrasonic_trigger_addr)上寫入使能,使開始發(fā)射超聲波;循環(huán)檢測(cè)reg0的bit1,查看數(shù)據(jù)是否有效;如果數(shù)據(jù)有效,則讀取出reg1(ultrasonic_front_addr)上的數(shù)據(jù)值,并打印出來。完成一次讀取操作。
完成以上設(shè)備驅(qū)動(dòng)設(shè)計(jì)后,使用配置好的交叉編譯環(huán)境,將該驅(qū)動(dòng)代碼編譯為ultrasonic_driver.ko文件。將該文件放入啟動(dòng)的SD卡中。
3 系統(tǒng)測(cè)試
對(duì)XPS構(gòu)建的系統(tǒng),建立U?Boot引導(dǎo),編譯配置內(nèi)核源碼,編譯設(shè)備樹,并制作根文件系統(tǒng),制作ramdisk鏡像文件,得到所有的文件zImage,devicetreee.dtb,ramdisk8M.img.gz,BOOT.BIN。放入Zedboard板的SD卡中,同時(shí)也將ultrasonic_ driver.ko文件放入SD卡,上電啟動(dòng),直至完成。
在連接到Zedboard串口的超級(jí)終端下,掛載SD,執(zhí)行如下步驟:
mount /dev/mmcblk0p1 /mnt //掛載SD卡
cd /mnt //進(jìn)入SD卡目錄
insmod./ ultrasonic_driver.ko //加載ultrasonic_ driver.ko模塊
dmesg //查看加載打印信息
lsmod //查看加載的模塊
cd /sys/class/ultrasonic_driver/ultrasonic_driver
//進(jìn)入創(chuàng)建的設(shè)備目錄,sysfs下
cat ultrasonic_front //讀取一次前向超聲波測(cè)量距離
cat ultrasonic_right //讀取一次右邊超聲波測(cè)量距離
cat ultrasonic_left //讀取一次左邊超聲波測(cè)量距離
系統(tǒng)測(cè)試后可以在終端里看到打印的加載信息“ultrasonic driver initial successfully! ”和讀取到的測(cè)量距離數(shù)值。調(diào)整超聲波探頭前方障礙物距離,還可以得到不同的距離值,最終,實(shí)現(xiàn)的距離測(cè)量能夠達(dá)到2 cm~4.5 m的范圍,精度可達(dá)0.2 cm。
4 結(jié) 語
本文基于FPGA業(yè)界最先進(jìn)的芯片Zynq以及開發(fā)平臺(tái)Zedboard,融合軟硬件設(shè)計(jì),從底層的各功能電路設(shè)計(jì),Verilog HDL代碼編寫,Verilog IP核設(shè)計(jì),到Linux設(shè)備驅(qū)動(dòng)設(shè)計(jì),完成了整個(gè)設(shè)計(jì)流程,在智能小車平臺(tái)上實(shí)現(xiàn)了在Linux系統(tǒng)中利用超聲波測(cè)距的功能,達(dá)到2 cm~4.5 m的測(cè)距范圍,精度達(dá)0.2 cm,為上層應(yīng)用提供了支撐服務(wù)。該系統(tǒng)設(shè)計(jì)對(duì)基于Zynq?7000 FPGA上的開發(fā)的多個(gè)方面(例如,對(duì)ARM+FPGA應(yīng)用設(shè)計(jì)的理解、軟硬件結(jié)合的設(shè)計(jì)方法;Xilinx下AXI4?lite總線的IP核設(shè)計(jì);Linux字符設(shè)備驅(qū)動(dòng)設(shè)計(jì))有指導(dǎo)性意義。
參考文獻(xiàn)
[1] Xilinx Inc. Zynq?7000 all programmable SoC technical reference manual, v1.6.1 [DB/OL]. [2013?04?17]. http://www.xilinx.com/support/documentation/user_guides/ug585?Zynq?7000?TRM.pdf.
[2] 陸佳華,江舟,馬岷.嵌入式系統(tǒng)軟硬件協(xié)同設(shè)計(jì)實(shí)戰(zhàn)指南:基于Xilinx Zynq[M].北京:機(jī)械工業(yè)出版社,2013 .
[3] 李洪濤,顧陳,朱曉華.FPGA技術(shù)開發(fā)(高級(jí)篇)[M].北京:國防工業(yè)出版社,2013.
[4] 章立生,韓承德.SoC芯片設(shè)計(jì)方法及標(biāo)準(zhǔn)化[J].計(jì)算機(jī)研究與發(fā)展,2002,39(1):1?8.
[5] KROAH?HARTMAN C R. Linux設(shè)備驅(qū)動(dòng)程序[M].魏永明,耿岳,鐘書毅,譯.3版.北京:中國電力出版社,2005.
[6] 深圳市捷深科技有限公司.HC?SR04超聲波測(cè)距模塊說明書[DB/OL]. [2014?04?10].[http://wenku.baidu.com/view/ce9e5e487?][67f5acfa1c7cd8a.][html.]
建立一個(gè)ultrasonic_driver.c文件,使用交叉編譯環(huán)境進(jìn)行編譯,得到對(duì)應(yīng)的可加載文件ultrasonic_driver.ko。在ultrasonic_driver.c中聲明設(shè)備名稱和模塊的物理地址,該物理地址對(duì)應(yīng)于XPS中建立的嵌入式系統(tǒng)的地址。具體如下:
#define DEVICE_NAME "ULTRASONIC_MOUDLE"
#define ULTRASONIC_MOUDLE_PHY_ADDR 0x6E000000
該設(shè)備驅(qū)動(dòng)的主要函數(shù)有:設(shè)備初始化ultrasonic_driver_module_init();三個(gè)方向上的距離測(cè)量函數(shù),sys_ultrasonic_front_get(), sys_ultrasonic_right_get()和sys_ultrasonic_left_get();設(shè)備注銷ultrasonic_driver_module_exit()。
(1) 設(shè)備初始化函數(shù),完成注冊(cè)信息,當(dāng)進(jìn)行insmod操作時(shí),操作系統(tǒng)會(huì)自動(dòng)調(diào)用初始化函數(shù),完成各項(xiàng)信息的注冊(cè)。而設(shè)備注銷操作,與它相反,不做贅述。該初始化函數(shù)中,需要完成如下工作[4]:內(nèi)核注冊(cè)設(shè)備驅(qū)動(dòng);創(chuàng)建ultrasonic_driver設(shè)備類;為ultrasonic_driver設(shè)備類創(chuàng)建一個(gè)ultrasonic_driver_device設(shè)備;為設(shè)備創(chuàng)建以下幾個(gè)文件:dev_attr_ultrasonic_trigger,dev_attr_ultrasonic_front,dev_attr_ultrasonic_right,dev_attr_ultrasonic_left,分別對(duì)應(yīng)三個(gè)方向上的距離數(shù)值;將模塊的物理基地址映射到虛擬地址上;同時(shí)將其他幾個(gè)寄存器地址計(jì)算得到虛擬地址;打印調(diào)試信息,表明完成初始化工作。
(2) 距離測(cè)量函數(shù),以前向(front)測(cè)距為例,另外兩個(gè)方向(right,left)上類似。Linux中,sysfs是一種基于ram的文件系統(tǒng),它提供了一種用于向用戶空間展現(xiàn)內(nèi)核空間里的對(duì)象、屬性和鏈接。sysfs與kobject層次緊密相連,它將kobject層次關(guān)系表現(xiàn)出來,使得用戶空間可以看見這些層次關(guān)系。可以通過CAT和ECHO接口命令來讀/寫sysfs。使用函數(shù)宏DEVICE_ATTR創(chuàng)建接口如下:
static DEVICE_ATTR(ultrasonic_front, S_IRUSR|S_IWUSR, NULL, sys_ultrasonic_front_get);
DEVICE_ATTR 宏聲明有4個(gè)參數(shù),分別是名稱、權(quán)限位、讀函數(shù)、寫函數(shù)。其中讀函數(shù)和寫函數(shù)是讀/寫功能函數(shù)的函數(shù)名。這樣對(duì)ultrasonic_front創(chuàng)建一個(gè)寫函數(shù)sys_ultrasonic _front _get,其流程圖如圖7所示。
圖7 sys_ultrasonic_front_get流程圖
進(jìn)入函數(shù),首先會(huì)打印一條調(diào)試信息;然后向reg0(ultrasonic_trigger_addr)上寫入使能,使開始發(fā)射超聲波;循環(huán)檢測(cè)reg0的bit1,查看數(shù)據(jù)是否有效;如果數(shù)據(jù)有效,則讀取出reg1(ultrasonic_front_addr)上的數(shù)據(jù)值,并打印出來。完成一次讀取操作。
完成以上設(shè)備驅(qū)動(dòng)設(shè)計(jì)后,使用配置好的交叉編譯環(huán)境,將該驅(qū)動(dòng)代碼編譯為ultrasonic_driver.ko文件。將該文件放入啟動(dòng)的SD卡中。
3 系統(tǒng)測(cè)試
對(duì)XPS構(gòu)建的系統(tǒng),建立U?Boot引導(dǎo),編譯配置內(nèi)核源碼,編譯設(shè)備樹,并制作根文件系統(tǒng),制作ramdisk鏡像文件,得到所有的文件zImage,devicetreee.dtb,ramdisk8M.img.gz,BOOT.BIN。放入Zedboard板的SD卡中,同時(shí)也將ultrasonic_ driver.ko文件放入SD卡,上電啟動(dòng),直至完成。
在連接到Zedboard串口的超級(jí)終端下,掛載SD,執(zhí)行如下步驟:
mount /dev/mmcblk0p1 /mnt //掛載SD卡
cd /mnt //進(jìn)入SD卡目錄
insmod./ ultrasonic_driver.ko //加載ultrasonic_ driver.ko模塊
dmesg //查看加載打印信息
lsmod //查看加載的模塊
cd /sys/class/ultrasonic_driver/ultrasonic_driver
//進(jìn)入創(chuàng)建的設(shè)備目錄,sysfs下
cat ultrasonic_front //讀取一次前向超聲波測(cè)量距離
cat ultrasonic_right //讀取一次右邊超聲波測(cè)量距離
cat ultrasonic_left //讀取一次左邊超聲波測(cè)量距離
系統(tǒng)測(cè)試后可以在終端里看到打印的加載信息“ultrasonic driver initial successfully! ”和讀取到的測(cè)量距離數(shù)值。調(diào)整超聲波探頭前方障礙物距離,還可以得到不同的距離值,最終,實(shí)現(xiàn)的距離測(cè)量能夠達(dá)到2 cm~4.5 m的范圍,精度可達(dá)0.2 cm。
4 結(jié) 語
本文基于FPGA業(yè)界最先進(jìn)的芯片Zynq以及開發(fā)平臺(tái)Zedboard,融合軟硬件設(shè)計(jì),從底層的各功能電路設(shè)計(jì),Verilog HDL代碼編寫,Verilog IP核設(shè)計(jì),到Linux設(shè)備驅(qū)動(dòng)設(shè)計(jì),完成了整個(gè)設(shè)計(jì)流程,在智能小車平臺(tái)上實(shí)現(xiàn)了在Linux系統(tǒng)中利用超聲波測(cè)距的功能,達(dá)到2 cm~4.5 m的測(cè)距范圍,精度達(dá)0.2 cm,為上層應(yīng)用提供了支撐服務(wù)。該系統(tǒng)設(shè)計(jì)對(duì)基于Zynq?7000 FPGA上的開發(fā)的多個(gè)方面(例如,對(duì)ARM+FPGA應(yīng)用設(shè)計(jì)的理解、軟硬件結(jié)合的設(shè)計(jì)方法;Xilinx下AXI4?lite總線的IP核設(shè)計(jì);Linux字符設(shè)備驅(qū)動(dòng)設(shè)計(jì))有指導(dǎo)性意義。
參考文獻(xiàn)
[1] Xilinx Inc. Zynq?7000 all programmable SoC technical reference manual, v1.6.1 [DB/OL]. [2013?04?17]. http://www.xilinx.com/support/documentation/user_guides/ug585?Zynq?7000?TRM.pdf.
[2] 陸佳華,江舟,馬岷.嵌入式系統(tǒng)軟硬件協(xié)同設(shè)計(jì)實(shí)戰(zhàn)指南:基于Xilinx Zynq[M].北京:機(jī)械工業(yè)出版社,2013 .
[3] 李洪濤,顧陳,朱曉華.FPGA技術(shù)開發(fā)(高級(jí)篇)[M].北京:國防工業(yè)出版社,2013.
[4] 章立生,韓承德.SoC芯片設(shè)計(jì)方法及標(biāo)準(zhǔn)化[J].計(jì)算機(jī)研究與發(fā)展,2002,39(1):1?8.
[5] KROAH?HARTMAN C R. Linux設(shè)備驅(qū)動(dòng)程序[M].魏永明,耿岳,鐘書毅,譯.3版.北京:中國電力出版社,2005.
[6] 深圳市捷深科技有限公司.HC?SR04超聲波測(cè)距模塊說明書[DB/OL]. [2014?04?10].[http://wenku.baidu.com/view/ce9e5e487?][67f5acfa1c7cd8a.][html.]
建立一個(gè)ultrasonic_driver.c文件,使用交叉編譯環(huán)境進(jìn)行編譯,得到對(duì)應(yīng)的可加載文件ultrasonic_driver.ko。在ultrasonic_driver.c中聲明設(shè)備名稱和模塊的物理地址,該物理地址對(duì)應(yīng)于XPS中建立的嵌入式系統(tǒng)的地址。具體如下:
#define DEVICE_NAME "ULTRASONIC_MOUDLE"
#define ULTRASONIC_MOUDLE_PHY_ADDR 0x6E000000
該設(shè)備驅(qū)動(dòng)的主要函數(shù)有:設(shè)備初始化ultrasonic_driver_module_init();三個(gè)方向上的距離測(cè)量函數(shù),sys_ultrasonic_front_get(), sys_ultrasonic_right_get()和sys_ultrasonic_left_get();設(shè)備注銷ultrasonic_driver_module_exit()。
(1) 設(shè)備初始化函數(shù),完成注冊(cè)信息,當(dāng)進(jìn)行insmod操作時(shí),操作系統(tǒng)會(huì)自動(dòng)調(diào)用初始化函數(shù),完成各項(xiàng)信息的注冊(cè)。而設(shè)備注銷操作,與它相反,不做贅述。該初始化函數(shù)中,需要完成如下工作[4]:內(nèi)核注冊(cè)設(shè)備驅(qū)動(dòng);創(chuàng)建ultrasonic_driver設(shè)備類;為ultrasonic_driver設(shè)備類創(chuàng)建一個(gè)ultrasonic_driver_device設(shè)備;為設(shè)備創(chuàng)建以下幾個(gè)文件:dev_attr_ultrasonic_trigger,dev_attr_ultrasonic_front,dev_attr_ultrasonic_right,dev_attr_ultrasonic_left,分別對(duì)應(yīng)三個(gè)方向上的距離數(shù)值;將模塊的物理基地址映射到虛擬地址上;同時(shí)將其他幾個(gè)寄存器地址計(jì)算得到虛擬地址;打印調(diào)試信息,表明完成初始化工作。
(2) 距離測(cè)量函數(shù),以前向(front)測(cè)距為例,另外兩個(gè)方向(right,left)上類似。Linux中,sysfs是一種基于ram的文件系統(tǒng),它提供了一種用于向用戶空間展現(xiàn)內(nèi)核空間里的對(duì)象、屬性和鏈接。sysfs與kobject層次緊密相連,它將kobject層次關(guān)系表現(xiàn)出來,使得用戶空間可以看見這些層次關(guān)系??梢酝ㄟ^CAT和ECHO接口命令來讀/寫sysfs。使用函數(shù)宏DEVICE_ATTR創(chuàng)建接口如下:
static DEVICE_ATTR(ultrasonic_front, S_IRUSR|S_IWUSR, NULL, sys_ultrasonic_front_get);
DEVICE_ATTR 宏聲明有4個(gè)參數(shù),分別是名稱、權(quán)限位、讀函數(shù)、寫函數(shù)。其中讀函數(shù)和寫函數(shù)是讀/寫功能函數(shù)的函數(shù)名。這樣對(duì)ultrasonic_front創(chuàng)建一個(gè)寫函數(shù)sys_ultrasonic _front _get,其流程圖如圖7所示。
圖7 sys_ultrasonic_front_get流程圖
進(jìn)入函數(shù),首先會(huì)打印一條調(diào)試信息;然后向reg0(ultrasonic_trigger_addr)上寫入使能,使開始發(fā)射超聲波;循環(huán)檢測(cè)reg0的bit1,查看數(shù)據(jù)是否有效;如果數(shù)據(jù)有效,則讀取出reg1(ultrasonic_front_addr)上的數(shù)據(jù)值,并打印出來。完成一次讀取操作。
完成以上設(shè)備驅(qū)動(dòng)設(shè)計(jì)后,使用配置好的交叉編譯環(huán)境,將該驅(qū)動(dòng)代碼編譯為ultrasonic_driver.ko文件。將該文件放入啟動(dòng)的SD卡中。
3 系統(tǒng)測(cè)試
對(duì)XPS構(gòu)建的系統(tǒng),建立U?Boot引導(dǎo),編譯配置內(nèi)核源碼,編譯設(shè)備樹,并制作根文件系統(tǒng),制作ramdisk鏡像文件,得到所有的文件zImage,devicetreee.dtb,ramdisk8M.img.gz,BOOT.BIN。放入Zedboard板的SD卡中,同時(shí)也將ultrasonic_ driver.ko文件放入SD卡,上電啟動(dòng),直至完成。
在連接到Zedboard串口的超級(jí)終端下,掛載SD,執(zhí)行如下步驟:
mount /dev/mmcblk0p1 /mnt //掛載SD卡
cd /mnt //進(jìn)入SD卡目錄
insmod./ ultrasonic_driver.ko //加載ultrasonic_ driver.ko模塊
dmesg //查看加載打印信息
lsmod //查看加載的模塊
cd /sys/class/ultrasonic_driver/ultrasonic_driver
//進(jìn)入創(chuàng)建的設(shè)備目錄,sysfs下
cat ultrasonic_front //讀取一次前向超聲波測(cè)量距離
cat ultrasonic_right //讀取一次右邊超聲波測(cè)量距離
cat ultrasonic_left //讀取一次左邊超聲波測(cè)量距離
系統(tǒng)測(cè)試后可以在終端里看到打印的加載信息“ultrasonic driver initial successfully! ”和讀取到的測(cè)量距離數(shù)值。調(diào)整超聲波探頭前方障礙物距離,還可以得到不同的距離值,最終,實(shí)現(xiàn)的距離測(cè)量能夠達(dá)到2 cm~4.5 m的范圍,精度可達(dá)0.2 cm。
4 結(jié) 語
本文基于FPGA業(yè)界最先進(jìn)的芯片Zynq以及開發(fā)平臺(tái)Zedboard,融合軟硬件設(shè)計(jì),從底層的各功能電路設(shè)計(jì),Verilog HDL代碼編寫,Verilog IP核設(shè)計(jì),到Linux設(shè)備驅(qū)動(dòng)設(shè)計(jì),完成了整個(gè)設(shè)計(jì)流程,在智能小車平臺(tái)上實(shí)現(xiàn)了在Linux系統(tǒng)中利用超聲波測(cè)距的功能,達(dá)到2 cm~4.5 m的測(cè)距范圍,精度達(dá)0.2 cm,為上層應(yīng)用提供了支撐服務(wù)。該系統(tǒng)設(shè)計(jì)對(duì)基于Zynq?7000 FPGA上的開發(fā)的多個(gè)方面(例如,對(duì)ARM+FPGA應(yīng)用設(shè)計(jì)的理解、軟硬件結(jié)合的設(shè)計(jì)方法;Xilinx下AXI4?lite總線的IP核設(shè)計(jì);Linux字符設(shè)備驅(qū)動(dòng)設(shè)計(jì))有指導(dǎo)性意義。
參考文獻(xiàn)
[1] Xilinx Inc. Zynq?7000 all programmable SoC technical reference manual, v1.6.1 [DB/OL]. [2013?04?17]. http://www.xilinx.com/support/documentation/user_guides/ug585?Zynq?7000?TRM.pdf.
[2] 陸佳華,江舟,馬岷.嵌入式系統(tǒng)軟硬件協(xié)同設(shè)計(jì)實(shí)戰(zhàn)指南:基于Xilinx Zynq[M].北京:機(jī)械工業(yè)出版社,2013 .
[3] 李洪濤,顧陳,朱曉華.FPGA技術(shù)開發(fā)(高級(jí)篇)[M].北京:國防工業(yè)出版社,2013.
[4] 章立生,韓承德.SoC芯片設(shè)計(jì)方法及標(biāo)準(zhǔn)化[J].計(jì)算機(jī)研究與發(fā)展,2002,39(1):1?8.
[5] KROAH?HARTMAN C R. Linux設(shè)備驅(qū)動(dòng)程序[M].魏永明,耿岳,鐘書毅,譯.3版.北京:中國電力出版社,2005.
[6] 深圳市捷深科技有限公司.HC?SR04超聲波測(cè)距模塊說明書[DB/OL]. [2014?04?10].[http://wenku.baidu.com/view/ce9e5e487?][67f5acfa1c7cd8a.][html.]