,, , , ,楊艷,,
(1.江蘇省特種設(shè)備安全監(jiān)督檢驗(yàn)研究院,南京 210036;2.南京航空航天大學(xué) 自動(dòng)化學(xué)院,南京 211100)
因超聲相控陣檢測(cè)技術(shù)陣列式探頭的掃查方式獨(dú)特,所以其具有諸多常規(guī)超聲檢測(cè)所不具備的優(yōu)點(diǎn)。陣列換能器一般由多個(gè)互相獨(dú)立且線性排列或矩陣式排布的壓電晶片組合而成,一個(gè)晶片即為一個(gè)陣元。所有陣元都可在電子控制的延時(shí)激勵(lì)規(guī)則下,獨(dú)立進(jìn)行超聲波束的發(fā)射與接收,以此來(lái)實(shí)現(xiàn)多通道的靈活配置,形成預(yù)期的聲束效果。超聲相控陣換能器能夠模擬多種探頭的工作,檢測(cè)速度快,適用于不規(guī)則形狀物體的檢測(cè),彌補(bǔ)了許多常規(guī)超聲檢測(cè)的不足。
在一套完整的超聲相控陣檢測(cè)成像系統(tǒng)中,為了配合探頭的工作,還需要發(fā)射/接收前端、數(shù)據(jù)采集、數(shù)據(jù)處理、人機(jī)交互等模塊的相互協(xié)同。筆者重點(diǎn)研究了便攜式超聲相控陣檢測(cè)成像系統(tǒng),采用FPGA(現(xiàn)場(chǎng)可編程門陣列)和ARM(先進(jìn)RISC處理機(jī))對(duì)系統(tǒng)所需的通信接口進(jìn)行設(shè)計(jì)。其中,ARM處理器在控制方面發(fā)揮了高功效、低功耗的獨(dú)特優(yōu)勢(shì);而FPGA器件則在高速數(shù)據(jù)的采集與處理方面,發(fā)揮了強(qiáng)大的作用[1]。
超聲相控陣檢測(cè)成像系統(tǒng)的總體結(jié)構(gòu)框圖如圖1所示。一次完整的檢測(cè)包括以下流程:主控模塊接收人工設(shè)置的檢測(cè)參數(shù),并根據(jù)偏轉(zhuǎn)聚焦法則計(jì)算發(fā)射時(shí)延,計(jì)算結(jié)果向發(fā)射控制電路傳遞,進(jìn)而控制超聲陣列探頭激發(fā)相應(yīng)聲束到被檢對(duì)象;超聲波束遇到對(duì)象內(nèi)部缺陷被反射,經(jīng)由接收電路采集后,進(jìn)入信號(hào)處理模塊進(jìn)行進(jìn)一步的處理,最后傳輸至主控模塊進(jìn)行分配存儲(chǔ)、顯示成像等。
圖1 超聲相控陣檢測(cè)成像系統(tǒng)總體結(jié)構(gòu)框圖
其中,F(xiàn)PGA選用Altera公司的Cyclone IV系列EP4CE15F17C8N,加以外圍電路構(gòu)成數(shù)據(jù)處理模塊,完成發(fā)射前端脈沖延時(shí)激勵(lì)、采集信號(hào)串并轉(zhuǎn)換、接收聲束延時(shí)補(bǔ)償?shù)裙ぷ?。主控模塊硬件平臺(tái)選用三星公司的“蜂鳥(niǎo)”處理器S5PV210。該處理器集成了ARM Cotex-A8核心,采用64位內(nèi)部總線結(jié)構(gòu),實(shí)現(xiàn)了ARM架構(gòu)V7,內(nèi)部集成了許多外設(shè)。與同類芯片相比,S5PV210功耗低且性能較高,適合應(yīng)用于醫(yī)療設(shè)備、通信設(shè)備或手持電子設(shè)備等領(lǐng)域。
FPGA與ARM通信,主要用于用戶檢測(cè)參數(shù)的配置下發(fā),以及檢測(cè)波束的數(shù)據(jù)回傳。FPGA與ARM存在多種接口方式,如SPI、IIC等串行接口。但串行接口自身的局限性限制了其在實(shí)時(shí)、大量數(shù)據(jù)傳輸中的應(yīng)用[2]。相比之下,并行接口的總線連接更加穩(wěn)定與合理,且在所使用的開(kāi)發(fā)板中,CPU與各部分間的通信,由多層次AHB/AXI總線負(fù)責(zé),以保證高速數(shù)據(jù)的交互。因此,采用存儲(chǔ)總線的方式,把FPGA芯片EP4CE15F17C8N掛接在S5PV210的總線上,ARM處理器通過(guò)存儲(chǔ)器指令訪問(wèn)FPGA。
采用FPGA器件內(nèi)提供的M9K存儲(chǔ)器,進(jìn)行處理后的檢測(cè)回波數(shù)據(jù)的中轉(zhuǎn)與傳輸。系統(tǒng)需要由ARM處理器向FPGA傳送配置數(shù)據(jù),也需要從FPGA中讀取經(jīng)過(guò)其處理的檢測(cè)回波數(shù)據(jù),這不僅是一個(gè)方向的數(shù)據(jù)流通,還需要兩個(gè)端口才能完成各自數(shù)據(jù)的交互工作。為了方便兩次數(shù)據(jù)交互使用同一套硬件連接,而無(wú)需再開(kāi)辟新的通路,采用M9K的真雙端口模式。
配置M9K為雙端口RAM,A口作為FPGA連接的主體,其輸出端q_a[ ]與數(shù)據(jù)端data_a[ ]均需要與FPGA的數(shù)據(jù)端相連;B口作為ARM處理器連接的主體,其輸出端q_b[ ]與數(shù)據(jù)端data_b[ ]均需要與ARM數(shù)據(jù)端相連。真雙端口模式下,端口A上的寫操作與端口B上的讀操作時(shí)序波形如圖2所示,寄存RAM的輸出端會(huì)將q輸出延長(zhǎng)一個(gè)時(shí)鐘周期。
圖2 M9K真雙端口模式時(shí)序
S5PV210的外接總線型設(shè)備尋址區(qū)有6個(gè)Bank,每個(gè)大小為128 MB,Xm0CSn0~Xm0CSn5分別為其相應(yīng)的片選信號(hào)。外接的總線型設(shè)備通過(guò)此信號(hào)的引出腳,掛接于總線之上,并尋址相應(yīng)的內(nèi)存空間。系統(tǒng)選用BANK5。
若地址總線上發(fā)送的地址在S5PV210 BANK5的尋址范圍之內(nèi),則表示此次訪問(wèn)BANK5,相應(yīng)片選信號(hào)Xm0CSn5被拉低,選中該BANK所接的FPGA。S5PV210處理器中的SROM BANK對(duì)一個(gè)地址讀操作,則相應(yīng)讀信號(hào)Xm0OEn被自動(dòng)拉低,該信號(hào)與FPGA的讀使能信號(hào)相連,即可讀取FPGA中的數(shù)據(jù);對(duì)一個(gè)地址寫操作,則相應(yīng)寫信號(hào)Xm0WEn被自動(dòng)拉低,該信號(hào)與FPGA的寫使能信號(hào)相連,即可向FPGA中寫入數(shù)據(jù)。
設(shè)計(jì)16位寬數(shù)據(jù)線,12位寬地址線,并將ARM的數(shù)據(jù)、地址線連接至FPGA。除上述總線、時(shí)鐘與片選信號(hào)連接之外,加上讀寫控制信號(hào)以及中斷信號(hào),則能夠使FPGA向ARM發(fā)起中斷申請(qǐng)并進(jìn)行數(shù)據(jù)交互。FPGA與ARM硬件連接原理示意如圖3所示。
圖3 FPGA與ARM硬件連接原理示意
在檢測(cè)開(kāi)始之前,人工設(shè)置一系列檢測(cè)參數(shù),由ARM處理器根據(jù)相應(yīng)的聚焦法則來(lái)計(jì)算發(fā)射電路激勵(lì)每一個(gè)探頭陣元所需要的延遲時(shí)間,并通過(guò)通信總線傳輸給FPGA,再由FPGA負(fù)責(zé)后續(xù)的脈沖激勵(lì)等工作;在一輪檢測(cè)之后,反射回多路超聲波束,由前端電路對(duì)其進(jìn)行采集接收,并交由FPGA完成一系列數(shù)據(jù)處理,得到各路檢測(cè)回波信號(hào),通過(guò)通信總線將其傳輸至ARM處理器,進(jìn)而完成更進(jìn)一步的處理或成像。
系統(tǒng)中的軟硬件之間,需要一個(gè)連接兩者的橋梁,將硬件功能轉(zhuǎn)換為軟件設(shè)計(jì)人員能夠直接使用的接口函數(shù)。操作系統(tǒng)在嵌入式系統(tǒng)中,處于設(shè)備硬件與應(yīng)用程序之間,能夠提供統(tǒng)一編程接口給操作的用戶[3]。但對(duì)于操作系統(tǒng)來(lái)說(shuō),硬件設(shè)備各不相同,操作系統(tǒng)不可能針對(duì)每一個(gè)特定參數(shù)的設(shè)備提供相應(yīng)的支持。不過(guò)相似地,其可以根據(jù)某一類設(shè)備的共同點(diǎn),提供該類設(shè)備的控制代碼,從而不用去考慮不同設(shè)備之間的細(xì)節(jié)與區(qū)別,此代碼即為驅(qū)動(dòng)程序。
驅(qū)動(dòng)程序?qū)⒂布O(shè)備的具體結(jié)構(gòu)進(jìn)行屏蔽,對(duì)其進(jìn)行了一種抽象,使設(shè)備在系統(tǒng)中以文件的形式存在。虛擬文件系統(tǒng)(VFS)中,淡化了設(shè)備與文件的區(qū)別,將所有的硬件操作看成是對(duì)普通文件的操作。用戶在應(yīng)用程序的角度看硬件設(shè)備,就如同一個(gè)普通文件,通過(guò)系統(tǒng)調(diào)用即可操作設(shè)備。
Linux系統(tǒng)中,設(shè)備驅(qū)動(dòng)按層次能夠分為3個(gè)方面:與系統(tǒng)引導(dǎo)的接口、與內(nèi)核的接口和與設(shè)備之間的接口。與系統(tǒng)引導(dǎo)的接口主要針對(duì)設(shè)備,實(shí)現(xiàn)一些必要的初始化;與內(nèi)核的接口主要是file_operations結(jié)構(gòu)的完善;與設(shè)備的接口則通常以ioctl( )函數(shù)完成驅(qū)動(dòng)與設(shè)備之間的互動(dòng)。
內(nèi)核中由module_init( )和module_exit( )兩者進(jìn)行注冊(cè)與卸載設(shè)備驅(qū)動(dòng)程序,這些參數(shù)則指定了相應(yīng)初始化與退出函數(shù)的地址,設(shè)置為FPGA_init以及FPGA_exit。在初始化函數(shù)中,通過(guò)register_chrdev( )函數(shù)對(duì)字符設(shè)備驅(qū)動(dòng)進(jìn)行注冊(cè);在退出函數(shù)時(shí),通過(guò)unregister_chrdev( )函數(shù)對(duì)字符設(shè)備驅(qū)動(dòng)進(jìn)行卸載。
初始化函數(shù)FPGA_init主要對(duì)設(shè)備進(jìn)行初始化以及注冊(cè),使用函數(shù)register_chrdev(MAJOR,DEV-ICE_NAME,&fpga_fops)。其中,字符設(shè)備注冊(cè)函數(shù)register_chrdev的MAJOR參數(shù)代表主設(shè)備號(hào),DEVICE_NAME代表設(shè)備驅(qū)動(dòng)名,而&fpga_fops代表驅(qū)動(dòng)的file_operations。創(chuàng)建FPGA的設(shè)備入口點(diǎn)于設(shè)備目錄/dev/fpga下,名為fpga。
file_operations結(jié)構(gòu)體中驅(qū)動(dòng)程序cdev_init設(shè)計(jì)的主要任務(wù)是file_operations結(jié)構(gòu)體的實(shí)現(xiàn),該結(jié)構(gòu)體中的每個(gè)成員都與系統(tǒng)調(diào)用一一對(duì)應(yīng),由此實(shí)現(xiàn)FPGA和ARM之間的通信。
驅(qū)動(dòng)程序的具體內(nèi)容根據(jù)不同的設(shè)備及需求而有所區(qū)別,但整體來(lái)說(shuō),均要實(shí)現(xiàn)初始化、打開(kāi)、寫入、讀取、關(guān)閉等幾個(gè)基本操作。打開(kāi)和關(guān)閉是一對(duì)互相相反的操作,一個(gè)將設(shè)備打開(kāi)并添加設(shè)備計(jì)數(shù),另一個(gè)釋放設(shè)備并減少設(shè)備計(jì)數(shù)。寫入與讀取也彼此相對(duì),但二者都是在內(nèi)核及用戶空間中傳遞數(shù)據(jù),只是傳輸?shù)姆较蛳喾础?/p>
file_operations中包含諸多操作函數(shù),但對(duì)于具體的應(yīng)用,上述幾個(gè)函數(shù)即可實(shí)現(xiàn)所需要的驅(qū)動(dòng)與內(nèi)核之間的交互。
fpga_open( )負(fù)責(zé)初始化FPGA,并對(duì)其進(jìn)行設(shè)備有無(wú)錯(cuò)誤的相關(guān)檢測(cè),將其設(shè)備使用計(jì)數(shù)加1,并分辨次設(shè)備號(hào)。fpga_release( )負(fù)責(zé)釋放設(shè)備打開(kāi)時(shí)用到的系統(tǒng)資源,并將FPGA設(shè)備的使用計(jì)數(shù)減1。
fpga_read( )負(fù)責(zé)讀取FPGA中的數(shù)據(jù),該函數(shù)有返回值,讀取操作的成功與否表現(xiàn)在函數(shù)返回值為讀取字節(jié)數(shù)還是負(fù)值。fpga_write( )負(fù)責(zé)向FPGA中寫入數(shù)據(jù),該函數(shù)同樣有返回值,根據(jù)返回值為寫入字節(jié)數(shù)還是EINVAL返回值來(lái)判斷寫入操作的成功與否。
fpga_mmap( )負(fù)責(zé)地址映射,因?yàn)橛脩艨臻g無(wú)法直接訪問(wèn)設(shè)備,該函數(shù)為二者提供了一條相互聯(lián)系的途徑,將FPGA內(nèi)存線性映射至用戶進(jìn)程中的地址空間,最終的物理地址映射由remap_page_range( )函數(shù)的調(diào)用實(shí)現(xiàn)。fpga_ioctl( )負(fù)責(zé)讀寫命令之外的設(shè)備操作,返回非負(fù)值時(shí)說(shuō)明執(zhí)行成功。
ioctl( )函數(shù)是驅(qū)動(dòng)與設(shè)備接口實(shí)現(xiàn)的一個(gè)方式,主要對(duì)設(shè)備I/O進(jìn)行管理并設(shè)置相應(yīng)的中斷。事實(shí)上,內(nèi)核及用戶空間也無(wú)法直接聯(lián)系,需要通過(guò)copy_from_user( )和copy_to_user( )函數(shù)來(lái)完成。但這種方式效率不高,不如直接映射快,即內(nèi)核可訪問(wèn)物理地址到用戶空間的映射。
設(shè)備驅(qū)動(dòng)中,該方式相比標(biāo)準(zhǔn)I/O,對(duì)于大文件的處理速度更快,讀寫操作均不用再經(jīng)過(guò)內(nèi)核到用戶空間的中間復(fù)制過(guò)程。根據(jù)Linux虛擬內(nèi)存管理,將物理地址映射至虛擬空間,可對(duì)該段地址執(zhí)行讀寫操作。通過(guò)內(nèi)存映射,實(shí)現(xiàn)用戶空間對(duì)設(shè)備FPGA的訪問(wèn)[4]。
使用函數(shù)request_mem_region( ),在訪問(wèn)之前檢驗(yàn)內(nèi)存資源申請(qǐng)的情況,若成功,則該資源被標(biāo)記并無(wú)法再被其他驅(qū)動(dòng)申請(qǐng)。在驅(qū)動(dòng)程序初始化階段,由函數(shù)ioremap( )負(fù)責(zé)映射FPGA物理地址到內(nèi)核中的虛擬空間,而后在驅(qū)動(dòng)程序調(diào)用時(shí),函數(shù)remap_page_range( )真正將映射執(zhí)行至用戶虛擬空間。操作完成后,通過(guò)函數(shù)iounmap( )及release_mem_region( )來(lái)實(shí)現(xiàn)與前述過(guò)程相對(duì)的操作,釋放申請(qǐng)的虛擬地址并歸還內(nèi)存資源。圖4為內(nèi)存映射流程。
圖4 內(nèi)存映射流程
將探頭放置于試塊表面,令系統(tǒng)工作并接收回傳的16路超聲數(shù)據(jù)(見(jiàn)圖5)。該16路信號(hào)經(jīng)過(guò)系統(tǒng)前端的處理,已進(jìn)行過(guò)延時(shí)補(bǔ)償,可以看出信號(hào)在幅值波動(dòng)處對(duì)齊。由圖5可知,單一通道回波信號(hào)的幅值較小,不易觀察,這也是相控陣超聲檢測(cè)需要進(jìn)行波束合成的原因之一。多路信號(hào)延時(shí)疊加后,同相增強(qiáng),反相相消。
圖5 16路回波數(shù)據(jù)波形
采用基于FPGA+ARM的形式,結(jié)合二者優(yōu)勢(shì),搭建了超聲相控陣檢測(cè)成像系統(tǒng),設(shè)計(jì)了FPGA與ARM之間的通信接口。在FPGA中配置雙口RAM進(jìn)行數(shù)據(jù)的中轉(zhuǎn)與傳輸,在Linux操作系統(tǒng)下編寫驅(qū)動(dòng)程序,以完成軟硬件之間的交互。經(jīng)測(cè)試,系統(tǒng)運(yùn)行與接口工作正常,檢測(cè)結(jié)果能夠有效顯示。