基于FPGA和ARM的实时数据采集显示系统
2014-03-05李长星王波胡振华
李长星+王波+胡振华
摘 要: 针对同时满足高速的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采集、高速率的数据传输和实时显示的应用场合。基于FPGA+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.