欢迎您 登录 |  注册 | 找回密码

产品类型
以太网交换机
路由器
其它

以太网技术
基础理论
前沿技术
专利技术

实际应用
行业应用
维修技术

总评分:简直是完美

9.7

3人评分    21关注    370645次浏览

我的评分

  

专题名称:工业以太网
热门群组:技术群组
官方网址:进入官方网站

品牌推荐:暂缺
行业精英:暂缺
相关专题:应用技术,现场总线,PLC

返回本专题首页

基于FPGA的工业以太网灵活解决方案

作者:张静   2012-07-10   来源:中国自动化网   评论:0条    浏览:498

1 引言 965【中国自动化网社区】443783【http://sns.ca800.com】3cb8107

  2e5【中国自动化网社区】4b9bf0【http://sns.ca800.com】2334


2e5【中国自动化网社区】4b9bf0【http://sns.ca800.com】2334


fac48【中国自动化网社区】ee3ed7【http://sns.ca800.com】39625

      现在有很多以以太网为基础的工业通信协议,并都有自己的优缺点,其中有些协议是开源的,这让开发者可以设计出自己的协议。这也意味着这些开源的协议在工业上将更加受到欢迎,应用也更加广泛。现在还没有统一的协议,而且协议的发展影响着以太网标准的变化,这就要求能够支持多种协议的设计方法。本文主要提出使用FPGA 来尽可能支持较多的工业以太网协议并能支持新协议的加入和系统改进。 fac48【中国自动化网社区】ee3ed7【http://sns.ca800.com】39625


fac48【中国自动化网社区】ee3ed7【http://sns.ca800.com】39625


2 基于FPGA 的工业以太网解决方案 ce52【中国自动化网社区】fdda15【http://sns.ca800.com】2e069f

 
  支持多种协议的一般的方法可以通过针对每一种协议都设计一块板卡,在需要时互相替换来实现。但随着市场上标准的增加和发展,则需要设计出一种性价比高而且还能快速支持 新协议的解决方法。 随着以太网的不断变化,需要开发设计新的电路板,这就会使得成本加大,而且实现的慢。然而,通过使用带有FPGA 的工业以太网接口就可以解决以上的问题,使用FPGA 最主要的好处在于它容易重新配置。
  在任何时候只需要构造一个电路板和能支持任一种工业以太网协议的硬件程序。如果要使用不同的协议或是用户改变执行命令,只需花费几秒钟根据具体 需要改写FPGA 的配置文件。这种多协议方法大大降低了开发成本,减小编码量[1]。
  FPGA 与以太网收发器(通常为PHY)结合使用时,它可以完成所有以太网接口的功能。PHY 和电路板中的物理层接口,数据链路层(MAC)硬件功能可由FPGA 硬件配置程序来实现;再往上层(3 层以上)的功能是由运行在FPGA 逻辑电路配置的核心处理器上的软件实现的。
  FPGA 逻辑电路是可编程的,I/O 管脚支持多种协议,现有的IP 接口应用广泛,所以在现有的应用处理器和FPGA 之间很容易实现通信信道。一般现有的处理器接口(如I2C,SPI,其他一些本地并行总线)或系统(PCI,PCI Express,CANopen 等)都可以与FPGA 通信。
  由于FPGA 硬件是可编程的,如果想把应用程序封装到FPGA 中,那么可以设计含有多个微处理器软核。这样做的好处在于它可以减少组件数量,降低成本和功率消耗。此外,完全基于IP 设计易于移植到新设备上,而且FPGA 的使用周期长,所以这种设计不会很快被淘汰。 ce52【中国自动化网社区】fdda15【http://sns.ca800.com】2e069f

3 构造基于FPGA 的硬件IP 设计  设计处理器和以太网MAC 硬件看起来很难,但实际上,SOPC Builder 提供了处理器和以太网MAC的IP核,这就变得简单多了。Altera’s QuartusⅡ的开发环境包含SOPC Builder[2],SOPC Builder 能快速并自动配置、集成和生成基于IP的系统。4 网络协议设计


