隨著計算機技術(shù)與現(xiàn)代工業(yè)系統(tǒng)的發(fā)展,工業(yè)領(lǐng)域中對數(shù)據(jù)采集的精度和數(shù)據(jù)處理的實時性提出了更加苛刻的要求,以保證后續(xù)更加復雜的控制,而傳統(tǒng)的數(shù)據(jù)采集系統(tǒng)一般采用A/D 芯片與主控芯片搭配的方法,處理速度慢、功能單一,當被測對象復雜且數(shù)據(jù)量較大時,很難滿足對數(shù)據(jù)高精度的采樣,而通過RS232 串口與上位機通信則更無法保證數(shù)據(jù)處理的實時性。針對這一實際情況,設(shè)計了基于FPGA 與ARM 搭配的數(shù)據(jù)采集系統(tǒng),F(xiàn)PGA 負責保證數(shù)據(jù)采樣的高精度和高速度,而ARM 作為主控芯片,嵌入Linux 內(nèi)核,負責控制整個系統(tǒng),并將數(shù)據(jù)通過USB高速上傳到上位機中,借助上位機的強大運算能力,保證數(shù)據(jù)處理的實時性,同時根據(jù)不同的被測信號只需選擇相應(yīng)的數(shù)據(jù)采集卡,即可方便簡單地組成一個用戶自定義的數(shù)據(jù)采集系統(tǒng),具備良好的通用性。
1 系統(tǒng)總體設(shè)計
數(shù)據(jù)采集系統(tǒng)的總體結(jié)構(gòu)如圖1 所示,主要由輸入調(diào)理電路、A/D 轉(zhuǎn)換電路、FPGA 和ARM控制電路組成。被采集的模擬信號經(jīng)由調(diào)理電路輸入到A/D 轉(zhuǎn)換芯片,進行模數(shù)轉(zhuǎn)換,在FPGA的控制下送入到FPGA 內(nèi)嵌的FIFO 存儲模塊中并通知ARM 立即取走數(shù)據(jù),最后通過USB 交由上位機進行實時處理。
2 FPGA 系統(tǒng)設(shè)計
FPGA 具有高集成度、高可靠性、低功耗及時序控制精確等優(yōu)點,選用Xilinx Spartan3 系列的XC3S200 負責控制A/D 轉(zhuǎn)換及數(shù)據(jù)的緩存,可以簡化電路設(shè)計,縮短開發(fā)周期。ARM 選用Atmel公司的SAM9G45 芯片,工作頻率達400MHz,能夠保證實時高速地控制采集系統(tǒng)和上傳數(shù)據(jù)。
2.1 FPGA 與ADC 的連接與控制
數(shù)據(jù)采集芯片選用ADI 公司的AD7656,是一款六通道16 位逐次逼近型,低功耗,每路通道最大采集速度為250kS /s 的A/D 轉(zhuǎn)換芯片,可實現(xiàn)較高的采樣精度和速率。
FPGA 與AD7656 的連接如圖2 所示,AD7656 的6 個采樣通道被分為3 組,由CONV STA、CONV STB 和CONV STC 3 個信號啟動對應(yīng)的雙通道同步采樣,將該3 個引腳相連即可實現(xiàn)6個輸入通道的同步采樣,同時提供并行和串行接口兩種模式,為了提高數(shù)據(jù)吞吐率,采用16 位( /B 引腳置低) 的并行接口( SER/引腳置低) 模式,以便與FPGA 的16 位數(shù)據(jù)線直接相連傳輸數(shù)據(jù)。
FPGA 中的A/D 控制模塊通過將CONV ST引腳電平拉高,啟動相應(yīng)通道的采樣,采樣過程中BUSY 引腳為高電平,表示正在進行采樣; 當采樣完畢后,AD7656 自動將BUSY 置低; FPGA 中的A/D 控制模塊檢測到BUSY 信號為低后將CS 和RD 信號置低,讀取并保存數(shù)據(jù)到FPGA 內(nèi)部的FIFO 中。FPGA 對AD7656 的控制過程仿真如圖3 所示。
2.2 FPGA 與ARM 的連接
FPGA 與ARM 的連接如圖4 所示,在與ARM的通信中,由于是跨時鐘域通信,為了避免亞穩(wěn)態(tài)、采樣丟失及潛在邏輯錯誤等情況的發(fā)生,采用脈沖邊緣檢測法,對ARM 傳來的控制信號首先進行內(nèi)部時鐘同步再做后續(xù)處理。
FPGA 收到ARM 的RST 命令后控制AD 芯片開始采樣,檢測到BUSY 引腳為低后FPGA 將數(shù)據(jù)取走并緩存到FIFO,然后改變INT 引腳上的電平,向ARM 產(chǎn)生一次中斷; ARM 每判定一次中斷,通過CLRINT 給予FPGA 反饋,F(xiàn)PGA 在CLRINT 有效期內(nèi)將不再產(chǎn)生中斷; ARM 使能NCS 和NRD 信號通過數(shù)據(jù)線D[15: 0]將數(shù)據(jù)完全取走后,清除CLRINT 信號,以使FPGA 可以繼續(xù)向ARM 產(chǎn)生中斷。
FPGA 中斷控制模塊的狀態(tài)轉(zhuǎn)移過程如圖5所示,當BUSY 信號為低并且已將數(shù)據(jù)緩存到FIFO 中后, INT 引腳置位產(chǎn)生中斷,同時啟動一定時器。若在定時期間CLRINT 有效,則認為ARM 正常響應(yīng)了中斷; 若直到定時結(jié)束,CLRINT一直無效,則認為ARM 未能檢測到中斷或不能正常響應(yīng),F(xiàn)PGA 等待一小段時間后再次產(chǎn)生中斷。
3 ARM 系統(tǒng)設(shè)計
ARM 芯片嵌入Linux 3.0.4 版本的內(nèi)核,通過開發(fā)設(shè)備驅(qū)動程序,能夠穩(wěn)定高速地處理FPGA數(shù)據(jù)并通過USB 實時上傳到主機中。
3.1 FPGA 驅(qū)動程序
FPGA 驅(qū)動主要負責控制并讀取FPGA 數(shù)據(jù),并將數(shù)據(jù)緩存到KFIFO 等結(jié)構(gòu)中工作:
a.管理RST 信號線,控制FPGA 進行采樣。
b.根據(jù)硬件電路調(diào)用為FPGA 申請指定區(qū)域內(nèi)存,由于芯片帶有MMU 單元,不能直接訪問申請的物理內(nèi)存,需要將申請到的內(nèi)存區(qū)重新映射到虛擬地址。當對該內(nèi)存區(qū)進行讀訪問時,NCS 與NRD 信號會由內(nèi)核負責置為低有效。
c.為INT 信號申請中斷線,注冊中斷處理例程。中斷發(fā)生后,將CLRINT 置高有效,從映射的虛擬地址讀取數(shù)據(jù)并保存在KFIFO 中。
d.重新使能中斷線,等待下次中斷。
KFIFO 是由Linux 內(nèi)核提供的先進先出隊列,能夠快速穩(wěn)定地緩存數(shù)據(jù)。FPGA 驅(qū)動程序?qū)FIFO 符號導出,以使USB 驅(qū)動程序也可以直接訪問然后將其上傳到主機中。
3.2 USB 驅(qū)動程序
Linux 內(nèi)核為USB 設(shè)備側(cè)驅(qū)動提供了USB Gadget 框架,提供了良好的上層接口,隱藏了底層USB 規(guī)范的具體實現(xiàn)。設(shè)備側(cè)的USB 驅(qū)動程序需要提供一個讀端點0x01,讀取上位機的控制信息; 寫端點0x82,向上位機報告當前采集系統(tǒng)的狀態(tài); 寫端點0x83 將采集數(shù)據(jù)上傳到上位機中。主要實現(xiàn)過程如下:
a.配置3 個USB 端點描述符( 一個讀端點0x01,兩個寫端點0x82 和0x83) 。
b.從0x01 端點接收到上位機的采樣命令后,進行初始化工作,通知FPGA 開始采樣。
c.為request 結(jié)構(gòu)分配內(nèi)存,將KFIFO 緩沖區(qū)的采樣數(shù)據(jù)拷貝到request 包中。request 結(jié)構(gòu)類似于Windows 下的URB( USB Request Block)請求包。
d.向0x83 端點提交寫請求,將request 包中的數(shù)據(jù)通過USB 上傳到主機中。
e.如果采樣過程中發(fā)生錯誤,如緩沖區(qū)溢出等情況,通過0x82 端口向上位機匯報,請求重啟。
上位機USB 驅(qū)動程序使用Driver Studio 工具,以Visual Studio 2010 作為輔助開發(fā)環(huán)境。上位機只需與數(shù)據(jù)采集設(shè)備配置同樣的USB 端點,通過0x01 端口向ARM 發(fā)送控制命令,從0x82 端口讀取采集系統(tǒng)的狀態(tài)信息,將從0x83 端口接收到的數(shù)據(jù)緩存后待上層數(shù)據(jù)處理程序讀取。
4 系統(tǒng)總體流程與試驗
采集系統(tǒng)的工作流程如圖6 所示,系統(tǒng)上電后ARM 引導Linux 啟動,初始化內(nèi)部寄存器及板卡上的RAM,向內(nèi)核裝載USB 驅(qū)動及FPGA 驅(qū)動,初始化FPGA 和配置AD7656 工作模式。初始化完畢并接收到主機采樣命令后,A/D 開始進行采樣,系統(tǒng)進入等待數(shù)據(jù)狀態(tài); 采樣結(jié)束后拉低BUSY 引腳觸發(fā)FPGA 通知ARM 來讀取數(shù)據(jù)。ARM將FPGA傳來的數(shù)據(jù)及系統(tǒng)狀態(tài)信息通過USB 迅速上傳到上位機中,上位機根據(jù)具體應(yīng)用進行數(shù)據(jù)處理等操作,完成一次采集工作。
采集系統(tǒng)在實際試驗中,AD7656 每次完成6通道的采集轉(zhuǎn)換需3μs,F(xiàn)PGA 實際工作時鐘頻率為40MHz,ARM 的主時鐘頻率( MCK ) 為133MHz,因此數(shù)據(jù)從FPGA 上傳到主機所需時間小于1μs,即4μs 內(nèi)就可以完成一次采樣,滿足系統(tǒng)每周期采樣256 次的需求。對50Hz 交流電信號每個周期采樣128 個點,采樣結(jié)果如圖7 所示。
5 結(jié)束語
采用FPGA + ARM 芯片組合的數(shù)據(jù)采集系統(tǒng),F(xiàn)PGA 負責采樣控制,ARM 負責整個系統(tǒng)的邏輯控制,通過USB 總線上傳到上位機處理。整個系統(tǒng)采樣精度高,數(shù)據(jù)傳送快,能夠滿足現(xiàn)代工業(yè)系統(tǒng)中對多通路、高精度、高速度、實時處理和易操控的復雜需求,同時借助Linux 內(nèi)核,針對不同領(lǐng)域不同應(yīng)用,可輕松進行二次開發(fā),將有廣闊的應(yīng)用前景。