当前,SoC 向着面积更小,速度更高的方向发展,百兆网通信已不能满足人们的生产和工作需要,用千兆网通信成为工作中迫切的要求,用FPGA实现千兆网的通信,有二种模式可以选择,其一,编写一个IP软核,其二,用FPGA内嵌的MAC内核。方法一的灵活性大,但要实现并不容易,因此,赛灵公司将其归为收费IP;方法二中的MAC的三态可配置特性为我们实现千兆网通信提供了可能,本文就是基于此内嵌的Ethernet MAC模块,在VxWorks操作系统下成功实现了千兆网的通信。

1 Virtex4 FX系列FPGA中内嵌的千兆通信硬核架构

Virtex4 FX 系列FPGA中内嵌了多个用于千兆通信的硬核,以XC4VFX20为例,它通过一个主机接口连接了二个EMAC核。二个EMAC可以一起使用,也可以只使用其中的一个。

Virtex4中嵌入的Ethernet MAC硬核主要有以下特点:

  • 支持半双工和/或全双工操作
  • 设计符合IEEE 802.3-2002标准/li>
  • 支持3种不同的操作模式:1 Gbps、100 Mbps、10Mbp
  • 支持MII,GMII,RGMII,SGMII通信方式
  • 为不限长度的VLAN帧和JUMBO帧提供技术支持
  • 提供了可选的网络管理特性,包括基于每个分组的统计数据矢量和流程控制
  • 可以通过一个与处理器无关的接口对TEMAC核进行配置和监控,其为用户选择适合其应用的理想处理器提供了附加的灵活性

在1Gigabit模式下,TEMAC支持千兆位级媒体独立接口(GMII)和降低千兆位级媒体独立接口(RGMII)。 GMII是一个运行速率为125 MHz的字节宽并行SDR接口,而RGMII是一个运行速率为25 MHz的半位元组款并行DDR接口,可以提供的总带宽为1 Gbps。 而且,在100和10 Mbps模式下,TEMAC均支持MII接口。 MII接口是4-bit宽,在100MBps模式下其工作速率为25 MHz。 在10MBps模式下,MII接口的工作速率为2.5MHz。

由于Virtex4中嵌入了Ethernet MAC硬核,同时,FX系列还嵌入了PowerPC,这样,就可以用PowerPC控制Ethernet MAC实现千兆网的通信。

2 VxWorks下BSP的移植

VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),它采用微内核的结构,具有支持多种处理器,丰富的网络协议,良好的兼容性和裁减性等特点,同时具有程序动态链接和下载的功能。自从80年代问世以来,以其不断推出的升级版本,高性能内核以及友好的用户开发环境,在嵌入式实时操作系统领域逐渐占据一席之地,尤其以成功应用于火星探测车和爱国者导弹等高科技产品而声名鹊起。VxWorks的板级支持包BSP(Board Support Package)是介于底层硬件和上层软件之间的底层软件开发包,它主要功能是为屏蔽硬件,提供操作系统的驱动,具体功能包括:

  • 单板硬件初始化,主要是CPU的初始化,为整个软件系统提供底层硬件支持
  • 为操作系统提供设备驱动程序和系统中断服务程序
  • 定制操作系统的功能,为软件系统提供一个实时多任务的运行环境
  • 初始化操作系统,为操作系统的正常运行做好准备

而在嵌入式系统设计中,BSP的开发是一项非常复杂而繁琐的工作 ,Xilinx公司提供的EDK套件,可以在很大程度上减轻开发者的工作。EDK中的BSP生成器(BSPgen)可以根据不同的微处理器、外设和RTOS组合自动产生用户可裁剪的BSP。它包含了系统所必需的支持软件,包括Boot代码、设备驱动和RTOS的初始化。利用BSPgen可以把Xilinx器件驱动打包到BSP的子目录下,并且把Xilinx器件驱动与VxWorks及其Tornado集成开发环境无缝集成,充分减少开发周期。

但是,BSPgen生成的BSP只是一个固定的BSP模板,并不能正确的反应RAM/ROM的存储器映射,不支持用户通过BSPgen流程自定义的核/驱动等。因此还需要对BSPgen产生的BSP进行修改裁剪。