ce52【中国自动化网社区】fdda15【http://sns.ca800.com】2e069f

 
  硬件IP 通常封装作为SOPC Builder的一个部件,它包含了MAC 和其它的所需的逻辑电路。对于软件IP可在经销商出购买,也可以自己通过移植LwIP 协议实现。LwIP 是Light-weight Internet Protocol 的缩写,即轻量级网络协议。LwIP 是瑞典计算机 科学院的Adam Dunkels 等开发的用于嵌入式系统的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 中的内容是与操作系统相关的一些结构和函 数,主要可以分为四个部分: ce52【中国自动化网社区】fdda15【http://sns.ca800.com】2e069f

     ①sys_sem_t 信号量。LwIP 中需要使用信号量进行通信,所以在sys_arch 中应实现信号 量结构体和处理函数: struct sys_sem_t
  sys_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 负责,我们所要实现的是如下函数: 497983【中国自动化网社区】8612ab【http://sns.ca800.com】17

  struct sys_timeouts * sys_arch_timeouts(void)
  这个函数的功能是返回目前正处于运行状态的线程所对应的timeout 队列指针。Timeout 队列属于线程的属性,因此是与操作系统相关的函数。
  ④sys_thread_new 创建新线程函数。LwIP 可以是单线程运行,即只有一个tcpip 线程(tcpip_thread),负责处理所有的TCP 或UDP 连接,各种网络程序都通过tcpip线程与网络交互。它也可以多线程运行,以提高效率。
  (3) lib_arch 中库函数。LwIP用到8个外部函数,这些函数通常与用户使用的系统或编译器有关。
  u16_t htons(u16_t n);//16 位数据高低字节交换
  u16_t ntons(u16_t n);
  u32_t htonl(u32_t n);//32 位数据大小端对调
  u32_t ntonl(u32_t n);
  int strlen(const char *str);
  int stmcmp(const char *str1,const char *str2,int len);
  void bcopy(const void *src,void *dest,int len);
  void bzero(void *data,int n); 497983【中国自动化网社区】8612ab【http://sns.ca800.com】17


497983【中国自动化网社区】8612ab【http://sns.ca800.com】17


5 测试 497983【中国自动化网社区】8612ab【http://sns.ca800.com】17


  将修改后的LwIP 进行测试,比如移植到μC/OS-II 中。先对LwIP 进行初始化,再创建TCP或UDP任务,然后就可以测试了,关键部分的代码和说明如下: 497983【中国自动化网社区】8612ab【http://sns.ca800.com】17

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初始化LwIP任务(优先级0)和user_task用户任务(优先级1) 。lwip_init_task 任务中除了初始化之外, 还创建了tcpip_thread( 优先级3) 和tcpecho_thread(优先级4),实际上tcpip_thread 才是LwIP 的主线程,tcpecho_thread 线程也要依靠tcpip_thread 线程来与外界通信。
  编译运行后,用telnet 命令可以看到回显结果,说明正确运行,LwIP 移植是正确的。 497983【中国自动化网社区】8612ab【http://sns.ca800.com】17


497983【中国自动化网社区】8612ab【http://sns.ca800.com】17


6 结束语 497983【中国自动化网社区】8612ab【http://sns.ca800.com】17

 
  成本低廉的FPGA 和微处理器软核IP 使得工业以太网具有高性价比可编程解决方案成为可能。该方案只需用一个电路板就能实现传送不同的工业以太网协议,并且具有开发成本低、使用周期长的特点。由于协议的发展,已经不同于以往的实现方法,而且有很多新的协议形成,能支持任何工业以太网协议的灵活可变的且具有成本效益的解决方案显得越来越重要。对于工业设备制造商来说,用FPGA 实现工业以太网也是势在必行。
  本文作者的创新点:使用FPGA 实现在一个电路板上传送不同的工业以太网协议的功能,并能支持加入新的协议,使用周期长,具有高性价比的优点,而且易开发。 497983【中国自动化网社区】8612ab【http://sns.ca800.com】17

  497983【中国自动化网社区】8612ab【http://sns.ca800.com】17

评论

内容加载中,请稍候...
内  容:

中国自动化网 版权所有  © 2010 - 2016     经营许可证编号: 粤ICP备09051729