劉軍霞,楊先文
(1.河南省軍區(qū)自動(dòng)化站,鄭州450003;2.信息工程大學(xué),鄭州450004)
·微機(jī)應(yīng)用·
面向國產(chǎn)OS的PCI采集卡軟硬件設(shè)計(jì)與驗(yàn)證
劉軍霞1,楊先文2
(1.河南省軍區(qū)自動(dòng)化站,鄭州450003;2.信息工程大學(xué),鄭州450004)
為了滿足國產(chǎn)操作系統(tǒng)上數(shù)據(jù)采集的性能要求,在研究PCI采集卡原理的基礎(chǔ)上,提出一種基于FPGA和Linux的PCI采集卡軟硬件設(shè)計(jì)方案。硬件主要是對時(shí)鐘模塊、數(shù)據(jù)采集模塊、FIFO模塊和主控模塊等FPGA的控制邏輯進(jìn)行設(shè)計(jì),軟件主要包括應(yīng)用程序和Linux驅(qū)動(dòng)設(shè)計(jì)。驗(yàn)證結(jié)果表明,軟硬件設(shè)計(jì)功能正確,并且與18 MHz時(shí)鐘頻率相比,高時(shí)鐘頻率采集性能提高了約15%至78%。當(dāng)時(shí)鐘頻率為40 MHz時(shí),采集速率不小于50.2 MByte/s,適用于數(shù)據(jù)采集速度要求較高的應(yīng)用系統(tǒng)。
國產(chǎn)操作系統(tǒng);Linux內(nèi)核;PCI總線;采集卡;現(xiàn)場可編程門陣列;驅(qū)動(dòng)
數(shù)據(jù)采集系統(tǒng)廣泛應(yīng)用于軍事、能源、航天等關(guān)鍵領(lǐng)域,如何將外界數(shù)據(jù)采集到計(jì)算機(jī)中,成為數(shù)據(jù)采集卡需要解決的問題。PCI(Peripheral Component Interconnect)是一種高性能局域總線標(biāo)準(zhǔn),最大支持64位并行傳輸,工作時(shí)鐘可達(dá)66 MHz,傳輸峰值可達(dá)528 MByte/s,已成為眾多數(shù)據(jù)采集卡的接口方案[1-2]。
Linux作為一種支持多用戶、多任務(wù)、多線程和多CPU的開放式操作系統(tǒng)(operatingsystem,OS)內(nèi)核,已被國產(chǎn)OS廣泛采納,出現(xiàn)了中標(biāo)麒麟[3]等許多優(yōu)秀產(chǎn)品。由于OS關(guān)系關(guān)鍵領(lǐng)域信息化的自主可控安全,因而推廣國產(chǎn)OS的意義重大。目前,針對PCI采集卡的驅(qū)動(dòng)和應(yīng)用程序設(shè)計(jì)大多針對Windows平臺[4-5],面向國產(chǎn)OS的軟件設(shè)計(jì)是亟待解決的問題。
為了適應(yīng)國產(chǎn)OS數(shù)據(jù)采集系統(tǒng)要求,滿足關(guān)鍵應(yīng)用領(lǐng)域?qū)?shù)據(jù)采集的現(xiàn)實(shí)需要,在研究PCI采集卡原理的基礎(chǔ)上,給出了PCI采集卡的軟硬件設(shè)計(jì)方案。驗(yàn)證表明,面向國產(chǎn)OS平臺的軟硬件設(shè)計(jì)正確,采集性能滿足速率要求高的應(yīng)用場合。
PCI采集卡軟硬件組成如圖1所示,主要包括PCI采集卡和主機(jī)軟件兩部分。PCI采集卡主要由A/D轉(zhuǎn)換邏輯、FPGA控制邏輯和PCI接口邏輯組成?;竟ぷ髟恚和ㄟ^高速A/D轉(zhuǎn)換邏輯采集外部模擬信號,通過FPGA控制邏輯實(shí)現(xiàn)數(shù)據(jù)緩存,以及控制PCI接口邏輯執(zhí)行DMA傳輸將緩存數(shù)據(jù)寫入主機(jī)內(nèi)存中,便于主機(jī)對采集數(shù)據(jù)進(jìn)一步處理分析。主機(jī)軟件主要包括應(yīng)用程序和PCI驅(qū)動(dòng)。
圖1 PCI采集卡軟硬件組成
在PCI采集卡中,A/D轉(zhuǎn)換和PCI接口邏輯一般采用專用芯片實(shí)現(xiàn),例如PCI接口芯片采用PLX PCI9054,用戶只需根據(jù)其時(shí)序要求完成I/O交互即可。而FPGA芯片作為采集卡的可編程邏輯,承擔(dān)著對采集卡上所有時(shí)序和邏輯的控制任務(wù),是PCI采集卡承前啟后的重要組成部分。因此,F(xiàn)PGA控制邏輯是PCI采集卡嵌入式硬件設(shè)計(jì)的主要內(nèi)容。
PCI采集卡的數(shù)據(jù)采集命令由主機(jī)發(fā)出,通過PCI9054的Target傳輸方式向FPGA控制邏輯傳送命令。當(dāng)FPGA控制邏輯收到命令后,控制數(shù)據(jù)采集模塊實(shí)現(xiàn)對A/D數(shù)字信號的獲取,并將采集數(shù)據(jù)緩存至FPGA中例化的FIFO模塊中。當(dāng)FIFO緩存容量滿足中斷觸發(fā)條件時(shí),通過PCI9054向主機(jī)發(fā)送本地中斷請求,主機(jī)響應(yīng)中斷后,通過PCI9054的DMA傳輸方式讀取FIFO數(shù)據(jù)至主機(jī)內(nèi)存。FPGA控制邏輯的硬件設(shè)計(jì)原理如圖2所示。
3.1 時(shí)鐘模塊
圖2 FPGA控制邏輯設(shè)計(jì)原理
時(shí)鐘模塊主要向數(shù)據(jù)采集模塊提供采樣時(shí)鐘,并向FIFO模塊提供數(shù)據(jù)寫入時(shí)鐘wrclk。由于FIFO穩(wěn)定工作時(shí)要求寫時(shí)序不大于讀時(shí)序,因此時(shí)鐘模塊一般是將晶振輸入分頻后作為數(shù)據(jù)采集模塊和FIFO寫入端的時(shí)鐘輸入。在FPGA中,大多集成有成熟的時(shí)鐘分頻裝置,例如:Altera的FPGA都帶有一個(gè)或多個(gè)PLL(Phase Locked Loop),可有效的對時(shí)鐘進(jìn)行分頻、倍頻和延時(shí)等處理。Xilinx的FPGA中集成的DCM(Digital Clock Manager),可有效的對時(shí)鐘進(jìn)行分頻、去skew和相移等處理。
3.2 數(shù)據(jù)采集模塊
數(shù)據(jù)采集模塊主要是采集數(shù)字輸入信號,產(chǎn)生FIFO的寫請求wrreq及寫數(shù)據(jù)din。若數(shù)字輸入位寬和寫數(shù)據(jù)din位寬 不相等(一般地, ),則需要計(jì)數(shù)??W??個(gè)時(shí)鐘周期產(chǎn)生的wrreq,同時(shí)?W?將?W?個(gè)時(shí)鐘周期內(nèi)采集到的輸入信號級聯(lián)作?W?為寫數(shù)據(jù)din。在設(shè)計(jì)中,多周期內(nèi)輸入信號的級聯(lián)采用移位寄存器方式實(shí)現(xiàn)。
此外,由于數(shù)字輸入所用時(shí)鐘和采樣時(shí)鐘clk分屬不同的時(shí)鐘域,在使用clk對數(shù)字輸入進(jìn)行異步采樣時(shí),若數(shù)字輸入不滿足采樣觸發(fā)器的建立時(shí)間(Tsu)和保持時(shí)間(Th),就可能產(chǎn)生亞穩(wěn)態(tài)[6]。在設(shè)計(jì)中,采用對異步信號進(jìn)行同步處理方式消除亞穩(wěn)態(tài),通過多級寄存器提取邊沿信號方式,保證采樣數(shù)據(jù)的穩(wěn)定性。
3.3 FI FO模塊
為了實(shí)現(xiàn)數(shù)據(jù)采集和PCI9054本地傳輸?shù)乃俣绕ヅ?,設(shè)計(jì)異步FIFO緩存采樣數(shù)據(jù)。具體地,采用FPGA內(nèi)部塊存儲器例化FIFO模塊方式設(shè)計(jì),在最大限度利用FPGA存儲資源的同時(shí),可使得設(shè)計(jì)更加靈活高效。目前,Altera和Xilinx的FPGA都提供FIFO例化功能,根據(jù)需要設(shè)置FIFO深度及其接口,即可完成FIFO模塊設(shè)計(jì)。在本文中,我們基于Altera的EP1C12Q240C8型FPGA,設(shè)置FIFO深度為16 KB,F(xiàn)IFO接口包括aclr,wrclk,wrreq,din,wrusedw,rdclk,rdreq,dout,rdusedw。
3.4 主控模塊
主控模塊是FPGA控制邏輯最關(guān)鍵的設(shè)計(jì),主要包括以下功能:
(1)控制數(shù)據(jù)采集模塊
當(dāng)LRESET#有效時(shí),通過rst復(fù)位數(shù)據(jù)采集模塊。當(dāng)接收到數(shù)據(jù)采集命令時(shí),解析該命令后置enable有效,使能數(shù)據(jù)采集模塊工作。設(shè)置FIFO為計(jì)數(shù)wrusedw的上限,當(dāng)wrusedw達(dá)到上限時(shí),置位stop有效關(guān)閉數(shù)據(jù)采集功能,待FIFO數(shù)據(jù)讀取至wrusedw低于上限時(shí),置stop失效,開啟數(shù)據(jù)采集功能。
(2)控制FIFO讀取
當(dāng)LRESET#有效時(shí),通過aclr清除FIFO模塊工作狀態(tài)。設(shè)置FIFO為可讀計(jì)數(shù)rdusedw的下限,當(dāng)rdusedw達(dá)到下限時(shí)置LINT#有效,向主機(jī)發(fā)送本地中斷請求。當(dāng)接收到DMA傳輸命令時(shí),解析該命令后置rdreq有效,通過DMA傳輸方式讀取FIFO數(shù)據(jù)到主機(jī)內(nèi)存中。
(3)控制PCI9054本地總線
當(dāng)LHOLD#有效時(shí),下一個(gè)時(shí)鐘置位LHOLDA#有效,允許PCI9054使用本地總線。通過ADS#,BLAST#,LWR#,本地?cái)?shù)據(jù)和本地地址接收主機(jī)命令,當(dāng)接收到數(shù)據(jù)采集命令時(shí),解析命令內(nèi)容(由本地?cái)?shù)據(jù)輸入)置enable有效或無效;當(dāng)接收到DMA傳輸命令時(shí),解析命令內(nèi)容(由本地地址輸入)置rdreq和READY#有效或無效。根據(jù)FIFO緩存容量是否滿足中斷觸發(fā)條件置LINT#有效或無效。同時(shí),為了本地總線正常工作,置CCS#無效,通知PCI9054不選擇配置寄存器;置BTERM#無效,通知PCI9054當(dāng)前突發(fā)操作始終連貫完成。
4.1 應(yīng)用程序設(shè)計(jì)
為了快速使用PCI芯片,PLX公司提供了成熟的軟件開發(fā)套件(Software Development Kit,SDK),包括一整套PCI9054的API訪問接口[7]。基于PLXAPI接口,本文所述的PCI采集卡應(yīng)用程序流程及關(guān)聯(lián)API如圖3所示,主要包括5個(gè)環(huán)節(jié):發(fā)現(xiàn)PCI、打開PCI、發(fā)送數(shù)據(jù)采集命令、DMA傳輸和關(guān)閉PCI。
在應(yīng)用程序設(shè)計(jì)中,需要注意以下問題:
(1)發(fā)送數(shù)據(jù)采集命令是通過PlxPci_PciBar-Sp-aceWrite()向PCI本地指定地址寫入1個(gè)Bit-Size8數(shù)據(jù)實(shí)現(xiàn)的。BitSize8理論上可編碼256個(gè)系統(tǒng)命令,滿足大多數(shù)應(yīng)用的命令編碼空間需求。
(2)使用PlxPci_DmaChannelOpen()打開DMA通道時(shí),需使用PLX_DMA_PROP結(jié)構(gòu)數(shù)據(jù)定義通道屬性,本文定義為:
PLX_DMA_PROP DmaProp;
memset(&DmaProp,0,sizeof(DmaProp));
DmaProp.ReadyInput=1;
DmaProp.Burst=1;
DmaProp.BurstInfinite=1;
DmaProp.SglMode=1;
DmaProp.DoneInterrupt=1;
DmaProp.ConstAddrLocal=1;
DmaProp.LocalBusWidth=2。
圖3 應(yīng)用程序流程及關(guān)聯(lián)API
(3)使用 PlxPci_NotificationRegisterFor()注冊DMA中斷時(shí),需使用PLX_INTERRUPT結(jié)構(gòu)數(shù)據(jù)定義中斷屬性,本文定義為:
PLX_INTERRUPT PlxInt;
memset(&PlxInt,0,sizeof(PlxInt));
PlxInt.LocalToPci=(1<<DMAChannel);
其中,DMAChannel表示DMA通道,一般為0或1。
(4)使用PlxPci_DmaTransferUserBuffer()獲取DMA數(shù)據(jù)時(shí),需使用PLX_DMA_PARAMS結(jié)構(gòu)數(shù)據(jù)定義DMA參數(shù),本文定義為:
PLX_DMA_PARAMS PlxParams;
memset(&PlxParams,0,sizeof(PlxParams));
PlxParams.UserVa=(PLX_UINT_PTR)pUserBuffer;
PlxParams.LocalAddr=LocalAddress;
PlxParams.ByteCount=sizeof(pUserBuffer);
PlxParams.Direction=PLX_DMA_LOC_TO_PCI。
其中,pUserBuffer為自定義內(nèi)存指針,LocalAddress為自定義本地地址。LocalAddress應(yīng)與FPGA控制邏輯中定義的DMA本地地址保持一致。
4.2 PC I驅(qū)動(dòng)設(shè)計(jì)
在PLX SDK中,提供了PCI9054 Windows驅(qū)動(dòng)程序。由于Linux系統(tǒng)具有差異性,只提供了Linux系統(tǒng)驅(qū)動(dòng)開放解決方案,基于該方案,編譯中標(biāo)麒麟操作系統(tǒng)驅(qū)動(dòng)的步驟如下:
(1)uzip命令解壓PLX_SDK_Linux_*.zip,得到PlxSdk.tar,并拷貝到工作目錄下(建議為/usr/src/);
(2)tar命令解壓PlxSdk.tar,得到PlxSdk目錄;
(3)以編輯模式打開/etc/environment,按下語句設(shè)置系統(tǒng)環(huán)境變量:
export PLX_SDK_DIR=/usr/src/PlxSdk;(4)根據(jù)機(jī)器配置設(shè)置如下環(huán)境變量:export PLX_CPU_BIG_ENDIAN=1;export PLX_CPU_BITS=64。
(5)在Driver目錄下進(jìn)行驅(qū)動(dòng)編譯(使用builddriver或builddriverall命令),編譯后,Plx9054目錄中的Plx9054.ko就是PCI9054驅(qū)動(dòng)。
驅(qū)動(dòng)編譯完成后,在每次操作系統(tǒng)啟動(dòng)時(shí),使用Bin目錄下Plx_load(或Plx_unload)命令向驅(qū)動(dòng)列表中加載(或卸載)驅(qū)動(dòng)。加載成功后,PCI采集卡和應(yīng)用程序才能正常交互,否則 PLX API將返回ApiNoActiveDriver錯(cuò)誤。
基于PCI DTK(V2.0)實(shí)驗(yàn)板[8],在中標(biāo)麒麟操作系統(tǒng)(V3.2.2)[3]下,對PCI采集卡的軟硬件設(shè)計(jì)進(jìn)行了實(shí)現(xiàn)。FPGA控制邏輯基于Altera的EP1C12-Q240C8芯片實(shí)現(xiàn),Linux應(yīng)用軟件基于Qt環(huán)境[9]開發(fā)。為了檢驗(yàn)設(shè)計(jì)的正確性及采集性能,采用兩個(gè)實(shí)驗(yàn)進(jìn)行驗(yàn)證。
實(shí)驗(yàn)1:采用FPGA實(shí)現(xiàn)方式,在數(shù)據(jù)采集模塊前端放置一個(gè)實(shí)驗(yàn)數(shù)據(jù)產(chǎn)生邏輯,用來仿真A/D數(shù)字信號(此時(shí)A/D轉(zhuǎn)換邏輯不參與實(shí)驗(yàn))。在數(shù)據(jù)內(nèi)容上,仿真數(shù)據(jù)可按某種規(guī)則產(chǎn)生(如使得相鄰兩個(gè)數(shù)據(jù)之差為1)。在Linux應(yīng)用程序中增加數(shù)據(jù)檢查功能,通過檢查采集數(shù)據(jù)是否滿足數(shù)據(jù)產(chǎn)生規(guī)則,判斷設(shè)計(jì)是否正確。經(jīng)過驗(yàn)證,本文PCI采集卡軟硬件設(shè)計(jì)正確。
實(shí)驗(yàn)2:采用多通道信號發(fā)生器產(chǎn)生隨機(jī)模擬信號,向PCI采集卡提供真實(shí)的模擬輸入(此時(shí)A/D轉(zhuǎn)換邏輯參與實(shí)驗(yàn))。為了檢驗(yàn)PCI采集卡的效率,性能驗(yàn)證包括兩部分:①以采集固定量的內(nèi)存數(shù)據(jù)為目標(biāo),通過配置不同的FIFO寫入時(shí)鐘頻率(通過時(shí)鐘模塊分頻得到,也是數(shù)據(jù)采集模塊的采樣時(shí)鐘),比較應(yīng)用程序多次運(yùn)行的數(shù)據(jù)采集性能;②分別固定FIFO寫入時(shí)鐘頻率,以采集不同量的內(nèi)存數(shù)據(jù)為目標(biāo),分別比較應(yīng)用程序的數(shù)據(jù)采集性能。試驗(yàn)結(jié)果如圖4所示。運(yùn)行平臺為:中標(biāo)麒麟64位操作系統(tǒng)(V3.2.2)、Intel酷睿I5處理器四核、主頻(3.2 GHz)、內(nèi)存4 GByte。
圖4 PCI采集卡性能驗(yàn)證
由圖4(a)可知,隨著FIFO寫入時(shí)鐘頻率的增大,PCI采集卡性能呈上升趨勢。相比于18MHz,20、24、30、40MHz效率分別提高了約15%、41%、56%、78%。由圖4(b)可知,從縱向角度看,可得出與圖4(a)類似的結(jié)論;從橫向角度看,對于每一時(shí)鐘頻率,隨著采集數(shù)據(jù)量的增多,PCI采集卡效率經(jīng)歷下降階段后趨于平穩(wěn)。當(dāng)FIFO寫入時(shí)鐘頻率為40 MHz時(shí),PCI采集卡性能不小于50.2 MByte/s,可滿足數(shù)據(jù)采集速度要求高的應(yīng)用系統(tǒng)。
在軍事、能源、航天等關(guān)鍵領(lǐng)域,采用國產(chǎn)OS是保證信息安全的基礎(chǔ)。為滿足國產(chǎn)OS對數(shù)據(jù)采集的應(yīng)用需要,提出了一種PCI采集卡的軟硬件設(shè)計(jì)方案,并檢驗(yàn)了方案的正確性及實(shí)際性能,對實(shí)現(xiàn)PCI采集卡向國產(chǎn)OS的集成應(yīng)用具有參考價(jià)值。
[1]王海明,胡金龍,吳麗華.基于PCI總線的高速數(shù)據(jù)采集卡設(shè)計(jì)[J].計(jì)算機(jī)測量與控制,2012,20(12):3393-3396. Wang Haiming,Hu Jinlong,Wu Lihua.Design of hignspeed data acquisition board based on PCI bus[J].Computer Measurement&Control,2012,20(12):3393-3396.
[2]馬濤,鄭鑫.基于PCI數(shù)據(jù)采集卡的高速多通道數(shù)據(jù)采集系統(tǒng)[J].電子技術(shù)應(yīng)用,2015,41(2):75-77. Mao Tao,Zheng Xin.High speed multi-channel data acquisition systembased on PCI data acquisition card[J].Application ofElectronic Technique,2015,41(2):75-77.
[3]中標(biāo)軟件.中標(biāo)麒麟操作系統(tǒng)[EB/OL].[2016-01-18]http: //www.cs2c.com.cn/product/index.php?id=9 Standard Software.NeoKylin domestic operating system [EB/OL].[2016-01-18]http://www.cs2c.com.cn/product/index.php?id=9
[4]冉義兵,魏東,王義.實(shí)時(shí)圖像識別系統(tǒng)PCI驅(qū)動(dòng)程序設(shè)計(jì)與開發(fā)[J].計(jì)算機(jī)工程與設(shè)計(jì),2014,35(9):3337-3340. Ran Yibing,Wei Dong,WangYi.Design and development of PCI driver for real-time recognition systems[J].Computer EngineeringAnd Design,2014,35(9):3337-3340.
Design and Verification of Software and Hardware of PCI Acquisition Card for Domestic OS
Liu Junxia1,Yang Xianwen2
(1.Automatic Command Station,Henan Provincial Military Command,Zhengzhou 450003,China; 2.Information Engineering University,Zhengzhou 450004,China)
To meet the performance requirements of data acquisition in the domestic operating system,after researching the principle of PCI acquisition card,a design of software and hardware for PCI acquisition card based on FPGA and Linux is proposed.The hardware is mainly designed for FPGA control logic,including clock module,data acquisition module,FIFO module and main control module.The software mainly includes the design of application program and Linux driver.Validation results show that the design of hardware and software is correct,and the acquisition speeds of high clock frequency,compared with that of 18MHz clock frequency,are increased by about 15%to 78%, and the speed is not less than 50.2 MByte/s when the clock frequency is 40MHz,,which is suitable for the system with high requirements on the acquisition speed.
Domestic operating system;Linux core;PCI bus;Acquisition card;Field Programmable Gate Array(FPGA);Driver
10.3969/j.issn.1002-2279.2017.02.014
TP274.2
A
1002-2279-(2017)02-0059-05
劉軍霞(1973-),女,河南省滑縣人,高級工程師,主研方向:計(jì)算機(jī)網(wǎng)絡(luò)與信息安全。
2016-07-07