对于BSP开发人员来讲,借助EDK的BSPgen,还必要做以下几项工作:

  • 修改config.h 和Makefile中的RAM,ROM地址及串口速率
  • 修改sysSerial.c,对串口进行正确的设置
  • 增加不能与VxWorks无缝集成的器件的驱动文件
  • 配置sysNet.c中的以太网参数,设置MAC地址
  • 根据EDK中的配置,禁止或使能Cache
  • 修改sysLib.c,以显示正确的信息
  • 设置主机IP地址

经过以上修改之后,将新的BSP放在Tornado的安装目录Tornado_roottargetconfig下,根据这个BSP,在Tornado集成环境下生成一个新的VxWorks工程,然后就可以进行一般的嵌入式操作系统开发了。

EDK中RAM和ROM的地址映射如下表所示:

VxWorks RAM ROM

表一 RAM/ROM地址映射

根据表一修改 makefile 和config.h里的地址。sysNet.c 中通过以下语句定义了网络的MAC地址,必须根据真实的MAC地址进行修改,如本文的MAC地址:00:0A:35:01:88:25

         static char XEmacMacAddr0[6] = { 0x6, 0x5, 0x4, 0x3, 0x2, 0x1 }; //修改前 
         static char XEmacMacAddr0[6] = { 0x00, 0x0A, 0x35, 0x01, 0x88, 0x25 }; //修改后 

sysSerial.c对串口进行初始化,因经要正确的指定串口ID,sysLib.c中可以显示vxWorks镜像的信息,因此也要进行相应的修改。

通过对EDK下生成的BSP的修改,并在Tornado集成环境下生成正确的VxWorks镜像后,可以将其下载到FPGA中。观察串口的输出是否正确,可以进行相应的调试工作,以确定BSP的移植是正确的。

3 VxWorks下的千兆网通信程序

对VxWorks BSP进行正确的配置和修改后,在useAppInit.c中书写自己的TCP服务器端程序,本文用基于TCP的socket通信。

网络通信一般可通过socket实现。socket编程均采用客户机/服务器模式,VxWorks提供了标准的BSDsocket调用,支持TCP协议。TCP协议即数据传输协议,它允许创建和维护与远程计算机的连接,使其彼此可以进行数据传输。

通信过程如图一所示:

VxWorks Socket

图一 TCP C/S Socket 通信流程

服务器首先调用socket 0建立一个套接字socket,然后调用bind0将套接字与一个本地网络地址(IP地址和端口号)捆绑在一起,以保证客户端正确识别。接着服务器再调用listen0使套接字处于被动的准备接收状态,同时规定它的请求队列长度;随后调用accept0来接收客户连接。服务器进程随即进人阻塞状态。客户与服务器的关系是不对称的。服务器先启动。然后在某时刻客户主动发出请求,服务器被动应答。

客户端程序首先调用socket0,这个函数产生用于与各分系统连接的套接口,并为每个套接口返回一个ID号。然后初始化一个套接口结构体,为其赋上该ID号以及服务端的I P地址和端口号,并将其作为函数connect0的参数.调用connect0函数主动去连接服务端。

当服务端与客户端建立连接之后,就可以发送(write)和接收(read)数据。

客户端应用程序在Windows下用VC实现,代码从略。

4 实验结果

结合工程实际开发的顺序,分二步对VxWorks 下千兆网通信进行测试。

首先在usrAppInit.c中打印hello the world,如出现图三所示,刚证明VxWorks内核已正确加载,BSP的移植的正确性。程序跑到了用户编写的usrAppInit.c。

VxWorks usrAppInit Hello World

图二 VxWorks 内核加载

第二步,对编写的TCP服务器/客户端进行测试,结果如表二所示:

VxWorks Socket Receive Data

表二 TCP服务器/客户端发送接收数据统计

5 结论

由于FPGA中嵌入了PowerPC处理器及用于千兆网通信的Ethernet MAC,这样,为利用FPGA实现高速网络通信奠定了基础,将VxWorks移植到FPGA中可以使FPGA的功能更为强大,通过VxWorks操作系统下的千兆网通信,可以将数据实时传输到硬盘上。