《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 业界动态 > 基于FPGA的Ethernet解包电路

基于FPGA的Ethernet解包电路

2009-01-12
作者:周 飚1, 谢晓阳2

    摘  要: 针对传统微处理器平台中存在的接口速率瓶颈问题,提出了基于现场可编程门阵列(FPGA) 的以太网解包电路的硬件实现方法。主要介绍了接收数据帧的实现方法,该设计具有通用性好、可扩展性强以及方便易行等优点, 为高速数据采集系统的网络化提供了很好的解决方案。 

    关键词: 解包; FPGA; 以太网

 

    传统以PC为中心的互联网应用现已开始转向以嵌入式设备为中心。据网络专家预测,将来在互联网上传输的信息中,有70%来自小型嵌入式系统。因此,对嵌入式系统接入Internet 网络的研究是有必要的。 

    一般情况下,以太网卡用普通的MCU可以完成数据的接收/发送任务[1]。但当系统中要求接收/发送的数据特别多时,仅仅依靠普通MCU的资源往往难以完成任务。此时一般只能采取多MCU联机处理模式,或者依靠其它芯片扩展来完成任务。这样不仅增加了大量的外部电路和系统成本,而且大大增加了系统的复杂性。 

    利用FPGA的I/O端口多,而且可以自由编程定义其功能的特点,配以Verilog HDL编写的内部执行程序就可以完成其功能。代码执行是按照并行处理的,而且FPGA硬件的速度是ns级的,所以在高速的数据采集和接收的过程中具有重大意义。 

    本文根据IEEE 802.3数据帧格式在MII接口提供数据的情况下,利用FPGA设计完成整个数据包的接收过程。 

1 相关理论 

    以太网是在 20 世纪 70 年代研制开发的一种基带局域网技术,使用同轴电缆作为网络媒体,采用载波多路访问和冲突检测(CSMA/CD)[2]机制,数据传输速率达到10Mb/s。但是如今以太网更多地被用来指各种采用CSMA/CD技术的局域网。以太网的帧格式与IP是一致的,特别适合于传输 IP 数据。 

1.1 以太网MAC子层协议 

    IEEE 802协议标准系列中,数据链路层包括逻辑链路控制(LLC)子层和媒体访问控制(MAC) 子层。其中MAC位于LLC和物理层之间,它使LLC 适应于不同的媒体访问技术和物理媒体。MAC单独作为一个子层,就不会因为媒体访问方法的改变而影响较高层次的协议。MAC由数据拆装和媒体访问管理两个模块组成,完成数据帧的封装、解封、发送和接收功能。以太网数据帧封装格式如图1所示,其中目的地址、源地址、长度/类型和数据4个字段由上一层协议模块生成。传送数据帧时,数据封装模块自动在待传输数据前面添加7个字节的前导码和1个字节的定界符,并在数据传送结束时加发4个字节的循环冗余校验码,如果数据长度小于46字节,则会自动进行数据填充以达到要求的最短长度。接收数据帧时,数据拆装模块将自动丢弃前导码和定界符2个字段。 

 

 

1.2 CSMA/CD协议 

    媒体访问管理模块主要实现CSMA/CD(Carrier Sense Multiple Access with Collision Detection)协议[4]。CS2MA/CD是一种分布式介质访问控制协议,使网中的多个站(节点) 可以共享传输介质。发送数据帧时,节点首先进行载波监听,当介质空闲时开始发送帧。如果在传输过程中与其他节点产生冲突,则正在传输的每个节点必须发出32bit大小的阻塞信号来加强冲突,以便通知总线上各个站点已发生冲突,然后随机延时一段时间重新争用介质,再重新传送数据帧。 

    以太网用载波侦听多路访问/冲突检测(CSMA/CD)作为它的媒体访问控制协议,CSMA/CD定义了以太网节点为传输数据如何获得对网络媒体的访问。 

1.3 介质无关接口(MII) 

    MII是一个用于互连控制器和收发器的全新介质无关接口,它是100Mb/s快速以太网开发工作的一个组成部分。此接口提供了新的物理连接机制以及控制器和收发器的功能划分。该接口主要由发送信号、接收信号、以太网控制信号和管理信号组成。 

1.4 CRC校验 

    利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。 

