>
摘 要:本文介绍了基于FPGA、功能经过扩展的以太网MII接口的硬件实现方法。硬件结构上由控制信号模块、分频器、异步FIFO缓冲和4b/5b编解码器4个部分组成。
关键词:
引言
传统以PC为中心的互联网应用现已开始转向以嵌入式设备为中心。据网络专家预测,将来在互联网上传输的信息中,有70%来自小型嵌入式系统,因此,对嵌入式系统接入因特网的研究是有必要的。目前有两种方法可以实现单片机系统接入因特网:一种方法是利用NIC (网络控制/网卡)实现网络接口,由单片机来提供所需的网络协议;另外一种方法是利用具有网络协议栈结构的芯片和PHY(物理层的接收器)来实现网络接口,主控制器只负责往协议栈结构芯片的某个寄存器里放上适当的数据。与此同时,用FPGA实现单片机系统接入因特网的方法也日益受到人们的重视。本文提出采用FPGA实现网络协议栈,介绍
图1 硬件结构框图
图2 模块发送时序波形图
以太网MII接口协议
IEEE802协议标准系列中,数据链路层包括LLC (逻辑链路控制)子层和MAC (媒体访问控制)子层。其中MAC单独作为一个子层,完成数据帧的封装、解封、发送和接收功能。物理层PHY的结构随着传输速率的不同而有一定差异,在
扩展MII接口功能及其
FPGA实现
由于
在设计过程中,为了考虑测试和支持多种速率传输的需要,要求设计带有分频参数的可实现奇偶分频的分频器和支持能够同时进行读写操作和异步读写时钟的FIFO。这是MII接口设计中的难点,本身也具有很高的实用价值。
奇偶分频器的实现
分频器是数字系统设计中的基本电路,同一个设计中有时要求多种形式的分频。通常由计数器或计数器的级联构成各种形式的偶数分频及非等占空比的奇数分频,实现较为简单;对等占空比的奇数分频实现则较为困难。本文对2n+1等占空比奇数分频的基本思路是:先通过模2n+1的计数器实现占空比为n+1/n的奇数分频(比如三分频,正负波形的占空比为2:1),然后有两种方法可以实现等占空比的奇数分频,一种是当计数器至n+1时,让此波形与输入时钟波形相“与”,不过可能会存在毛刺输出;另一种是当计数器至n+1时,在输入时钟的下降沿触发产生低电平脉冲,然后再和原波形相“或”,这种方法没有毛刺产生。因此本文采用第二种方法。
4b/5b编解码器的设计
为了减少系统的开销,本文把4b/5b的编码和解码同时集中到一个模块上实现。数据0~F可以直接编、解码。PCS层有6个特殊的5b码:11111为帧间填充码;11000、10001和01101、00111是两对成对出现的码组,分别为数据流开始和结束时的分隔符;00100则是数据错误位,用以表示错误。数据接收时,可以直接对这几个5b码组解码,00100则产生信号rx_er。发送时,需要对从MII接口传来的信号位进行判断:若tx_en上升沿,则在头两个前导码时编码输出SSD;若tx_en下降沿(帧间隔),则在FCS后输出ESD,然后一直用11111为数据流间隔填充码;若有tx_er触发,则编码00100输出。
异步双口FIFO的设计
为了满足PCS层数据的物理层时钟以及MAC层总线时钟不同步的需求,需要FIFO有异步的读、写时钟。当冲突检测COL为高时,要求发送帧执行退回操作回至FIFO中等待下一个Transmitting信号。
FIFO的设计思路如下:设置异步Reset,高电平触发;设置8位寄存器fifodata保存FIFO的数据;设置fifo_rp和fifo_wp为读、写指针;cr_rp和cr_wr为进位标志,fifo_rp和fifo_wp为FIFO_DEPTH-1的时候取反;设置nempty、nfull、near_empty、near_full为数据空、满指示。
读写时,FIFO_RD为1,则fifo_out<=fifodata[fifo_rp],fifo_rp<=fiforp+1;FIFO_WR为1,则fifodata[fifo_wr]<=fifo_in,fifo_wr<=fifo_wr+1。nempty、nfull位信号值的变化通过借助r_rp和cr_wr的进位输出来判断实现。当读写两个指针的值相等,即fifo_rp==fifo_wp时,判断cr_rp^cr_wr(异或)的值:若是1,则FIFO满,nfull<=0;若是0,则FIFO空,nempty<=0。如果fifo_rp!=fifo_wp,则nfull=nempty=0,FIFO不为空也不为满。
测试时,暂定容量FIFO_DEPTH为32(实际要求是至少一个帧的大小即1530字节大小),读、写时钟分别为50MHz和25MHz,在写550ns之后同时读写。时序仿真波形如图2所示,FIFO能够成功读写。
主控制模块的实现
主控制模块要求实现的功能是:4/8位数据的转换;给MAC层和PCS层的控制信号输出;双向数据MDIO,表征MII接口与物理层相连接的情况,可以异步输入输出控制。
实现4/8位数据转换的要求是:发送时,将8位数据分成两个nibble依次输出;接收时,将4b/5b编解码器接收到的4位数据依次填入高、低nibble组成8位数据输出。
采用状态寄存器对控制信号的输出是MII模块的核心。设立3位status1[2:0],从高位到低位依次是{duplex, col, crs}输入;4位status2[3:0],从高位到低位依次是{ transmitting ,transmiterror ,rx_en ,rx_er }输入。输出控制信号的基本算法流程如下:
.status1[2]为1时,工作在全双工模式。CollisionDetect和CarrierSense输出始终置为0。
.status1[2]为0时,工作在半双工模式。如果status1[1]为1,则CollisionDetect输出置为1,开始执行退回(backoff)程序;如果status1[0]为1,则CarrierSense输出置为1,继续等待。
. status2 [1]为1时,工作在接收状态,Receiving输出置为1 (此时status2[3]必须为0)。此时如果status2[0]为0,则接收数据有效,ReceiveDataValid输出为1;反之则置为0,停止数据传输。
. status2 [1]为0时,工作在接收停止状态,Receiving输出置为0。此时如果status2[0]为1,ReceiveDataValid输出为0,若接收端数据为1110,则表示载波错误,若接收端数据为0000,则表示正常的帧间隔阶段;如果status2[0]为0,则表示正常的帧间隔阶段,ReceiveDataValid输出为1。
. status2 [3]为1时,工作在发送状态,tx_en输出置为1(此时status2[1]必须为0)。此时如果status2[2]为0,则正常发送,tx_er置为0;否则发送错误,tx_er置为1,且跳过该字节继续执行发送程序。
. status2 [3]为0时,若status2 [2]为0,则处于正常帧间隔,tx_en、tx_er置为0;若status2 [2]为1,则为无效状态。
综合与仿真
本文采用Altela公司的Cyclone系列EP
结语
本文介绍了一种简易的基于FPGA的以太网MII协议的设计方法。通过本模块可以简单方便地实现小型嵌入式系统的因特网接口,如果再结合基于FPGA实现的MAC层协议和TCP/IP协议栈及其他辅助功能模块,不仅可以使小型嵌入式系统接入网络更加简单,系统的集成度、稳定性也将进一步得到提高。