基于Linux平臺的天氣雷達(dá)高速數(shù)據(jù)采集系統(tǒng)設(shè)計
掃描二維碼
隨時隨地手機(jī)看文章
Linux是開放源代碼、網(wǎng)絡(luò)化的操作系統(tǒng),具有穩(wěn)定、高效、內(nèi)核可自由配置等特點(diǎn)。采用Linux 操作系統(tǒng)作為開發(fā)平臺與采用VxWorks 和Windows 作為開發(fā)平臺相比不僅有免費(fèi)的優(yōu)勢,而且對于發(fā)展核心技術(shù),提高信息安全有著極其重要的意義,是自主研發(fā)的一個方向。隨著我國天氣雷達(dá)的快速發(fā)展,天氣雷達(dá)在民用和軍事領(lǐng)域的應(yīng)用越來越廣泛。目前,天氣雷達(dá)高速數(shù)據(jù)采集、傳輸?shù)裙δ艽蠖蓟赪indows平臺進(jìn)行開發(fā)實(shí)現(xiàn),實(shí)現(xiàn)由Windows平臺向Linux平臺的轉(zhuǎn)換,對于發(fā)展中國自主知識產(chǎn)權(quán)氣象軟件核心技術(shù), 提高信息安全有著極其重要的意義。本文基于Linux 操作系統(tǒng)(2.6.23內(nèi)核),實(shí)現(xiàn)了天氣雷達(dá)高速數(shù)據(jù)采集及處理,對天氣雷達(dá)系統(tǒng)由Windows平臺向Linux平臺移植具有參考價值。
1 數(shù)據(jù)采集系統(tǒng)分析
1.1 工作原理
天氣雷達(dá)高速數(shù)據(jù)采集系統(tǒng)由I/Q數(shù)據(jù)采集、FIFO緩沖、FPGA控制模塊及PCI總線芯片PLX9054組成,系統(tǒng)結(jié)構(gòu)框圖如圖1所示。
其核心部分為FPGA控制模塊,主要實(shí)現(xiàn)4個功能:(1)根據(jù)雷達(dá)量程和距離分辨率調(diào)整AD采樣時鐘的頻率;(2)控制AD兩路采樣數(shù)據(jù)寫入FIFO 緩沖以及DMA 傳輸時從FIFO中連續(xù)讀出數(shù)據(jù); (3)與PCI總線控制芯片PLX9054 進(jìn)行控制交互, 實(shí)現(xiàn)局部總線的讀寫控制、地址譯碼和中斷觸發(fā);(4)與PLX9054 進(jìn)行數(shù)據(jù)交互,使用FPGA內(nèi)部RAM保存控制天氣雷達(dá)發(fā)射機(jī)和接收機(jī)工作的命令及數(shù)據(jù),完成對雷達(dá)工作的控制。
I/Q數(shù)據(jù)采集輸出數(shù)據(jù)速度為2.4 Mb/s(I、Q數(shù)據(jù)各為24 bit),通過FPGA控制,合并寫入到FIFO緩沖。FIFO緩沖為32 bit、深度為16 KB的數(shù)據(jù)緩存,有效位為24 bit;與計算機(jī)總線的接口采用32 bit的PCI總線接口芯片PLX9054,PC機(jī)通過它完成與數(shù)據(jù)采集系統(tǒng)的數(shù)據(jù)交互。
1.2 PC機(jī)與采集系統(tǒng)數(shù)據(jù)訪問
1.2.1 局部地址分配
PC機(jī)與天氣雷達(dá)高速數(shù)據(jù)采集系統(tǒng)的數(shù)據(jù)訪問通過PCI總線芯片PLX9054實(shí)現(xiàn),訪問目標(biāo)為FIFO緩沖和FPGA片內(nèi)RAM。對FIFO緩沖和FPGA片內(nèi)RAM分配不同局部地址,通過對局部地址總線進(jìn)行譯碼確定需要訪問的目標(biāo)。FIFO 數(shù)據(jù)采用DMA傳輸方式連續(xù)讀出, 每次傳輸長度最大為8 KB,因此,設(shè)置FIFO空間32 bit局部地址范圍為0x20000000~0x2000FFFF,映射空間為PCI 地址空間bar2。
FPGA片內(nèi)RAM位寬為32 bit, 采用局部地址范圍為0x40000000~0x400FFFFF。映射空間為PCI地址空間bar3。
1.2.2 數(shù)據(jù)訪問方式
FIFO緩沖為可編程FIFO,由FPGA根據(jù)片內(nèi)存儲的雷達(dá)參數(shù)進(jìn)行控制。當(dāng)FIFO中數(shù)據(jù)達(dá)到設(shè)置的大小時,觸發(fā)PCIPLX9054引發(fā)PCI中斷,通過該中斷向驅(qū)動程序申請發(fā)起DMA 傳輸。驅(qū)動程序響應(yīng)該中斷后設(shè)置PCIPLX9054的DMA寄存器, 發(fā)起方向從局部總線到PCI總線的DMA傳輸,完成FIFO數(shù)據(jù)向PC機(jī)的傳輸。
FPGA片內(nèi)RAM通過PCI地址映射,使用IO操作方式進(jìn)行數(shù)據(jù)讀寫訪問。
2 Linux程序?qū)崿F(xiàn)
天氣雷達(dá)高速數(shù)據(jù)采集系統(tǒng)基于Linux2.6內(nèi)核平臺程序,由基于PCI總線的設(shè)備驅(qū)動程序、數(shù)據(jù)采集及處理程序組成。
2.1 設(shè)備驅(qū)動程序?qū)崿F(xiàn)
設(shè)備驅(qū)動程序的功能是在Linux2.6系統(tǒng)平臺下,通過對PCI總線控制芯片PLX9054的控制,實(shí)現(xiàn)PC機(jī)與采集板的數(shù)據(jù)交互,實(shí)現(xiàn)雷達(dá)采集數(shù)據(jù)的實(shí)時接收及雷達(dá)工作狀態(tài)的控制。從功能結(jié)構(gòu)上,設(shè)備驅(qū)動主要由設(shè)備裝載及初始化、提供給用戶層的接口函數(shù)、中斷及DMA數(shù)據(jù)傳輸三部分組成。
2.1.1 設(shè)備裝載及卸載
設(shè)備裝載和卸載即是Windows系統(tǒng)中設(shè)備驅(qū)動安裝和卸載。在Linux2.6中,裝載和卸載主要通過調(diào)用系統(tǒng)提供的PCI總線驅(qū)動注冊函數(shù)pci_register_drive和注銷函數(shù)pci_unregister_driver來實(shí)現(xiàn),其注冊的driver數(shù)據(jù)結(jié)構(gòu)如下:
static struct pci_driver plx9054_pci_driver = {
.name = 'pci9054',
.id_table = plx9054_pci_tbl,
.probe = plx9054_probe,
.remove = plx9054_remove,
};
當(dāng)系統(tǒng)引導(dǎo)時,高速數(shù)據(jù)采集系統(tǒng)板上電后,板上PCI總線固件對PLX9054設(shè)備進(jìn)行缺省配置,為設(shè)備的每個地址區(qū)域分配好資源。裝載函數(shù)在驅(qū)動中用module_init聲明,進(jìn)行設(shè)備的初始化工作,調(diào)用PCI總線驅(qū)動注冊函數(shù),根據(jù)id_table定義的信息對PCI設(shè)備PLX9054進(jìn)行探測識別,完成PLX9054設(shè)備驅(qū)動的PCI總線注冊,然后調(diào)用驅(qū)動注冊的probe函數(shù),完成PLX9054設(shè)備使能、PCI地址空間映射、PLX9054設(shè)備數(shù)據(jù)結(jié)構(gòu)初始化、設(shè)備注冊(注冊為字符設(shè)備)等操作。卸載函數(shù)用module_exit聲明,是裝載的逆過程,通過調(diào)用PCI總線驅(qū)動卸載函數(shù),繼而調(diào)用注冊的remove函數(shù)、注銷設(shè)備及PCI地址空間映射、釋放分配給設(shè)備的數(shù)據(jù)結(jié)構(gòu)空間等操作,完成系統(tǒng)資源釋放。
2.1.2 設(shè)備接口函數(shù)
設(shè)備接口函數(shù)為用戶提供與設(shè)備進(jìn)行交互的不同功能接口,主要完成用戶與設(shè)備的讀、寫及設(shè)備控制訪問等功能,其數(shù)據(jù)結(jié)構(gòu)設(shè)計為:
static const struct file_operations plx9054_fops = {
.owner = THIS_MODULE,
.open = plx9054_open, /*打開設(shè)備*/
.release = plx9054_close, /*釋放設(shè)備*/
.ioctl = plx9054_ioctl, /*IO操作*/
.read = plx9054_read, /*讀設(shè)備*/
};
這個數(shù)據(jù)結(jié)構(gòu)在設(shè)備裝載過程中,作為設(shè)備注冊的參數(shù)完成與設(shè)備掛接、使用戶在系統(tǒng)調(diào)用中能訪問到上述關(guān)聯(lián)的設(shè)備接口函數(shù)。
設(shè)備打開函數(shù)plx9054_open完成以下操作:設(shè)備私有數(shù)據(jù)結(jié)構(gòu)內(nèi)存空間分配及初始化,DMA連續(xù)物理內(nèi)存空間申請,為天氣雷達(dá)最大距離探測采集數(shù)據(jù)的大小;調(diào)用pci_map_single將分配的DMA內(nèi)存空間映射為用于DMA傳輸?shù)刂?;DMA數(shù)據(jù)緩沖區(qū)分配(容量為2 MB),緩沖區(qū)保存每次DMA傳輸中獲取的數(shù)據(jù);調(diào)用request_irq對中斷函數(shù)p9054_interrupt進(jìn)行中斷號申請;對天氣雷達(dá)工作參數(shù)進(jìn)行缺省配置,啟動雷達(dá)工作。設(shè)備釋放函數(shù)PLX9054_close完成的操作與設(shè)備打開函數(shù)與PLX9054_open相反。IO操作函數(shù)PLX9054_ioctl通過sys_ioctl系統(tǒng)調(diào)用,完成用戶與設(shè)備的信息查詢、雷達(dá)工作參數(shù)配置與查詢,如驅(qū)動軟件版本號、雷達(dá)當(dāng)前工作各參數(shù)配置和查詢,主要用于對FPGA中RAM內(nèi)存空間的雷達(dá)工作參數(shù)數(shù)據(jù)訪問。由于這部分?jǐn)?shù)據(jù)對訪問速度要求不高,使用IO操作能很好地滿足設(shè)計要求。讀設(shè)備函數(shù)PLX9054_read將驅(qū)動DMA數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)實(shí)時讀取到用戶空間緩沖區(qū)內(nèi),完成采集數(shù)據(jù)從設(shè)備到用戶的讀取操作。
2.1.3 中斷處理及DMA傳輸
中斷處理及DMA傳輸是驅(qū)動的核心部分,它的設(shè)計質(zhì)量直接影響到雷達(dá)采集數(shù)據(jù)能否正確、實(shí)時地從采集系統(tǒng)板傳送到設(shè)備驅(qū)動緩沖區(qū),并實(shí)時被用戶獲取。中斷處理工作流程如圖2所示。
由于DMA數(shù)據(jù)緩沖區(qū)遠(yuǎn)大于每次DMA數(shù)據(jù)傳輸大小,這對于雷達(dá)數(shù)據(jù)采集中因用戶讀取數(shù)據(jù)延遲而導(dǎo)致的緩沖區(qū)溢出有較好的抑制作用,而相對于現(xiàn)有計算機(jī)平臺,2 MB內(nèi)存容量已足夠。DMA數(shù)據(jù)緩沖區(qū)設(shè)計為循環(huán)緩沖區(qū),使用讀、寫指針維護(hù),在中斷處理中更新其寫指針,在PLX9054_read中更新其讀指針,采用溢出則覆蓋的機(jī)制,既方便管理,節(jié)省資源,同時又可對溢出進(jìn)行計數(shù),很方便進(jìn)行實(shí)時性能的測試。
2.2 數(shù)據(jù)采集處理程序?qū)崿F(xiàn)
數(shù)據(jù)采集處理程序是雷達(dá)高速數(shù)據(jù)采集系統(tǒng)的應(yīng)用處理程序,完成雷達(dá)高速數(shù)據(jù)采集及對采集數(shù)據(jù)的數(shù)字信號處理、輸出天氣雷達(dá)生成一次產(chǎn)品。其主要流程如圖3所示。
在采集I/Q數(shù)據(jù)時,I/Q兩路數(shù)據(jù)采用交叉采集方式存入FIFO緩沖中,每路數(shù)據(jù)有效位為23,最高位為符號位。因此,在采集數(shù)據(jù)處理中需對讀取的數(shù)據(jù)進(jìn)行I/Q數(shù)據(jù)分離,即將采集數(shù)據(jù)恢復(fù)為原始I、Q兩路數(shù)據(jù),同時將24 bit數(shù)據(jù)轉(zhuǎn)換為32 bit數(shù)據(jù)方式存儲,以滿足后面數(shù)字信號處理要求。
在軟件設(shè)計中,不同數(shù)字信號處理功能采用不同數(shù)字信號處理函數(shù)實(shí)現(xiàn),在采集數(shù)據(jù)獲取前進(jìn)行選擇配置,數(shù)字信號處理功能增加可通過增加相關(guān)的數(shù)字信號處理函數(shù)來滿足,以方便功能的完善和移植。通過對I/Q數(shù)據(jù)分離后獲得的數(shù)據(jù)進(jìn)行相關(guān)數(shù)字信號處理即可獲得天氣雷達(dá)中的一次產(chǎn)品,如功率和反射率等。
本文基于Linux2.6平臺,設(shè)計實(shí)現(xiàn)了天氣雷達(dá)高速數(shù)據(jù)采集系統(tǒng)的驅(qū)動和數(shù)據(jù)采集及對采集數(shù)據(jù)的數(shù)字信號處理,并在現(xiàn)有天氣雷達(dá)上完成了調(diào)試驗(yàn)證。目前,本設(shè)計已成功地應(yīng)用在現(xiàn)有的天氣雷達(dá)中。