文献标识码:A
文章编号: 0258-7998(2015)02-0042-03
0 引言
随着图像传感器的快速发展,成像质量和图像帧率得到快速提升,高分辨率的图像给人们的生活带来了极大的便利。但与此同时,快速、实时的传输图像数据成了难题。传统的显微镜系统主要使用人工操作,对操作人员的经验和知识量要求比较高,并且存在很多不定因素。采用自动对焦则大大解决了以上问题,目前国内外显微镜自动对焦在算法上都比较成熟,但图像的分辨率并不是很高[1]。而提高图像分辨率不仅提高了自动对焦的精准度,并且可以采集到样品更多的细节,给研究者提供更多的信息。鉴于以往显微镜图像采集系统的不足,针对高分辨率图像的数据采集,本文选择了基于PCI Express(PCIe)总线的图像采集系统实现显微镜图像的采集。
目前计算机使用最为广泛的PCI总线接口最高工作频率能达到66 MHz,峰值带宽理论上可以达到532 MB/s,但这种并行总线的传输速度和带宽已逐渐满足不了高速传输的要求。相比传统的PCI总线,21世纪初提出的高速差分总线PCIe采用点对点串行连接、全双工的传输方式大大提升了传输速度和带宽。本文实现的1.0版本x4规格通道理论带宽可达到2 GB/s,比USB3.0快,更是千兆以太网传输速度的8倍。
1 系统总体设计
设计的整体结构如图1所示,系统给PCIe采集系统提供5 V电源,FPGA正常工作后开始执行芯片的固化程序。首先通过IIC对CMOS传感器进行初始化,CMOS传感器开始拍摄细胞的图像,同时通过Cameralink接口将图像数据送至系统数据缓存。FPGA将接收到的4对差分数据解析得到图像数据,接着以链式DMA传输方式将数据直接送至IP硬核,然后将数据打包送至上位机,上位机通过应用软件将图像显示并保存。
2 系统硬件设计
2.1 CMOS成像模块
本系统的图像传感器采用Aptina公司生成的MT9-F002I12STCU芯片。FPGA通过IIC协议对CMOS芯片进行初始化,配置相关寄存器。初始化之后,图像尺寸为4 096H×3 072V,每帧图像大小为12 MB,每秒可生成15帧图像。该模块固定在显微镜上,单独为其提供5 V电源,模块内部可转换2.8 V和1.8 V电压为传感器供电。CMOS传感器的初始化程序以及图像数据都是通过Cameralink传输。
2.2 PCIe总线接口
PCIe总线采用串行连接的方式,并使用数据包进行数据传输。数据报文首先在设备的核心层中产生,然后再经过设备的事务层、数据链路层和物理层,最终发送出去,接收端的数据也需要通过物理层、物理链路层和事务层,并最终到达核心层。目前主流的PCIe总线接口方法有两种,方法1:用PEX8311芯片,该方法实现了物理层、数据链路层和事务层的控制逻辑,简单易实现,但是缺乏灵活性和可配置性[2]。方法2:利用FPGA芯片内部集成IP硬核,IP硬核完成了物理层和数据链路层的协议,用户需自行设计PCIe的应用层协议和TLP,开发难度较大,但可以根据需求合理配置[3]。本系统采用方法2,选用Altera公司的EP4CGX30CF23C8芯片,该芯片内部集成了IP硬核模块,可以实现x4通道的PCIe接口。
3 系统软件设计
3.1 链式DMA传输设计
图像数据传输采用DMA技术保证其实时性[4],利用链式DMA技术提高DMA执行效率并配合SGDMA技术解决计算机离散物理页的DMA传输问题[5]。链式DMA区别于普通DMA的最大特点就是可以一次执行多次DMA,因此执行效率非常高,非常适合于上位机上物理分页地址不连续的DMA数据传输。本系统中仅用到DMA写模块,数据由FPGA流向计算机。具体实现的方法是:在主机端开辟一块内存区域,用来存储描述符表。描述符表是用来描述在主机与外设之间数据传输有关的地址与长度信息的,它由一个表头和多个描述符组成。数据传输前,用户将控制参数、端点地址、内存物理地址写入并启功传输。链式DMA控制器会及时从内存中读取描述符表来指挥DMA的传输过程。
3.2 驱动程序设计
驱动程序采用Jungo公司开发的Windriver软件,并利用其特有的KernelPlugln(KP)技术实现高效的中断数据采集服务。主要依靠3个函数:KP_IntAtIrqt、KP_IntAtDpc、KP_Call。
KP_IntAtIrqt:高优先级中断服务程序,硬件中断产生时,该函数被调用。当返回值大于零时继续调用KP_IntAtDpc。本项目中,数据采集的全部工作都在该函数里面完成。当一幅图像采集完成后返回1以便继续调用IntAtDpc低优先级中断。
KP_IntAtDpc:低优先级中断服务程序,KP_IntAtIrqt返回值大于零时被调用,本项目中不做任何处理,返回值永远大于零以调用用户模式下的中断服务程序。
KP_Call:主要用于用户模式与KP通信,本项目中用来传递数据缓冲区以及描述符表的地址,需要注意的是用户应用程序与KP驱动程序拥有不同的虚拟地址系统,因此应用程序的地址在驱动程序里不能直接使用,需要经过地址转换才能使用。
图2是中断数据采集的流程图。为提高数据采集效率,采用两片缓冲区交替缓冲机制,应用程序首先申请两片数据缓冲区,并且对其初始化。然后通过KP_Call函数将缓冲区的地址及其页表信息等传入驱动程序内核模式下的KernelPlugln,用于链式DMA描述符表的更新。图像采集卡每采集到3行图像数据发送一次中断,中断服务程序立刻响应中断。首先读取BAR2空间偏移地址0x40处的32 bit状态寄存器,根据其值判断当前数据位于图像的奇数行或偶数行。中断程序维护两个链式DMA描述符表,然后根据状态寄存器的值判断启动对应的链式DMA以及更新下次将要使用的链式DMA描述符表,图像采集卡将根据描述符表将数据写入相应数据缓冲区的对应地址。最后,再次根据状态寄存器的值判断一幅图像是否采集完成,若完成则通知应用程序并继续等待下一次中断,否则直接等待下一次中断。
4 实验结果分析
采集图像之前先通过Altera公司设计的PCIe测速软件在1小时内对采集系统进行了6次测试,测试得到的结果如表1所示。
由表1的测试结果可以看出,DMA写的速度已经达到理论带宽的80%以上,DMA读的速度大约为580 MB/s。经过分析,测试速度较理论速度偏低大致有以下3个原因:(1)DMA读取为非转发事务,所以读的速度比写的要慢;(2)中断响应和配置DMA寄存器延时造成速度降低;(3)计算机本身硬件条件导致传输速度偏低。相比于成像模块每秒产生15帧12 MB的图像,采集系统能够很好地完成实时采集成像模块生成的图像。
将采集系统应用于显微镜自动对焦图像采集,经过长时间的采集测试,未出现丢帧现象,采集系统正常工作。图3是采集的未经解码的原始图像数据。图4是通过快速插值解码之后的彩色的图像。两幅图中的黑点是镜头未清洁干净导致。实验结果表明,本系统能够很好地采集显微镜自动对焦成像模块生成的高分辨率图像,性能稳定,适用于大数据量的实时快速采集。
5 结束语
本文详细介绍了基于PCI Express的图像采集系统,为大数据量的实时快速传输提供了有效的方案。并通过测试证明了该系统能很好地应用于显微镜自动对焦成像模块的图像采集,实现了高分辨率图像的实时显示。相对于热门的USB3.0以及千兆以太网,本设计在传输速度上有明显的优势,并且当传输速度有更高的要求时,还可以将x4通道扩展成x8或x16通道,得到更高的传输速度。
参考文献
[1] 张磊.显微镜用数码相机硬件结构及其视频流算法实现与应用[D].杭州:浙江大学,2011.
[2] 安骏.基于桥接芯片PEX8111的PCIE总线接口设计[J].科技资讯,2010(3):23-24.
[3] 沈辉,张萍.FPGA在PCI Express总线接口中的应用[J].计算机应用技术,2010,33(14):109-111.
[4] 李木国,黄影,刘于之.基于PCIe总线的高速数据采集卡设计与实现[J].测控技术,2013,32(7):19-22.
[5] 黄世中,金志刚.利用WinDriver实现链式DMA[J].电子设计工程,2013,21(8):6-9.