2 解包电路的设计 

    根据以太网的工作原理,其接收数据过程如下: 

    (1)网上的站点,若不发送帧,都处在接收状态,只要介质上有帧在传输,这些站点都会接收帧; 

    (2)接收帧后,首先判断是否为帧碎片(碰撞),若是,则丢弃; 

    (3)识别目的MAC地址,若不是,本站地址则丢弃; 

    (4)判断帧校验序列是否有效,若无效则传输出错,丢弃; 

    (5)判断类型/长度是否正确,若正确,接收成功。 

    其流程图如图2所示。  

 

 

    该解包电路主要完成数据帧的接收, 即从物理层PHY芯片接收4 bit半位元数据,将其转化成以字节为单位的数据并存贮在接收数据缓冲区, 按照设计要求,采用层次结构化的设计方法,可将该电路划分为状态机模块、计数器模块、地址判断模块和CRC校验模块。其模块结构图如图3所示。 

 

 

2.1 状态机模块 

    接收控制状态机是整个接收模块的核心,负责管理各个功能子模块,检测总线及实现接收数据帧的时序。其接口电路如图4所示。 

 

 

    图中,MRxClk、Reset、MRxDV、Transmitting是MII接口提供的时钟、复位、数据有效和无发送冲突信号。MRxDEqA判断接收到的数据是否为1010, MRxDEqB判断能否进入接收数据状态,它们用来对状态机进行相应的控制。ByteCntSmall7是在StatePreamble状态下检测到传输数据为A能否跳到StateSFD状态的条件(不为1即跳转)。ByteCntMaxFrame用来判断接收的字节是否超出最大字节数,如果为1即由当前状态跳转到StateDrop。 

    根据状态机模块的功能,可将其状态机划分为以下状态:  

    StateIdle:     线路空闲状态 

    StatePreambl:  前导字符检测状态 

    StateSFD:      起始符检测状态 

    StateData0:    接收低4位状态 

    StateData1:    接收高4位状态 

    StateDrop:     数据丢弃状态; 

    接收模块状态转移图如图5所示。通常接收模块处于StateIdle 状态并监听总线的状态,当检测到以太网帧时自动进入StateSFD 状态,此时如果接收到以太网数据帧的帧定界符,并且与前一个数据帧之间的时间间隔大于最小帧间间隙,则接收模块进入数据接收状态开始接收数据。处于StateData0 状态时接收字节的低4 位,而处于StateDatal 状态时接收字节的高4 位,将接收到的完整字节数据存储到接收数据缓冲区。如果接收的数据字节数超过允许的最大帧长度,则接收模块进入StateDrop 状态,此时丢弃后面的数据。当全部数据传输完毕即总线处于空闲时,接收模块重新处于StateIdle 状态,等待接收下一个数据帧。 

 

 

    其状态转换条件的Verilog[5]描述如下: 

    assign StartIdle =~MRxDV & (StateDrop | StatePreamble | StateSFD | (|StateData)); 

    assign StartPreamble = MRxDV & ~MRxDEqA & (StateIdle & ~Transmitting); 

    assign StartSFD = MRxDV & MRxDEqA & (StateIdle & ~Transmitting | StatePreamble) &~ByteCntSmall7; 

    assign StartData0 = MRxDV &(StateSFD & MRxDEqB & IFGCounterEq24 | StateData1); 

    assign StartData1 = MRxDV & StateData0 & (~ByteCntMaxFrame); 

    assign StartDrop = MRxDV & ( Transmitting | StateSFD & ~IFGCounterEq24 &  MRxDEqB| StateData0 & ByteCntMaxFrame); 

2.2 计数器模块 

    计数器模块用以检测接收到的数据帧与前一帧之间是否满足最小帧间间隔的要求,如果不满足则将它丢弃。 接收字节计数器用以存储接收帧的字节长度,判断接收帧长度是否满足要求(在最小帧长度与最大帧长度之间)。其接口电路如图6所示。 

 

 

    该模块主要完成三个计数功能:(1)是否连续检测到7个以上的1010;(2)接收到组字节数据计数器;(3)连续两个数据帧之间的间隔时间与最短时间大小关系。 

    MRxDEqA是判断接收到的数据是否为1010,如果检测正确即可进行计数来判断能否跳转到下一状态StateSFD; MRxDEqB用来判断能否进入接收数据状态StateData0;MaxFL是给定能接收的数据的最大数。 

    输出信号ByteCntEq2、ByteCntEq3、ByteCntEq4、ByteCntEq5、ByteCntEq6、ByteCntEq7对接收的前6个字节计数来进行相应的地址判断操作。 

