Menu Close

MAC层接收 verilog 工程(网络综合实验)

图1所示为网络综合实验框图,其中红框部分是MAC层的接收(eth_mac_rx.v)。

图1 网络综合实验框图

 

图2所示为MAC层的接收(eth_mac_rx.v)。

图2 eth_mac_rx.v

 

MAC层的接收(eth_mac_rx.v)流程有以下的步骤:

  • 接收PHY传递过来的数据包:
    • 判断并拆除前导字(preamble)
    • 判断数据包的大小是否满足IEEE 802.3的定义(数据包长度小于1518,且大于64个字节)
    • 判断数据是否有效
    • 判断数据包之间的GAP是否至少为9
  • 将处理过的数据递进FIFO,注意FIFO里的数据是9-bit,低位8-bit是传输的数据,最高位bit的作用是隔断数据包和标记出错误的数据包。
  • 计算数据包的CRC
  • 将处理过的数据传递进8/16的AB buffer,为之后的数据处理提供更高的效率

注意,由于MAC层的接收比较复杂,所以专门创建了一个mac_error的寄存器,每一个bit的定义如下:

  • mac_error[0] : 以太网数据包包头错误
  • mac_error[1] : FIFO满
  • mac_error[2] : 以太网数据包长度大于1518字节
  • mac_error[3] : 以太网数据包长度小于64字节
  • mac_error[4] : 以太网数据包 gap 错误
  • mac_error[5] : 保留
  • mac_error[6] : 保留
  • mac_error[7] : 以太网数据包CRC错误

 

eth_mac_rx.v的代码如下(这里省略了CRC模块代码,详情可见文章互联网MAC层CRC32 Check Verilog 代码):


 

其中有rx_mac_st和rx_fifo_st两个状态机。rx_mac_st用来处理PHY层发过来的数据包,并将提取出来的数据送进FIFO。rx_fifo_st是将FIFO里的值写入A/B Buffer。接下来对这两个状态机进行分析如下:

rx_mac_st:

图3所示为rx_mac_st状态机的简易状态转移图(注意省略了状态转移条件不满足时,停留在当前状态的箭头)。

  • 状态0是复位状态
  • 状态1开始接收数据包
  • 状态2负责检查数据包的前导字
  • 状态3将提取出的数据写进FIFO
  • 转换4和状态5负责处理数据包快结束的时候可能会出现的错误,比如FIFO已经满,数据包长度不符合IEEE 802.3的标准等
  • 状态7用来处理在状态2,3,4,5中所有可能出现的错误,并在FIFO封包时将错误标志立起来

图3 rx_mac_st流程图

 

rx_fifo_st:

图4所示为rx_fifo_st状态机的简易状态转移图(注意省略了状态转移条件不满足时,停留在当前状态的箭头)。

  • 状态0和状态1指定了读A/B Buffer的地址,因为A/B Buffer是双端口RAM,需要等待两个时钟周期才能成功读出数据
  • 状态2判断读出的标志,指示当前A/B Buffer是否可写
  • 状态3将FIFO的数据读出,写进A/B Buffer
  • 状态4判断CRC
  • 状态5和6将数据总长度,A/B Buffer可读的标志写进A/B Buffer
  • 状态7转到A/B Buffer另一侧,重新准备写入数据

 

 

图4 rx_fifo_st流程图

Posted in FPGA, FPGA 教材教案, Vivado, 开发工具, 教材与教案, 文章