引言
现在有很多以以太网为基础的工业通信协议,并都有自己的优缺点,其中有些协议是开 源的,这让开发者可以设计出自己的协议。这也意味着这些开源的协议在工业上将更加受到 欢迎,应用也更加广泛。现在还没有统一的协议,而且协议的发展影响着以太网标准的变化, 这就要求能够支持多种协议的设计方法。本文主要提出使用FPGA 来尽可能支持较多的工业 以太网协议并能支持新协议的加入和系统改进。
2 基于FPGA 的工业以太网解决方案
支持多种协议的一般的方法可以通过针对每一种协议都设计一块板卡,在需要时互相替 换来实现。但随着市场上标准的增加和发展,则需要设计出一种性价比高而且还能快速支持 新协议的解决方法。 随着以太网的不断变化,需要开发设计新的电路板,这就会使得成本加大,而且实现的 慢。然而,通过使用带有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 的使用周期长,所以这种设计不会很快被淘汰。
对于工业以太网,设计FPGA 也可以有hub 或可以增强以太网通信的相似的硬件。 FPGA 不仅可以实现处理器的复杂结构设计,而且可以实现灵活多变的接口设计,比如 简单的通信接口(如UARTS,并行I/O 等),支持新的存储器的复杂接口(如DRR2/3 等)。以 及新的通信技术(如Bluetooth,Gigabit Ethernet,PCI Express 等)构造基于FPGA 的硬件 设计。
3 构造基于FPGA 的硬件IP 设计
设计处理器和以太网 MAC 硬件看起来很难,但实际上,SOPC Builder 提供了处理器和 以太网MAC 的IP 核,这就变得简单多了。Altera’s QuartusⅡ的开发环境包含SOPC Builder[2],SOPC Builder 能快速并自动配置、集成和生成基于IP 的系统。
GUI 的截图(图2)中左边列表显示了可用的IP 核。若想在现使用的系统中加入IP 核, 设计者只需双击所需的IP 模块。 选定IP 模块后,会出现配置信息,可以选择相应的选项(图2 右边)。完成这些后,配 置好的IP 功能块就会出现在当前系统设计中,如图窗口的右边。该部件的地址和中断级别 可以改变,可通过GUI 修改系统内的互联结构来改变IP 部件间的连接。处理器能够快速设 计模块和高度优化系统(如图3)。
图中窗口下面显示设计的出错信息,因而开发者可以很容 易的查错纠错。 系统设计好后,设计人员点击“generate”后即生成所要求的系统。该系统生成后,可 作为QuartusⅡ原理图设计编辑器的一个功能模块。 如果以后需要修改设计,设计人员只需打开SOPC Builder 使用GUI 来修改,再重新生 成系统,然后用QuartusⅡ软件重新组合,就生成了新的配置文件,这样在很短的时间内生 成了一个新的工业以太网协议的硬件设计。
4 网络协议设计
硬件 IP 通常封装作为SOPC Builder 的一个部件,它包含了MAC 和其它的所需的逻辑 电路。对于软件IP 可在经销商出购买,也可以自己通过移植LwIP 协议实现。 LwIP 是Light-weight Internet Protocol 的缩写,即轻量级网络协议。LwIP 是瑞典计算机 科学院的Adam Dunkels 等开发的用于嵌入式系统的TCP/IP 协议栈[5]。
LwIP 实现的重点是 在保持TCP/IP 协议主要功能的基础上减少对RAM 的占用[3],一般它只需要几十K Byte 的 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 中应实现信号 量结构体和处理函数: 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 负责,我们所要实现的是如下函数:
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);
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 初始化LwIP 任务(优先级0)和user_task 用户任务(优先级1) 。lwip_init_task 任务中除了初始化之外, 还创建了tcpip_thread( 优先级3) 和tcpecho_thread(优先级4),实际上tcpip_thread 才是LwIP 的主线程,tcpecho_thread 线程也要依靠tcpip_thread 线程来与外界通信。
编译运行后,用 telnet 命令可以看到回显结果,说明正确运行,LwIP 移植是正确的。
6 结束语
成本低廉的 FPGA 和微处理器软核IP 使得工业以太网具有高性价比可编程解决方案成 为可能。该方案只需用一个电路板就能实现传送不同的工业以太网协议,并且具有开发成本 低、使用周期长的特点。由于协议的发展,已经不同于以往的实现方法,而且有很多新的协 议形成,能支持任何工业以太网协议的灵活可变的且具有成本效益的解决方案显得越来越重 要。对于工业设备制造商来说,用FPGA 实现工业以太网也是势在必行。
-
FPGA
+关注
关注
1625文章
21665浏览量
601748 -
IP
+关注
关注
5文章
1646浏览量
149324 -
工业以太网
+关注
关注
10文章
614浏览量
42312
发布评论请先 登录
相关推荐
评论