微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于FPGA的以太网MII接口扩展设计与实现

基于FPGA的以太网MII接口扩展设计与实现

时间:02-11 来源:互联网 点击:

借助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之后同时读写。

主控制模块的实现

主控制模块要求实现的功能是: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,eceiveDataValid输出为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系列EP1C20F400C8芯片,整个设计全部采用Verilog HDL硬件描述语言来实现,并在Quatus4.0的设计平台上完成整个模块的设计、综合、仿真、映射及布局布线。发送时序仿真的波形如图3所示,从图中可以看出,当传输过程中发生冲突时,继续发送32比特的阻塞码(16进制FF),然后随机延时一段时间重新争用介质以传输数据,这说明本模块满足了协议要求以及CSMA/CD。

结语

本文介绍了一种简易的基于FPGA的以太网MII协议的设计方法。通过本模块可以简单方便地实现小型嵌入式系统的因特网接口,如果再结合基于FPGA实现的MAC层协议和TCP/IP协议栈及其他辅助功能模块,不仅可以使小型嵌入式系统接入网络更加简单,系统的集成度、稳定性也将进一步得到提高。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top