基于FPGA的工业以太网灵活解决方案(基金颁发部门:江苏省自然科学基金委;项目名称:嵌入式无线传感网络在矿区数据采集中的应用研究;编号:BK2006039;基金申请人:王潜平)崔衍王潜平马海波(中国矿业大学计算机科学与技术学院,江苏徐州221008)摘要:随着工业以太网的发展,工业设备制造商们为使自己的产品更具有市场竞争力,都在寻找一种具有高性价比的解决方案。本文提出了使用FPGA传送工业以太网协议的设计方法,这种解决方案的灵活性在于只需用一个电路板就能实现传送不同的工业以太网协议,并且具有开发成本低、使用周期长的特点。本文还介绍了基于FPGA的工业以太网的硬件IP开发的流程以及使用LwIP协议实现其软件IP功能。关键字:工业以太网;FPGA;LwIP中图法分类号:TP311文献标识码:BAFlexibleSolutionWithFPGAforIndustrialEthernetCUIYAN,WANGQIANPING,MAHAIBO(ChinaUniversityofMiningandTechnology,Xuzhou,221008,China)Abstract:WiththedevelopmentofIndustrialEthernet,manyindustrialequipmentmanufacturersmustfindacost-effectivewaytosupportasmanyIndustrialEthernetprotocolsaspossibleinordertocompete.ThispaperputsforwardthedesignofFPGAbasedonIndustrialEthernet.TheflexiblesolutionisthatFPGAdevicestodeliveramulti-standardIndustrialEthernetcapabilityfromasingleprintedcircuitboardimplementation.ThebenefitsoftheFPGA-basedsolutionarecost-effectiveandlonglifetime.ThehardwareIPdevelopmentflowofFPGAbasedonIndustrialEthernetandLwIPprotocolsusedtoimplementsoftwareIParegiven.Keywords:FPGA;IndustrialEthernet;LwIP1引言现在有很多以以太网为基础的工业通信协议,并都有自己的优缺点,其中有些协议是开源的,这让开发者可以设计出自己的协议。这也意味着这些开源的协议在工业上将更加受到欢迎,应用也更加广泛。现在还没有统一的协议,而且协议的发展影响着以太网标准的变化,这就要求能够支持多种协议的设计方法。本文主要提出使用FPGA来尽可能支持较多的工业以太网协议并能支持新协议的加入和系统改进。2基于FPGA的工业以太网解决方案支持多种协议的一般的方法可以通过针对每一种协议都设计一块板卡,在需要时互相替换来实现。但随着市场上标准的增加和发展,则需要设计出一种性价比高而且还能快速支持新协议的解决方法。随着以太网的不断变化,需要开发设计新的电路板,这就会使得成本加大,而且实现的慢。然而,通过使用带有FPGA的工业以太网接口就可以解决以上的问题,使用FPGA昀主要的好处在于它容易重新配置。在任何时候只需要构造一个电路板和能支持任一种工业以太网协议的硬件程序。如果要使用不同的协议或是用户改变执行命令,只需花费几秒钟根据具体需要改写FPGA的配置文件。这种多协议方法大大降低了开发成本,减小编码量[1]。图1FPGA为基础的通道工业以太网系统Fig.1GenericFPGA-Based,2-ChannelIndustrialEthernetSystemFPGA与以太网收发器(通常为PHY)结合使用时,它可以完成所有以太网接口的功能。PHY和电路板中的物理层接口,数据链路层(MAC)硬件功能可由FPGA硬件配置程序来实现;再往上层(3层以上)的功能是由运行在FPGA逻辑电路配置的核心处理器上的软件实现的。FPGA逻辑电路是可编程的,I/O管脚支持多种协议,现有的IP接口应用广泛,所以在现有的应用处理器和FPGA之间很容易实现通信信道。一般现有的处理器接口(如I2C,SPI,其他一些本地并行总线)或系统(PCI,PCIExpress,CANopen等)都可以与FPGA通信。由于FPGA硬件是可编程的,如果想把应用程序封装到FPGA中,那么可以设计含有多个微处理器软核。这样做的好处在于它可以减少组件数量,降低成本和功率消耗。此外,完全基于IP设计易于移植到新设备上,而且FPGA的使用周期长,所以这种设计不会很快被淘汰。对于工业以太网,设计FPGA也可以有hub或可以增强以太网通信的相似的硬件。FPGA不仅可以实现处理器的复杂结构设计,而且可以实现灵活多变的接口设计,比如简单的通信接口(如UARTS,并行I/O等),支持新的存储器的复杂接口(如DRR2/3等)。以及新的通信技术(如Bluetooth,GigabitEthernet,PCIExpress等)构造基于FPGA的硬件设计。3构造基于FPGA的硬件IP设计设计处理器和以太网MAC硬件看起来很难,但实际上,SOPCBuilder提供了处理器和以太网MAC的IP核,这就变得简单多了。Altera’sQuartusⅡ的开发环境包含SOPCBuilder[2],SOPCBuilder能快速并自动配置、集成和生成基于IP的系统。GUI的截图(图2)中左边列表显示了可用的IP核。若想在现使用的系统中加入IP核,设计者只需双击所需的IP模块。选定IP模块后,会出现配置信息,可以选择相应的选项(图2右边)。完成这些后,配置好的IP功能块就会出现在当前系统设计中,如图窗口的右边。该部件的地址和中断级别可以改变,可通过GUI修改系统内的互联结构来改变IP部件间的连接。处理器能够快速设计模块和高度优化系统(如图3)。图中窗口下面显示设计的出错信息,因而开发者可以很容易的查错纠错。系统设计好后,设计人员点击“generate”后即生成所要求的系统。该系统生成后,可作为QuartusⅡ原理图设计编辑器的一个功能模块。如果以后需要修改设计,设计人员只需打开SOPCBuilder使用GUI来修改,再重新生成系统,然后用QuartusⅡ软件重新组合,就生成了新的配置文件,这样在很短的时间内生成了一个新的工业以太网协议的硬件设计。图2SOPCBuilder的截图Fig.2ScreenShotoftheSOPCBuilderTool选择配置连接图3使用SOPC选择、配置、整合IP硬件Fig.3Selecting,Configuring,andIntegratingHardwareIPwithSOPCBuilder4网络协议设计硬件IP通常封装作为SOPCBuilder的一个部件,它包含了MAC和其它的所需的逻辑电路。对于软件IP可在经销商出购买,也可以自己通过移植LwIP协议实现。LwIP是Light-weightInternetProtocol的缩写,即轻量级网络协议。LwIP是瑞典计算机科学院的AdamDunkels等开发的用于嵌入式系统的TCP/IP协议栈[5]。LwIP实现的重点是在保持TCP/IP协议主要功能的基础上减少对RAM的占用[3],一般它只需要几十KByte的RAM和40K左右的ROM就可以运行,在嵌入式系统中应用相当广泛。在使用和移植的过程中可根据传输数据的不同要求进行删减或增补。在设计LwIP时,就要考虑到移植问题,把所有和硬件、编译器相关的部分独立出来[4],放在/src/arch下面。若要移植,只要修改这个目录下的文件即可。(1)与CPU或编译器相关的include文件。在LwIP/src/arch/include/arch目录下,cc.h、cpu.h、perf.h中有一些与CPU或编译器相关的定义,如数据长度、字的高低位顺序等。这应该与用户的操作系统定义的参数一致。通常,C语言的结构体(struct)是4字节对齐的,但是在处理数据包的时候,LwIP是通过结构体中不同数据的长度来读取相应的数据的,所以,一定要在定义struct的时候使用_packed关键字,让编译器放弃struct的字节对齐。LwIP也考虑到了这个问题,所以,在它的结构体定义中有几个PACK_STRUCT_xxx宏,在移植的时候添加编译器所对应的_packed关键字。(2)sys_arch操作系统相关部分。sys_arch.c中的内容是与操作系统相关的一些结构和函数,主要可以分为四个部分:①sys_sem_t信号量。LwIP中需要使用信号量进行通信,所以在sys_arch中应实现信号量结构体和处理函数:structsys_sem_tsys_sem_new()//创建一个信号量结构sys_sem_free()//释放一个信号量结构sys_sem_signal()//发送信号量sys_arch_sem_wait()//请求信号量②sys_mbox_t消息。LwIP使用消息队列来缓冲、传递数据报文,因此要在sys_arch中实现消息队列结构。sys_mbox_t以及相应的操作函数:sys_mbox_new()//创建一个消息队列sys_mbox_free()//释放一个消息队列sys_mbox_post()//向消息队列发送消息sys_arch_mbox_fetch()//从消息队列中获取消息③sys_arch_timeout函数。LwIP中每个与外界网络连接的线程都有自己的timeout属性,即等待超时时间。这个属性表现为每个线程都对应一个sys_timeout结构体队列,它包括这个线程的timeout时间长度,以及超时后应调用的timeout函数,该函数会做一些释放连接、回收资源的工作。Timeout结构体已经在sys.h中定义好了,而且对结构体队列的数据操作也由LwIP负责,我们所要实现的是如下函数:structsys_timeouts*sys_arch_timeouts(void)这个函数的功能是返回目前正处于运行状态的线程所对应的timeout队列指针。Timeout队列属于线程的属性,因此是与操作系统相关的函数。④sys_thread_new创建新线程函数。LwIP可以是单线程运行,即只有一个tcpip线程(tcpip_thread),负责处理所有的TCP或UDP连接,各种网络程序都通过tcpip线程与网络交互。它也可以多线程运行,以提高效率。(3)lib_arch中库函数。LwIP用到8个外部函数,这些函数通常与用户使用的系统或编译器有关。u16_thtons(u16_tn);//16位数据高低字节交换u16_tntons(u16_tn);u32_thtonl(u32_tn);//32位数据大小端对调u32_tntonl(u32_tn);intstrlen(constchar*str);intstmcmp(constchar*str1,constchar*str2,intlen);voidbcopy(constvoid*src,void*dest,intlen);voidbzero(void*data,intn);5测试将修改后的LwIP进行测试,比如移植到μC/OS-II中。先对LwIP进行初始化,再创建TCP或UDP任务,然后就可以测试了,关键部分的代码和说明如下:main(){OSInit();OSTaskCreate(lwip_init_task,&task1_data,&lwip_init_stk[TASK_STK_SIZE-1],0);OSTaskCreate(user_task,&task2_data,&user_stk[TASK_STK_SIZE-1],1);OSStart();}主程序中,创建了lwip_init_task初