,, , , ,杨艳,,
(1.江苏省特种设备安全监督检验研究院,南京 210036;2.南京航空航天大学 自动化学院,南京 211100)
因超声相控阵检测技术阵列式探头的扫查方式独特,所以其具有诸多常规超声检测所不具备的优点。阵列换能器一般由多个互相独立且线性排列或矩阵式排布的压电晶片组合而成,一个晶片即为一个阵元。所有阵元都可在电子控制的延时激励规则下,独立进行超声波束的发射与接收,以此来实现多通道的灵活配置,形成预期的声束效果。超声相控阵换能器能够模拟多种探头的工作,检测速度快,适用于不规则形状物体的检测,弥补了许多常规超声检测的不足。
在一套完整的超声相控阵检测成像系统中,为了配合探头的工作,还需要发射/接收前端、数据采集、数据处理、人机交互等模块的相互协同。笔者重点研究了便携式超声相控阵检测成像系统,采用FPGA(现场可编程门阵列)和ARM(先进RISC处理机)对系统所需的通信接口进行设计。其中,ARM处理器在控制方面发挥了高功效、低功耗的独特优势;而FPGA器件则在高速数据的采集与处理方面,发挥了强大的作用[1]。
超声相控阵检测成像系统的总体结构框图如图1所示。一次完整的检测包括以下流程:主控模块接收人工设置的检测参数,并根据偏转聚焦法则计算发射时延,计算结果向发射控制电路传递,进而控制超声阵列探头激发相应声束到被检对象;超声波束遇到对象内部缺陷被反射,经由接收电路采集后,进入信号处理模块进行进一步的处理,最后传输至主控模块进行分配存储、显示成像等。
图1 超声相控阵检测成像系统总体结构框图
其中,FPGA选用Altera公司的Cyclone IV系列EP4CE15F17C8N,加以外围电路构成数据处理模块,完成发射前端脉冲延时激励、采集信号串并转换、接收声束延时补偿等工作。主控模块硬件平台选用三星公司的“蜂鸟”处理器S5PV210。该处理器集成了ARM Cotex-A8核心,采用64位内部总线结构,实现了ARM架构V7,内部集成了许多外设。与同类芯片相比,S5PV210功耗低且性能较高,适合应用于医疗设备、通信设备或手持电子设备等领域。
FPGA与ARM通信,主要用于用户检测参数的配置下发,以及检测波束的数据回传。FPGA与ARM存在多种接口方式,如SPI、IIC等串行接口。但串行接口自身的局限性限制了其在实时、大量数据传输中的应用[2]。相比之下,并行接口的总线连接更加稳定与合理,且在所使用的开发板中,CPU与各部分间的通信,由多层次AHB/AXI总线负责,以保证高速数据的交互。因此,采用存储总线的方式,把FPGA芯片EP4CE15F17C8N挂接在S5PV210的总线上,ARM处理器通过存储器指令访问FPGA。
采用FPGA器件内提供的M9K存储器,进行处理后的检测回波数据的中转与传输。系统需要由ARM处理器向FPGA传送配置数据,也需要从FPGA中读取经过其处理的检测回波数据,这不仅是一个方向的数据流通,还需要两个端口才能完成各自数据的交互工作。为了方便两次数据交互使用同一套硬件连接,而无需再开辟新的通路,采用M9K的真双端口模式。
配置M9K为双端口RAM,A口作为FPGA连接的主体,其输出端q_a[ ]与数据端data_a[ ]均需要与FPGA的数据端相连;B口作为ARM处理器连接的主体,其输出端q_b[ ]与数据端data_b[ ]均需要与ARM数据端相连。真双端口模式下,端口A上的写操作与端口B上的读操作时序波形如图2所示,寄存RAM的输出端会将q输出延长一个时钟周期。
图2 M9K真双端口模式时序
S5PV210的外接总线型设备寻址区有6个Bank,每个大小为128 MB,Xm0CSn0~Xm0CSn5分别为其相应的片选信号。外接的总线型设备通过此信号的引出脚,挂接于总线之上,并寻址相应的内存空间。系统选用BANK5。
若地址总线上发送的地址在S5PV210 BANK5的寻址范围之内,则表示此次访问BANK5,相应片选信号Xm0CSn5被拉低,选中该BANK所接的FPGA。S5PV210处理器中的SROM BANK对一个地址读操作,则相应读信号Xm0OEn被自动拉低,该信号与FPGA的读使能信号相连,即可读取FPGA中的数据;对一个地址写操作,则相应写信号Xm0WEn被自动拉低,该信号与FPGA的写使能信号相连,即可向FPGA中写入数据。
设计16位宽数据线,12位宽地址线,并将ARM的数据、地址线连接至FPGA。除上述总线、时钟与片选信号连接之外,加上读写控制信号以及中断信号,则能够使FPGA向ARM发起中断申请并进行数据交互。FPGA与ARM硬件连接原理示意如图3所示。
图3 FPGA与ARM硬件连接原理示意
在检测开始之前,人工设置一系列检测参数,由ARM处理器根据相应的聚焦法则来计算发射电路激励每一个探头阵元所需要的延迟时间,并通过通信总线传输给FPGA,再由FPGA负责后续的脉冲激励等工作;在一轮检测之后,反射回多路超声波束,由前端电路对其进行采集接收,并交由FPGA完成一系列数据处理,得到各路检测回波信号,通过通信总线将其传输至ARM处理器,进而完成更进一步的处理或成像。
系统中的软硬件之间,需要一个连接两者的桥梁,将硬件功能转换为软件设计人员能够直接使用的接口函数。操作系统在嵌入式系统中,处于设备硬件与应用程序之间,能够提供统一编程接口给操作的用户[3]。但对于操作系统来说,硬件设备各不相同,操作系统不可能针对每一个特定参数的设备提供相应的支持。不过相似地,其可以根据某一类设备的共同点,提供该类设备的控制代码,从而不用去考虑不同设备之间的细节与区别,此代码即为驱动程序。
驱动程序将硬件设备的具体结构进行屏蔽,对其进行了一种抽象,使设备在系统中以文件的形式存在。虚拟文件系统(VFS)中,淡化了设备与文件的区别,将所有的硬件操作看成是对普通文件的操作。用户在应用程序的角度看硬件设备,就如同一个普通文件,通过系统调用即可操作设备。
Linux系统中,设备驱动按层次能够分为3个方面:与系统引导的接口、与内核的接口和与设备之间的接口。与系统引导的接口主要针对设备,实现一些必要的初始化;与内核的接口主要是file_operations结构的完善;与设备的接口则通常以ioctl( )函数完成驱动与设备之间的互动。
内核中由module_init( )和module_exit( )两者进行注册与卸载设备驱动程序,这些参数则指定了相应初始化与退出函数的地址,设置为FPGA_init以及FPGA_exit。在初始化函数中,通过register_chrdev( )函数对字符设备驱动进行注册;在退出函数时,通过unregister_chrdev( )函数对字符设备驱动进行卸载。
初始化函数FPGA_init主要对设备进行初始化以及注册,使用函数register_chrdev(MAJOR,DEV-ICE_NAME,&fpga_fops)。其中,字符设备注册函数register_chrdev的MAJOR参数代表主设备号,DEVICE_NAME代表设备驱动名,而&fpga_fops代表驱动的file_operations。创建FPGA的设备入口点于设备目录/dev/fpga下,名为fpga。
file_operations结构体中驱动程序cdev_init设计的主要任务是file_operations结构体的实现,该结构体中的每个成员都与系统调用一一对应,由此实现FPGA和ARM之间的通信。
驱动程序的具体内容根据不同的设备及需求而有所区别,但整体来说,均要实现初始化、打开、写入、读取、关闭等几个基本操作。打开和关闭是一对互相相反的操作,一个将设备打开并添加设备计数,另一个释放设备并减少设备计数。写入与读取也彼此相对,但二者都是在内核及用户空间中传递数据,只是传输的方向相反。
file_operations中包含诸多操作函数,但对于具体的应用,上述几个函数即可实现所需要的驱动与内核之间的交互。
fpga_open( )负责初始化FPGA,并对其进行设备有无错误的相关检测,将其设备使用计数加1,并分辨次设备号。fpga_release( )负责释放设备打开时用到的系统资源,并将FPGA设备的使用计数减1。
fpga_read( )负责读取FPGA中的数据,该函数有返回值,读取操作的成功与否表现在函数返回值为读取字节数还是负值。fpga_write( )负责向FPGA中写入数据,该函数同样有返回值,根据返回值为写入字节数还是EINVAL返回值来判断写入操作的成功与否。
fpga_mmap( )负责地址映射,因为用户空间无法直接访问设备,该函数为二者提供了一条相互联系的途径,将FPGA内存线性映射至用户进程中的地址空间,最终的物理地址映射由remap_page_range( )函数的调用实现。fpga_ioctl( )负责读写命令之外的设备操作,返回非负值时说明执行成功。
ioctl( )函数是驱动与设备接口实现的一个方式,主要对设备I/O进行管理并设置相应的中断。事实上,内核及用户空间也无法直接联系,需要通过copy_from_user( )和copy_to_user( )函数来完成。但这种方式效率不高,不如直接映射快,即内核可访问物理地址到用户空间的映射。
设备驱动中,该方式相比标准I/O,对于大文件的处理速度更快,读写操作均不用再经过内核到用户空间的中间复制过程。根据Linux虚拟内存管理,将物理地址映射至虚拟空间,可对该段地址执行读写操作。通过内存映射,实现用户空间对设备FPGA的访问[4]。
使用函数request_mem_region( ),在访问之前检验内存资源申请的情况,若成功,则该资源被标记并无法再被其他驱动申请。在驱动程序初始化阶段,由函数ioremap( )负责映射FPGA物理地址到内核中的虚拟空间,而后在驱动程序调用时,函数remap_page_range( )真正将映射执行至用户虚拟空间。操作完成后,通过函数iounmap( )及release_mem_region( )来实现与前述过程相对的操作,释放申请的虚拟地址并归还内存资源。图4为内存映射流程。
图4 内存映射流程
将探头放置于试块表面,令系统工作并接收回传的16路超声数据(见图5)。该16路信号经过系统前端的处理,已进行过延时补偿,可以看出信号在幅值波动处对齐。由图5可知,单一通道回波信号的幅值较小,不易观察,这也是相控阵超声检测需要进行波束合成的原因之一。多路信号延时叠加后,同相增强,反相相消。
图5 16路回波数据波形
采用基于FPGA+ARM的形式,结合二者优势,搭建了超声相控阵检测成像系统,设计了FPGA与ARM之间的通信接口。在FPGA中配置双口RAM进行数据的中转与传输,在Linux操作系统下编写驱动程序,以完成软硬件之间的交互。经测试,系统运行与接口工作正常,检测结果能够有效显示。