李長星+王波+胡振華
摘 要: 針對同時滿足高速的A/D采集、高速率的數據傳輸和實時顯示且便于攜帶實際應用需要,研究設計了基于FPGA+ARM的實時數據采集的嵌入式平臺。采用FPGA控制A/D完成高速數據采集,通過串口總線實現了平臺內部FPGA和ARM之間指令的下達和數據的上傳,最終實現在ARM上通過Qt應用程序對A/D采集的數據進行實時顯示。
關鍵詞: FPGA; ARM; 嵌入式Linux; 串口通信; Qt
中圖分類號: TN911?34 文獻標識碼: A 文章編號: 1004?373X(2014)03?0151?04
Display system for real?time data acquisition based on FPGA and ARM
LI Chang?xing, WANG Bo, HU Zhen?hua
(Xian Shiyou University, Xian 710065, China)
Abstract: Aiming at meeting the actual application needs of the high?speed AD sampling, high rate data transmission and real?time display and portable, a real?time data acquisition based on FPGA+ARM embedded platform is researched and designed, which uses FPGA controlled AD to realize high speed data acquisition, the internal instruction issued and data upload between FPGA and ARM is achieved by serial bus. Finally the real?time display of the data collected by AD is realized on the ARM by Qt application.
Keywords: FPGA; ARM; embedded Linux; serial port communication; Qt
0 引 言
目前,伴隨著FPGA技術和嵌入式技術的進步, 測量儀器也有著長足的發展。FPGA和ARM處理器憑借著在資源豐富、執行速率快、重量輕、體積小、可靠性高等優勢,非常適合必須同時滿足高速的A/D采集、高速率的數據傳輸和實時顯示的應用場合?;贔PGA+ARM的實時數據采集的嵌入式平臺,很好地解決了傳統測量儀器采集速率低、體積龐大、實時性不足的缺點[1]。
本文基于Altera公司的Cyclone系列EP1C3T144C8N的FPGA器件和ARM920T的處理器S3C2440A搭建了數據采集的架構平臺。FPGA采用Altera公司的Cyclone系列的EP1C3T144C8,EP1C3T144 提供2 910個邏輯單元(LES),13 個128×36位的M4K RAM模塊,1個鎖相環以及104個I/O口。S3C2440A是Samsung公司為普通應用和手持設備研發的一款高性能低功耗的微小型芯片,其內部搭載了由ARM公司設計的16/32 位ARM920T 的RISC 處理器,這也是該款芯片的主要特點[2?3]。本文Linux下的應用程序GUI的設計采用Qt來進行。Qt是一個C++圖形用戶界面應用程序框架[4],由Nokia公司所開發。其優點在于能夠跨多平臺使用、豐富的應用程序編程接口 (API)、面向對象的操作、大量的開發文檔等。Qt/E即Qt/Embeded,是Qt的嵌入式版本。
1 系統結構
系統結構框圖如圖1所示,由ARM發送開始采集的命令,通過串口下達給FPGA的串口接收模塊,經過對命令進行解析,通過A/D控制模塊控制A/D芯片開始數據采集,然后將采集到的數據存入FPGA內部的串口發送的FIFO進行數據緩沖,最后通過FPGA的串口發送模塊將數據再傳送給ARM。A/D芯片采用Analog Device公司的AD7899,是一款快速、低功耗、14位400 KSPS模數轉換器(ADC)。
圖1 系統結構框圖
FPGA中數據采集控制部分的RTL級視圖如圖2所示,將其A/D的低8位作為數據輸出,在FPGA的控制下鎖存之后通過db7_i[7:0]存儲到FPGA中的FIFO,當串口發送模塊經過對FIFO的空滿信號進行判斷,在FIFO非空的情況下啟動tx_start信號,以一定的波特率將數據發送到ARM上進行實時顯示 [5]。
圖2 FPGA中數據采集控制部分的RTL級視圖
通過Modelsim仿真結果如圖3所示,可以看到,在串口發送端口的數據tx_data與A/D所采集到的數據db7_i[7:0]一致。
圖3 Modelsim仿真結果
2 FPGA與ARM的串口通信
要完成FPGA與ARM的串口通信,完成命令的下達和數據的上傳及數據的顯示就必須完成兩點:FPGA的串口與ARM上的Linux操作系統的通信;Linux操作系統與Qt應用程序的通信。
2.1 Linux串口驅動程序
Linux操作系統是無法直接和外圍串口進行數據通信的。因此,串口驅動程序就成為操作系統內核和串口之間的橋梁,它屏蔽的底層串口信息并將其在操作系統內核中抽象為設備文件的形式。串口驅動程序的主要作用歸納為:
(1)初始化和釋放串口;
(2) 將數據從內核空間中傳給串口和將串口讀取數據傳遞到內核;
(3) 讀取來自Qt應用程序傳給設備文件的數據;
(4) 返回Qt應用程序請求的數據。
串口驅動程序結構 如圖4所示,主要由終端設備層、行規程層、串口抽象層和串口芯片層這4層組成。終端設備層的作用是提供一致的訪問接口供內核調用,使得內核在操作串口時不必考慮具體終端的類型。行規程層用來是設置數據交換的規則,比如處理輸入數據變換、流控等。底層串口驅動的核心部分是串口抽象層,它的作用是將總結出各類串口共性,比如根據串口芯片層所提供的串口波特率、地址識別抽口類型等。串口芯片層也屬于底層串口驅動,它與具體芯片有關且直接控制硬件,它的作用是設置串口芯片的工作的相關寄存器并向上層提供比如中斷號、訪問地址的芯片資源[6]。
2.2 第三方串口控制類Qextserialport類
由于終端設備層向上提供統一的訪問接口,這樣Qt應用程序就可以通過這樣的訪問接口進行打開、讀寫或者是控制(open、read、write、ioctl等)來方便地對硬件進行操作。在本設計中采用第三方為Qt編寫的擴展類Qextserialport,它繼承自QIODevice類,Qextserialport與QIODevice的關系圖,如圖5所示。
圖4 串口驅動程序結構
圖5 Qextserialport與QIODevice的關系圖
Qextserialport類有兩種工作模式,分別為查詢方式Polling和事件驅動方式EventDriven。Qt在調用 Qextserialport類定義串口的時候,可以進行選擇。
查詢方式Polling是一種讀寫函數同步運行的工作模式,該模式的好處是系統開銷較小但是功能上相對單一。
事件驅動方式EventDriven則不同,分析源代碼可以看到有這樣一個監測串口事件函數(monitorCommEvent),其作用是一旦有數據到來就會發出事件信號,從而讀信號立即響應讀取串口的數據。在此方式下,讀寫串口操作屬于異步操作,當調用讀寫函數時會立即返回函數值且期間調用線程不會被凍結。
在Linux下只支持Polling模式,需要建立定時器來讀取串口的數據[7?8]。
3 實時曲線顯示功能的實現
3.1 Qt/E圖形顯示的體系架構
完成了數據的通信之后,下一步就是要完成如何將接收到的數據進行顯示的問題,這樣就涉及到Qt/E圖形顯示的體系架構。
Qt/E圖形顯示的體系架構如圖6所示,由3層組成:
(1) 圖形引擎及事件驅動層:在此層當中,輸入設備驅動產生事件,調用和直接訪問Linux操作系統的framebuffer(幀緩沖)中的數據內容。
(2) 上層圖形層:在此層當中向上提供了圖形的抽象供用戶使用,向下抽象出了具體操作接口供顯示設備使用。
(3) 上層控件層:在此層當中,用戶通過Qwidget類完成操作界面的設計[9]。
圖6 Qt/E總體架構
3.2 人機交互界面的設計
本設計采用觸摸屏作為人機交互的的硬件設備,通過Qt編寫GUI(圖形用戶界面)在觸摸屏上顯示,用戶可以通過觸碰觸摸屏實現人機交互。Qt編寫GUI如圖7所示,該GUI界面主要包括:串口參數設置、實時數據顯示區域和用戶控制按鍵。其中串口參數設置參數包括串口編號、波特率、數據位、校驗位、停止位。用戶控制按鍵部分包括open(打開串口)、help(在線幫助文檔)、start(開始采集數據并繪制波形)、quit(退出)。
圖7 GUI分布圖
3.3 繪制實時曲線的步驟
在Qt的內部通信機制中,處于核心地位的是信號和槽機制,它完成的是對象與對象之間的通信。這種機制也是Qt區別于其他GUI工具的主要特點,運用這種通信機制可以避免其他GUI工具中在執行每種行為后所需的回調函數,在完成繁雜的函數指針相同功能的同時且不致系統崩潰的危險。該機制是通過一個對象發出信號,另一個對象通過槽函數予以響應,之間通過connect函數加以連接[10] 。在本設計中,首先采用信號和槽機制對串口定時的訪問。
在Qwidget.cpp文件中代碼如下:
void MyImgTest::read()
{ myscene->cData= m_pCom->readAll()
myscene->drawWave(); }
connect(m_pTimer1,SIGNAL(timeout()),this,SLOT(read()));
其次設置畫筆的相關參數。
在SahuWaveScene.cpp中代碼如下:
m_waveDataPen.setStyle(Qt::SolidLine); //設置實線畫線
m_waveDataPen.setColor(Qt::red); //設置紅色畫筆
m_waveDataPen.setWidthF(1); //設置線寬為一個像素
最后,完成曲線繪制的功能。以QGraphicsScene作為顯示區域的父對象,在QGraphicsItems類下的定義QList鏈表來存儲曲線的各個點的[y]坐標數據,其QList值類型為T。借助 QList的push_back功能(類似于附加的方式),將每次通過串口收到的數據附加到列表的末尾,再通過上一步定義好的畫筆addLine添加上連線。由于QList屬于一種鏈表,所以通過這樣的方式可以實現曲線的描繪不會出現丟失數據的情況。
在SahuWaveScene.cpp中代碼如下:
QList
//定義QList列表,存儲[y]值
m_waveList.push_back((QGraphicsItem*)this->addLine(QLineF(p1,p2),m_waveDataPen;
最終實時曲線顯示效果如圖8所示。
圖8 實時曲線顯示效果圖
3.4 完成數據的保存
QTextStream類,它提供了使用QIODevice讀寫文本的基本功能并且支持如源代碼、超文本標記語言、可擴展標示語言等其他文本格式的文件。本設計中,繪制曲線的同時將坐標數據寫入date.txt文檔,然后將該文件復制到目標文件[9]。
具體代碼如下:
QFile file( "date.txt" );
//定義了一個名date.txt為QFile文件
QDir::setCurrent( "/opt" ); //設置文件的存放路徑
file.open(QIODevice::Append);
//設置以追加方式打開寫入文件
if ( file.open(QFile::Append) )
{QTextStream stream(&myscene->cData);
//文件流QTextStream將坐標數據寫入文件
if(myscene->cData.count()==256)
stream << "\n";}
file.close();
4 結 論
本方案通過FPGA+ARM的實時數據采集的嵌入式的硬件平臺和輔以Qt下的串口通信傳輸、QGraphicsScene類和QList類實時曲線描繪的軟件平臺共同完成了該數據采集與顯示系統,經過試驗證明該系統很好地滿足了采集數據的快速性、數據傳輸的穩定性、曲線繪制的實時性且已成功應用于手持便攜式礦物探測領域,而且其速度快、體積小、重量輕、資源豐富、可靠性高等優點對于數據檢測、高速數據的采集等領域也有著非常廣闊的應用前景。
參考文獻
[1] 朱曉鵬.ARM+FPGA的實時數據采集系統設計[J].計算機工程與設計,2009,30(13):3088?3090.
[2] 三星公司.S3C2440A (Revision 1)數據手冊[M].韓國:三星公司,2004.
[3] 程燕勝.基于ARM+FPGA 的微陀螺儀數據采集處理系統設計[J].傳感器與微系統,2013,32(8):75?77.
[4] 譚浩強.C++程序設計[M].3版.北京:清華大學出版社,2006.
[5] 夏宇聞.Verilog數字系統設計教程[M].2版.北京:北京航空航天大學出版社,2008.
[6] 韋東山.嵌入式Linux應用開發完全手冊[M].北京:人民郵電出版社,2008.
[7] 任韜.Qt跨平臺數字化壓力測量分析監控系統的設計與實現[J].電子設計工程,2012,20(9):181?183.
[8]孟繁磊.基于Linux和Qt的串口通信調試器調的設計及應用[J].科技創新導報,2011(32):24?25.
[9] 狄輝輝.基于Qt/E的嵌入式實時曲線顯示界面設計與實現[J].電子測量技術,2011,34(12):59?61.
[10] [美]索林.24小時學通Qt編程[M].袁鵬飛,譯.北京:人民郵電出版社,2000.
m_waveDataPen.setWidthF(1); //設置線寬為一個像素
最后,完成曲線繪制的功能。以QGraphicsScene作為顯示區域的父對象,在QGraphicsItems類下的定義QList鏈表來存儲曲線的各個點的[y]坐標數據,其QList值類型為T。借助 QList的push_back功能(類似于附加的方式),將每次通過串口收到的數據附加到列表的末尾,再通過上一步定義好的畫筆addLine添加上連線。由于QList屬于一種鏈表,所以通過這樣的方式可以實現曲線的描繪不會出現丟失數據的情況。
在SahuWaveScene.cpp中代碼如下:
QList
//定義QList列表,存儲[y]值
m_waveList.push_back((QGraphicsItem*)this->addLine(QLineF(p1,p2),m_waveDataPen;
最終實時曲線顯示效果如圖8所示。
圖8 實時曲線顯示效果圖
3.4 完成數據的保存
QTextStream類,它提供了使用QIODevice讀寫文本的基本功能并且支持如源代碼、超文本標記語言、可擴展標示語言等其他文本格式的文件。本設計中,繪制曲線的同時將坐標數據寫入date.txt文檔,然后將該文件復制到目標文件[9]。
具體代碼如下:
QFile file( "date.txt" );
//定義了一個名date.txt為QFile文件
QDir::setCurrent( "/opt" ); //設置文件的存放路徑
file.open(QIODevice::Append);
//設置以追加方式打開寫入文件
if ( file.open(QFile::Append) )
{QTextStream stream(&myscene->cData);
//文件流QTextStream將坐標數據寫入文件
if(myscene->cData.count()==256)
stream << "\n";}
file.close();
4 結 論
本方案通過FPGA+ARM的實時數據采集的嵌入式的硬件平臺和輔以Qt下的串口通信傳輸、QGraphicsScene類和QList類實時曲線描繪的軟件平臺共同完成了該數據采集與顯示系統,經過試驗證明該系統很好地滿足了采集數據的快速性、數據傳輸的穩定性、曲線繪制的實時性且已成功應用于手持便攜式礦物探測領域,而且其速度快、體積小、重量輕、資源豐富、可靠性高等優點對于數據檢測、高速數據的采集等領域也有著非常廣闊的應用前景。
參考文獻
[1] 朱曉鵬.ARM+FPGA的實時數據采集系統設計[J].計算機工程與設計,2009,30(13):3088?3090.
[2] 三星公司.S3C2440A (Revision 1)數據手冊[M].韓國:三星公司,2004.
[3] 程燕勝.基于ARM+FPGA 的微陀螺儀數據采集處理系統設計[J].傳感器與微系統,2013,32(8):75?77.
[4] 譚浩強.C++程序設計[M].3版.北京:清華大學出版社,2006.
[5] 夏宇聞.Verilog數字系統設計教程[M].2版.北京:北京航空航天大學出版社,2008.
[6] 韋東山.嵌入式Linux應用開發完全手冊[M].北京:人民郵電出版社,2008.
[7] 任韜.Qt跨平臺數字化壓力測量分析監控系統的設計與實現[J].電子設計工程,2012,20(9):181?183.
[8]孟繁磊.基于Linux和Qt的串口通信調試器調的設計及應用[J].科技創新導報,2011(32):24?25.
[9] 狄輝輝.基于Qt/E的嵌入式實時曲線顯示界面設計與實現[J].電子測量技術,2011,34(12):59?61.
[10] [美]索林.24小時學通Qt編程[M].袁鵬飛,譯.北京:人民郵電出版社,2000.
m_waveDataPen.setWidthF(1); //設置線寬為一個像素
最后,完成曲線繪制的功能。以QGraphicsScene作為顯示區域的父對象,在QGraphicsItems類下的定義QList鏈表來存儲曲線的各個點的[y]坐標數據,其QList值類型為T。借助 QList的push_back功能(類似于附加的方式),將每次通過串口收到的數據附加到列表的末尾,再通過上一步定義好的畫筆addLine添加上連線。由于QList屬于一種鏈表,所以通過這樣的方式可以實現曲線的描繪不會出現丟失數據的情況。
在SahuWaveScene.cpp中代碼如下:
QList
//定義QList列表,存儲[y]值
m_waveList.push_back((QGraphicsItem*)this->addLine(QLineF(p1,p2),m_waveDataPen;
最終實時曲線顯示效果如圖8所示。
圖8 實時曲線顯示效果圖
3.4 完成數據的保存
QTextStream類,它提供了使用QIODevice讀寫文本的基本功能并且支持如源代碼、超文本標記語言、可擴展標示語言等其他文本格式的文件。本設計中,繪制曲線的同時將坐標數據寫入date.txt文檔,然后將該文件復制到目標文件[9]。
具體代碼如下:
QFile file( "date.txt" );
//定義了一個名date.txt為QFile文件
QDir::setCurrent( "/opt" ); //設置文件的存放路徑
file.open(QIODevice::Append);
//設置以追加方式打開寫入文件
if ( file.open(QFile::Append) )
{QTextStream stream(&myscene->cData);
//文件流QTextStream將坐標數據寫入文件
if(myscene->cData.count()==256)
stream << "\n";}
file.close();
4 結 論
本方案通過FPGA+ARM的實時數據采集的嵌入式的硬件平臺和輔以Qt下的串口通信傳輸、QGraphicsScene類和QList類實時曲線描繪的軟件平臺共同完成了該數據采集與顯示系統,經過試驗證明該系統很好地滿足了采集數據的快速性、數據傳輸的穩定性、曲線繪制的實時性且已成功應用于手持便攜式礦物探測領域,而且其速度快、體積小、重量輕、資源豐富、可靠性高等優點對于數據檢測、高速數據的采集等領域也有著非常廣闊的應用前景。
參考文獻
[1] 朱曉鵬.ARM+FPGA的實時數據采集系統設計[J].計算機工程與設計,2009,30(13):3088?3090.
[2] 三星公司.S3C2440A (Revision 1)數據手冊[M].韓國:三星公司,2004.
[3] 程燕勝.基于ARM+FPGA 的微陀螺儀數據采集處理系統設計[J].傳感器與微系統,2013,32(8):75?77.
[4] 譚浩強.C++程序設計[M].3版.北京:清華大學出版社,2006.
[5] 夏宇聞.Verilog數字系統設計教程[M].2版.北京:北京航空航天大學出版社,2008.
[6] 韋東山.嵌入式Linux應用開發完全手冊[M].北京:人民郵電出版社,2008.
[7] 任韜.Qt跨平臺數字化壓力測量分析監控系統的設計與實現[J].電子設計工程,2012,20(9):181?183.
[8]孟繁磊.基于Linux和Qt的串口通信調試器調的設計及應用[J].科技創新導報,2011(32):24?25.
[9] 狄輝輝.基于Qt/E的嵌入式實時曲線顯示界面設計與實現[J].電子測量技術,2011,34(12):59?61.
[10] [美]索林.24小時學通Qt編程[M].袁鵬飛,譯.北京:人民郵電出版社,2000.