摘 要:為了對(duì)障礙物距離精確測(cè)量,基于最新Zedboard FPGA(現(xiàn)場(chǎng)可編程邏輯陣列)開(kāi)發(fā)板,采用軟硬件協(xié)同的設(shè)計(jì) 方法,設(shè)計(jì)了障礙物距離測(cè)量系統(tǒng)的軟硬件。系統(tǒng)為智能小車平臺(tái)提供了完整的距離測(cè)量服務(wù),測(cè)距范圍能夠達(dá)到2cm~4.5m,精度可達(dá)0.2cm。該設(shè)計(jì)包含從底層硬件電路設(shè)計(jì)、可編程邏輯IP(IntellectualProperty)核設(shè)計(jì)、到Linux設(shè)備驅(qū)動(dòng)的設(shè)計(jì)全部流程,對(duì)于在Zynq?7000FPGA上軟硬件從事開(kāi)發(fā)的人員有一定的參考價(jià)值。
隨著集成電路的制造和應(yīng)用技術(shù)的快速發(fā)展,嵌入式系統(tǒng)的性能也不斷提升,已經(jīng)被廣泛應(yīng)用于工業(yè)控制、航空航天、軍事以及消費(fèi)電子等領(lǐng)域。在硅工藝的發(fā)展以及市場(chǎng)推動(dòng)下,Xilinx公司推出了基于7系列FPGA的新一代全可編程(AllProgrammable)Zynq?7000系列產(chǎn)品。該系列產(chǎn)品,集成了嵌入式領(lǐng)域集大成者——雙核ARM CortexA9處理器和7系列28nm工藝FPGA芯片。Zedboard正是這樣一款基于Zynq?7000產(chǎn)品的實(shí)驗(yàn) 開(kāi)發(fā)板卡,提供了軟件和硬件設(shè)計(jì)的更多可能。本文基于目前FPGA業(yè)界最先進(jìn)的Zedboard FPGA(現(xiàn)場(chǎng)可編程邏輯陣列)開(kāi)發(fā)板,從底層硬件電路設(shè)計(jì)、可編程邏輯IP(IntellectualProperty)核設(shè)計(jì)、到Linux設(shè)備驅(qū)動(dòng)的設(shè)計(jì),實(shí)現(xiàn)了障礙物距離測(cè)量的軟硬件系統(tǒng),并在智能小車平臺(tái)上,實(shí)現(xiàn)了距離測(cè)量服務(wù)。該方法對(duì)于在Zynq?7000FPGA上軟硬件的開(kāi)發(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?7000SoC芯片的結(jié)構(gòu)圖。 簡(jiǎn)單來(lái)說(shuō),Zynq由PS和PL兩部分組成:PS(Pro?cessingSystem,處理系統(tǒng))相當(dāng)于一片ARM芯片,而PL (ProgrammableLogic,可編程邏輯)相當(dāng)于一片F(xiàn)PGA芯片。
圖1:Zynq結(jié)構(gòu)圖
PS系統(tǒng)結(jié)構(gòu)為:雙核A9處理器,其是整個(gè)平臺(tái)的控制中心,處理速度高達(dá)1GHz,可通過(guò)NEON擴(kuò)展及單精度浮點(diǎn)單元進(jìn)行增強(qiáng),擁有32KB指令及數(shù)據(jù)L1 緩存,統(tǒng)一的512KBL2緩存和256KB片上存儲(chǔ)器;存儲(chǔ)接口,用以管理片內(nèi)系統(tǒng)的存儲(chǔ)狀態(tài),包含DDR3,DDR2和LPDDR2動(dòng)態(tài)存儲(chǔ)控制器和兩個(gè)QSPI,NANDFLASH及NORFLASH控制器;通用外設(shè),PS中的通用外設(shè)是ARM直接和外部設(shè)備通信的接口,含SPI,I2C, CAN,UART,GPIO,USB2.0等;其他組成部分。
PL部分結(jié)構(gòu)為:低功耗可編程邏輯,包含28K~ 350K個(gè)邏輯單元,240K~2180K可擴(kuò)展式BlockRAM和80~900個(gè)DSPSlice;XADC,為PL內(nèi)置的12b模/數(shù)轉(zhuǎn)換器;通用/定制外設(shè),PL中的外設(shè)是PL中的器件和 外部通信的接口。在ARM接口不夠用時(shí),可以利用PL的外設(shè)接口。PS和PL之間的數(shù)據(jù)交互,則是通過(guò)AXI(AdvancedeXtensibleInterface)接口實(shí)現(xiàn)的。具體有:高性能AXI接口(HighPerformanceAXISlavePorts),共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(IntellectualProperty,知識(shí)產(chǎn)權(quán))核重用技術(shù)是一個(gè)很重要的概念,它是軟硬件協(xié)同設(shè)計(jì)的關(guān)鍵,通過(guò)標(biāo)準(zhǔn)化IP核可以實(shí)現(xiàn)模塊復(fù)用,可以完成大規(guī)模的、復(fù)雜的SoC設(shè)計(jì)[3]。
本文以一個(gè)超聲波測(cè)距系統(tǒng)為例,介紹如何在ZynqSoC上,定制IP、設(shè)計(jì)Linux設(shè)備驅(qū)動(dòng)等,并完整的闡述了從硬件到軟件的設(shè)計(jì)流程。設(shè)計(jì)的系統(tǒng)結(jié)構(gòu)如圖2所示。PS上,運(yùn)行Linux操作系統(tǒng),為L(zhǎng)inaroUbuntu發(fā)行版。根據(jù)文獻(xiàn)[2]的指導(dǎo)操作,使用Xilinx公司的開(kāi)發(fā)軟件完成配置,使PS可以運(yùn)行操作系統(tǒng)。
圖2:系統(tǒng)結(jié)構(gòu)圖
PL部分按照系統(tǒng)控制的需求進(jìn)行定制。設(shè)計(jì)基于 XilinxAXI總線的超聲波處理外設(shè)IP核,與外部的超聲波發(fā)射和接收電路交互。在Linux操作系統(tǒng)下,這個(gè)IP核就成為了一個(gè)設(shè)備,這就需要編寫(xiě)相應(yīng)的設(shè)備驅(qū)動(dòng)程序,實(shí)現(xiàn)超聲波測(cè)距功能的封裝。
2、 主要模塊設(shè)計(jì)
2.1 超聲波測(cè)距模塊
該模塊基本工作原理是:通過(guò)超聲波發(fā)射探頭,發(fā)射頻率為40kHz的超聲波信號(hào);當(dāng)超聲波信號(hào)遇到障礙物時(shí),會(huì)發(fā)生反射;當(dāng)超聲波接收探頭接收到40kHz頻率附近的聲波信號(hào)時(shí),經(jīng)過(guò)信號(hào)調(diào)理電路;再通過(guò)系統(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)接收端。通過(guò)I/O口TRIG觸發(fā)測(cè)距,提供了一個(gè)10ms以上的高電平觸發(fā)信號(hào),該模塊將發(fā)出8個(gè)40kHz的方波用于探測(cè),并自動(dòng)檢測(cè)是否有回波信號(hào)。一旦檢測(cè)到有回波信號(hào)則通過(guò)I/O口ECHO輸出一個(gè)高電平回響信號(hào),且回響信號(hào)的高電平時(shí)間tH(單位:ms)即高電平持續(xù)的時(shí)間與所測(cè)的距離S成正比。其對(duì)應(yīng)關(guān)系為:
式中:S為測(cè)試距離;tH為高電平時(shí)間(單位:s);v為聲速340m/s。
發(fā)射部分:利用串口轉(zhuǎn)換芯片的升壓功能,采用MAX232將輸入JN1和JN2的3.3VTTL電平轉(zhuǎn)換,得到5V電平。它激勵(lì)超聲波發(fā)射探頭的信號(hào)壓差為10V, 發(fā)出40kHz的超聲波。如圖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(XilinxPlatformStudio) 建立IP的流程,新建一個(gè)Ultrasonic(超聲波)IP核模塊。該IP核的模塊結(jié)構(gòu)如圖2所示中的超聲波處理外設(shè)部分,其中Triggercounter,Clockgen和Echocounter使用VerilogHDL實(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總線相連,用戶可以通過(guò)這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è)備。在這里需要編寫(xiě)的是一個(gè)字符設(shè)備[5]。另外,編寫(xiě)的設(shè)備將通過(guò)模塊化的方式加載到操作系統(tǒng)中,而不是靜態(tài)編譯到內(nèi)核中。驅(qū)動(dòng)程序在交叉編譯環(huán)境下,進(jìn) 行模塊化編譯。得到以.ko為擴(kuò)展名的驅(qū)動(dòng)文件,使用 insmod和rmmod進(jìn)行加載或者卸載,同時(shí)也可以通過(guò)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)的地址。具體如下:
#defineDEVICE_NAME"ULTRASONIC_MOUDLE"#defineULTRASONIC_MOUDLE_PHY_ADDR0x6E000000
該設(shè)備驅(qū)動(dòng)的主要函數(shù)有:設(shè)備初始化ultrason?ic_driver_module_init();三個(gè)方向上的距離測(cè)量函數(shù),sys_ultrasonic_front_get(),sys_ultrasonic_right_get()和sys_ultrasonic_left_get();設(shè)備注銷ultrasonic_driv? er_module_exit()。
(1)設(shè)備初始化函數(shù),完成注冊(cè)信息,當(dāng)進(jìn)行ins?mod操作時(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_ultra?sonic_front,dev_attr_ultrasonic_right,dev_attr_ultrason?ic_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)出來(lái),使得用戶空間 可以看見(jiàn)這些層次關(guān)系??梢酝ㄟ^(guò)CAT和ECHO接口命令來(lái)讀/寫(xiě)sysfs。使用函數(shù)宏DEVICE_ATTR創(chuàng)建接口如下:
staticDEVICE_ATTR(ultrasonic_front,S_IRUSR|S_IWUSR,NULL,sys_ultrasonic_front_get);
DEVICE_ATTR宏聲明有4個(gè)參數(shù),分別是名稱、權(quán) 限位、讀函數(shù)、寫(xiě)函數(shù)。其中讀函數(shù)和寫(xiě)函數(shù)是讀/寫(xiě)功能函數(shù)的函數(shù)名。這樣對(duì)ultrasonic_front創(chuàng)建一個(gè)寫(xiě)函 數(shù)sys_ultrasonic_front_get,其流程圖如圖7所示。
?
圖7:sys_ultrasonic_front_get流程圖
進(jìn)入函數(shù),首先會(huì)打印一條調(diào)試信息;然后向reg0(ultrasonic_trigger_addr)上寫(xiě)入使能,使開(kāi)始發(fā)射超聲波;循環(huán)檢測(cè)reg0的bit1,查看數(shù)據(jù)是否有效;如果數(shù)據(jù)有效,則讀取出reg1(ultrasonic_front_addr)上的數(shù)據(jù)值,并打印出來(lái)。完成一次讀取操作。 完成以上設(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è)備樹(shù),并制作根文件系統(tǒng),制作ramdisk鏡像文件,得到所有的文件zImage,devicetreee.dtb,ram?disk8M.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下
catultrasonic_front//讀取一次前向超聲波測(cè)量距離
catultrasonic_right//讀取一次右邊超聲波測(cè)量距離
catultrasonic_left//讀取一次左邊超聲波測(cè)量距離
系統(tǒng)測(cè)試后可以在終端里看到打印的加載信息“ul?trasonicdriverinitialsuccessfully!”和讀取到的測(cè)量距離數(shù)值。調(diào)整超聲波探頭前方障礙物距離,還可以得到不同的距離值,最終,實(shí)現(xiàn)的距離測(cè)量能夠達(dá)到2cm~4.5m 的范圍,精度可達(dá)0.2cm。
4結(jié)語(yǔ)
本文基于FPGA業(yè)界最先進(jìn)的芯片Zynq以及開(kāi)發(fā)平臺(tái)Zedboard,融合軟硬件設(shè)計(jì),從底層的各功能電路設(shè)計(jì),VerilogHDL代碼編寫(xiě),VerilogIP核設(shè)計(jì),到Linux設(shè)備驅(qū)動(dòng)設(shè)計(jì),完成了整個(gè)設(shè)計(jì)流程,在智能小車平臺(tái)上實(shí)現(xiàn)了在Linux系統(tǒng)中利用超聲波測(cè)距的功能,達(dá)到2cm~ 4.5m的測(cè)距范圍,精度達(dá)0.2cm,為上層應(yīng)用提供了支撐服務(wù)。該系統(tǒng)設(shè)計(jì)對(duì)基于Zynq?7000FPGA上的開(kāi)發(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]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]陸佳華,江舟,馬岷.嵌入式系統(tǒng)軟硬件協(xié)同設(shè)計(jì)實(shí)戰(zhàn)指南:基于XilinxZynq[M].北京:機(jī)械工業(yè)出版社,2013.
[3]李洪濤,顧陳,朱曉華.FPGA技術(shù)開(kāi)發(fā)(高級(jí)篇)[M].北京:國(guó)防工業(yè)出版社,2013.
[4]章立生,韓承德.SoC芯片設(shè)計(jì)方法及標(biāo)準(zhǔn)化[J].計(jì)算機(jī)研究與 發(fā)展,2002,39(1):1?8.
[5]KROAH?HARTMANCR.Linux設(shè)備驅(qū)動(dòng)程序[M].魏永明,耿 岳,鐘書(shū)毅,譯.3版.北京:中國(guó)電力出版社,2005.
[6]深圳市捷深科技有限公司.HC?SR04超聲波測(cè)距模塊說(shuō)明書(shū) [DB/OL].[2014?04?10].
評(píng)論
查看更多