三、基于FPGA的千兆以太网MAC控制器实现方案
1.整体设计方案
以太网控制器的FPGA设计工作包括以太网MAC子层的FPGA设计、MAC子层与上层协议的接口设计以及MAC与物理层(PHY)的MII接口设计。该以太网控制器的总体结构设计框图如图10-30所示。整个系统分为发送模块、接收模块、MAC状态模块、MAC控制模块、MII管理模块和主机接口模块六部分。发送模块和接收模块主要提供MAC帧的发送和接收功能,其主要操作有MAC帧的封装与解包以及错误检测,它直接提供了到外部物理层芯片的并行数据接口。在实现中物理层处理直接利用商用的千兆PHY芯片,主要开发量集中在MAC控制器的开发上。
图1 以太网控制器的结构设计框图
MAC 控制模块则用于执行全双工模式中的流量控制功能。MAC状态模块可用来监视MAC操作过程的各种状态信息,并作修改。MII管理模块提供了标准的IEEE 802.3介质独立接口,可用于连接以太网的链路层与物理层。主机接口则提供以太网控制器与上层协议(如TCP/IP协议)之间的接口,以用于数据的发送、接收以及对控制器内各种寄存器(控制、状态和命令寄存器)的设置。
2.MAC控制器结构和工作流程
1)MAC发送模块
MAC发送模块可将上层协议提供的数据封装之后通过MII接口发送给PHY。发送模块可接收主机接口模块的数据帧开始和数据帧结束标志,并通过主机接口从外部存储器中读取要发送的数据,然后对数据进行封装,再通过 PHY提供的载波侦听和冲突检测信号,在信道空闲时由MII接口将数据以4位的宽度发送给PHY芯片,最后由PHY将数据发送到网络上。
发送模块由CRC生成模块(crc_gen)、随机数生成模块(random_gen)、发送计数模块(tx_cnt)和发送状态机(tx_statem_machine)模块等四个主要子模块组成,其内部结构如图10-31所示。
图2 以太网MAC发送模块的结构示意图
发送状态机由Idle_State、Preamble_State、Data0_State、Data1_State、PAD_State、 FCS_State、IPG_State、Jam_State、BackOff_State、Defer_State 等十个状态组成。其状态转移图如图10-32所示。
图3 发送状态机的状态转移图
系统复位后,发送模块即进入Defer_State状态,并一直检测载波侦听(CarrierSense)信号。当载波侦听信号变成无效(表示信道空闲)时,状态机进入IPG_State状态。此后,在等待一个帧间间隙之后,状态机进入Idle_State状态。如果在帧间间隙的前2/3个周期检测到信道忙信号,状态机将重新回到Defer_State状态。
状态机进入Idle_State状态之后,发送模块将检测载波侦听信号和主机接口的发送请求。若主机模块请求发送,状态机将进入Preamble_State状态,发送模块即通知PHY发送开始,同时开始发送前序码(7个0x5), 然后发送帧起始定界符(SFD, 0xd)。状态机进入Data0_State后,发送模块将发送一个数据字节的低4位(LSB nibble),当其进入Data1_State状态后,发送模块则发送数据字节的高4位(MSB nibble)。随后,状态机一直在data0和data1之间循环,直到数据发送完毕。当还剩一个字节时,主机模块将通过发送帧结束信号来通知发送模块。如果数据帧的长度大于最小帧并且小于最大帧,状态机就进入FCS_State状态,此时发送模块则将CRC生成模块生成的CRC值添加到帧的FCS字段中并发送给PHY。
帧发送完之后,状态机进入Defer_State 状态,之后是IPG_State和Idle_State状态。此后状态机又回到初始状态,以重新等待新的发送请求。如果数据帧的长度小于最短帧,状态机就进入PAD_State状态,发送模块根据系统设置确定是否在数据之后添加填充码。然后,状态机进入FCS_State状态。如果数据帧的长度大于最大帧,而系统设置又支持发送超长帧,那么,状态机就进入FCS_State状态;如果不支持发送超长帧,发送模块将放弃发送,状态机直接进入Defer状态,然后是IPG状态,最后回到Idle状态。
在发送数据的过程中,发送模块会一直检查冲突检测信号(collision detected)。如果发现冲突且状态机正处于Preamble_State,状态机将在发送完前序码和SFD之后进入Jam_State,并发送拥塞码,然后进入BackOff状态,以等待重试。之后,状态机经过Defer和IPG回到Idle状态。如果此时重试次数计数器的值没有达到额定值,发送模块将重新开始发送刚才的帧,并将重试次数计数器的值加1;如果发现冲突且状态机处于data0、data1或FCS状态,而且没有超过冲突时间窗,那么状态机将马上进入Jam状态发送拥塞码,之后经过BackOff、Defer、IPG、回到Idle,并根据重试计数器的值决定是否重新发送刚才的数据帧;如果检测到发生冲突的时间超过了冲突时间窗,状态机将进入Defer状态,然后经过IPG到IDLE状态,并放弃重试。
在全双工模式中发送帧时,不会进行延迟(defer), 发送的过程中也不会产生冲突。此时,发送模块将忽略PHY的载波侦听和冲突检测信号。当然,帧与帧之间仍然需遵守帧间间隙的规则。因此,全双工模式下的发送状态机没有Jam_State、BackOff_State、Defer_State三个状态。
2)MAC接收模块
MAC 接收模块结构如图10-33所示,负责数据帧的接收。当外部PHY将通信信道的串行数据转换为半字节长的并行数据并发送给接收模块后,接收模块会将这些半字节数据转换为字节数据,然后经过地址识别、CRC校验、长度判断等操作后,再通过主机接口写入外部存储器,并在主机接口模块的接收队列中记录帧的相关信息。此外,接收模块还负责前序码和CRC的移除。
图4 以太网MAC接收模块的结构示意图
接收过程的接收状态机由Idle_State、Drop_State、Preamble_State、SFD_State、Data0_
State、Data1_State等六个状态组成, 其状态转移图如图10-34所示。
图5 接收状态机的状态转移图
当接收模块检测到数据有效信号之后,,状态机将进入Preamble_State,并开始接收前序码。此后状态机进入SFD_State,接收一个字节的帧起始定界符,之后根据IFGcnt计数器的值进入不同的状态。如果IFGcnt所确定的时间大于96个比特时间,状态机将进入Data0状态以接收字节的低4位,然后是Data1状态,并接收字节的高4位,之后又回到Data0状态。状态机就一直在这两个状态之间循环,直到数据接收完毕(PHY清除 MRxDV信号)后进入Idle,以重新等待接收新的数据;如果接收到帧起始定界符时,IFGcnt计数器所确定的时间小于96个比特时间,那么状态机将进入Drop_State状态,并一直维持该状态直到数据有效信号结束(PHY清除MRxDV信号)。之后,状态机再回到Idle等待接收新的数据。如果在接收前序码、帧起始定界符和数据期间,数据有效信号被清除,那么状态机将回到Idle。
3)MII管理模块
MII管理模块用于控制MAC与外部PHY之间的接口,用于对PHY进行配置并读取其状态信息。该接口由时钟信号MDC和双向数据信号MDIO组成。MII管理模块则由时钟生成模块、移位寄存器模块和输出控制模块三部分组成。
时钟生成模块可以根据系统时钟和系统设置中的分频系数来产生MII 管理模块的时钟信号MDC(10 Mbps速率时为2.5 MHz, 100 Mbps速率时为25 MHz)。移位寄存器模块既可用于对PHY的控制数据进行写入操作,也可用于对PHY的状态信息进行读出操作。写控制数据时,移位寄存器根据其他模块的控制信号将并行控制数据转换为串行数据;而在读状态信息时,移位寄存器则将PHY的串行数据转换为并行数据,MAC中的其他模块可将该并行数据写入适当的寄存器。
由于MDIO是双向信号,因此输出控制模块就用来决定MDIO是处于输入状态还是输出状态。当MDIO处于输出状态时,移位寄存器输出的串行控制数据在经过时钟同步后发送到PHY;当MDIO处于输入状态时,移位寄存器将数据线上的串行数据转换为并行数据
4)主机接口模块
主机接口是运行以太网的上层协议(如TCP/IP协议)与MAC控制器的接口。通过该接口,上层协议可以设置MAC的工作模式并读取MAC的状态信息。该接口还可用于上层协议与MAC之间的数据交换。
主机接口模块内有一组寄存器,可用于存储上层协议对MAC设置的参数以及MAC的状态信息。上层协议对MAC设置的参数包括接收超短帧的使能、添加填充码使能、发送超长帧的使能、添加CRC校验值使能、全双工模式或半双工模式、持超长延迟使能、混杂模式
(Promiscuous)、接收广播帧使能、发送和接收使能、中断源和中断使能、帧间间隙的长度、最大帧和最小帧的长度、重试限制和冲突时间窗、MII地址和MII控制命令、接收和发送队列的长度以及本机MAC地址等。
上层协议通过MAC发送和接收数据的操作主要由主机接口模块内的两个队列来进行管理,这两个队列用于对等待发送的多个帧和接收到的多个帧进行排队。发送队列主要记录等待发送的帧的相关信息、发送该帧时对MAC的设置以及该帧发送完之后产生的状态信息。帧的相关信息包括帧的长度、帧在外部存储器中的地址、该帧是否准备好发送以及队列中是否还有其它帧等待发送;对MAC的设置则包括中断使能、填充使能、CRC使能;产生的状态信息包括成功发送之前的重试次数、由于达到重试限制而放弃发送、发送时产生的滞后冲突以及成功发送之前发生过的延迟。
接收队列主要对接收到的数据帧进行排队并记录每个接收到的帧信息。这些信息包括帧的长度、是控制帧还是普通数据帧、帧中包含无效符号、接收到的帧太长或太短、发生CRC错误、接收的过程中发生滞后冲突、帧是否接收完、队列中是否还有其它已接收到的帧以及帧存储在外部存储器中的地址等。同时队列中还有针对每个帧的设置位,用来设置是否在接收到帧时产生中断。发送队列和接收队列的长度都可以在控制寄存器中进行设置。
评论
查看更多