2.3 地址判断模块 

    地址判断模块用以检查帧的目的地址字段是否与本站地址相匹配,如果不匹配,则说明不是发送给本站的而将它丢弃掉。其接口电路如图7所示。 

 

 

    地址字段包括目的地址字段DA和源地址字段SA。目的地址字段占6个字节,用于标识接收站点的地址,它可以是单个的地址,也可以是组地址或广播地址。DA字段最高位为“0”表示单个的地址,该地址仅指定网络上某个特定站点;DA字段最高位为“1”、其余位不为全“1”表示组地址,该地址指定网络上给定的多个站点;DA字段为全“1”,则表示广播地址,该地址指定网络上所有的站点。源地址字段也占2个或6个字节,但其长度必须与目的地址字段的长度相同,它用于标识发送站点地址。在6字节地址字段中,可以利用其48位中的次高位来区分是局部地址还是全局地址。 

     ByteCntEq2、ByteCntEq3、ByteCntEq4、ByteCntEq5、ByteCntEq6和ByteCntEq7依次对应接收到的1~6个字节。即目的地址通过对这6个字节和本地地址的比较可以判断是否接收这个数据。RxEndFrm是数据接收结束信号,应对地址比较结果进行保持到数据接收结束为止。MRxAddressValid是地址比较的结果。 

2.4 CRC校验模块 

    该模块主要完成4位并行数据的CRC-32校验,所进行的是无延迟的方法。IEEE802.3协议规定,以太网的FES(帧校验序列)域以CRC-32为基础[6],并且在编码时首先将信息码的最初4个字节取反码,对目的地址、源地址、长度/类型域、数据域、PAD域求出基本CRC-32码之后再将结果取反,最后的结果才是FCS。其接口电路如图8所示。 

 

 

3 解包电路功能仿真与综合结果 

    本文采用Altera 公司的Flex系列Flex6000 芯片,整个设计全部采用Verilog HDL 硬件描述语言来实现,并在Active HDL 的设计平台上完成整个模块的设计,在Quartus进行综合布局布线仿真。其仿真结果如图9、10、11所示。 

 

 

 

 

    从图9可以看出,接收数据时状态机的变化情况,以及接收数据RxData和开始的数据位置。             

    从图10可以看出地址比较的结果,当地址为广播时,此时接收数据。单一地址情况如上图,故不列出。 

    从图11可以看出地址比较不一致以及进行的CRC校验结果。 

    仿真结果表明,各信号的逻辑功能和时序配合完全达到了设计要求。 

    本文介绍了一种基于FPGA 的以太网MAC 子层接收数据的设计方法,仿真和综合结果表明该解包电路各项功能均达到预期要求。通过本模块可以简单方便地设计发送控制模块以实现小型嵌入式系统的Internet 网络接口,如果再结合基于FPGA实现的TCP/IP协议栈及其他辅助功能模块,不仅可以使小型嵌入式系统接入网络更加简单,而且系统的集成度、稳定性将进一步提高。 

参考文献 

[1] 王兰,王景存,杨君.单片机系统接入Internet方法的探讨[J]. 电子技术,2002,29(8):37-39. 

[2] IEEE Std 802. 3, 2000 Edition, Part 3: Carrier sense multiple access with collision detection(CSMA/CD) accessmethod and physical layer apecifications S. 

[3] 曹政,李磊,陈明宇. 万兆以太网媒体访问控制层研究[J]. 计算机工程,2007(17):31-33 

[4] 谢希仁.计算机网络(第4版)[M]. 北京:电子工业出版社,2003. 

[5] BHASKER J . Verilog HDL 硬件描述语言[M]. 北京:机械工业出版社,2005. 

[6] 郭熙业,苏绍璟,王跃科.并行CRC-32校验码生成算法研究及其实现[J].电子技术应用,2007,33(5):121-123.

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。