Menu Close

MAC层发送 Verilog 工程(网络综合设计)

在网络综合设计中,IP层发送模块中将数据写入MAC层发送的FIFO中。MAC层发送模块需要将payload数据打成完整的以太网数据包后,以8-bit的数据形式伴随着数据使能,根据PHY层的网速发给PHY。本文将实现MAC发送模块。

1.MAC层发送需要实现的任务

MAC层发送模块需要完成的任务如下:

  • 从18 in/9 out FIFO中读出IP层传递过来的数据包(判断是否需要加上Padding)
  • 加上CRC校检
  • 将处理过的数据传递进8/8的乒乓buffer,为之后的数据处理提供更高的效率
  • 加上前导字(preamble),以及在数据包和数据包之间的GAP,将数据包按照检测出的网速(MII和RGMII/GMII分开)发送给PHY层

2.MAC层发送部分的框图结构

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

图1 网络综合实验框图

图2所示为MAC层的发送(eth_mac_tx.v)。

图2 eth_mac_tx.v

3.MAC层发送设计

MAC层发送的代码中主要有tx_ip_fifo_st和mac_tx_st两个状态机。tx_ip_fifo_st读从IP层发送过来的FIFO数据(判断是否需要加上padding),并将其加上CRC后,写入A/B Buffer。mac_tx_st读出A/B Buffer里的数据,根据MII的类型(MII/RGMII等)分开发送前导字和数据,最后加上数据包之间的gap。之所以需要分开MII的类型发送前导字和数据,是因为在一个时钟下MII无法发送1个字节,而RGMII可以在一个时钟下发送1个字节。

tx_ip_fifo_st:

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

  • 状态0和状态1指定了读A/B Buffer的地址,因为A/B Buffer是双端口RAM,需要等待两个时钟周期才能成功读出数据
  • 状态2判断读出的标志,指示当前A/B Buffer是否可写
  • 状态3和状态4将FIFO中存储的数据长度读出来
  • 状态5将FIFO中的数据读出,写入A/B Buffer
  • 状态6可根据上层接口调整(这里也可以省略)
  • 状态7检查不加CRC的数据包长度是否大于60,如果数据包长度小于60,填充数据0,直到数据包长度达到60
  • 状态8,状态9,状态10,状态11在数据包末尾加上CRC
  • 状态12和13将数据总长度,A/B Buffer可读的标志写进A/B Buffer
  • 状态14和状态15转到A/B Buffer另一侧,重新准备写入数据

 

图3 tx_ip_fifo_st流程图

 

因为FIFO是18 in/9 out,Xilinx FIFO IP不等宽的端口读写数据的顺序如图4和图5所示:

图4

图5

4.MAC层发送Verilog代码

MAC层发送,eth_mac_tx.v的代码如下(这里省略了CRC32生成代码,详情见文章互联网MAC层CRC32 生成器):


 

mac_tx_st:

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

  • 状态0和状态1指定了读A/B Buffer的地址,因为A/B Buffer是双端口RAM,需要等待两个时钟周期才能成功读出数据
  • 状态2判断读出的标志,指示当前A/B Buffer是否可读
  • 状态3和状态4将A/B Buffer中存储的数据长度读出来,并且状态4将MII和RGMII/GMII分开
  • 状态5和状态6发送MII的前导字
  • 状态7和状态8发送MII的数据
  • 状态9发送RGMII/GMII的前导字
  • 状态10发送RGMII/GMII的数据
  • 状态11和状态12发送数据包之间的gap
  • 状态12转到A/B Buffer另一侧,重新准备读数据

 

图6 mac_tx_st流程图

关于模块的详细解释请参见对应的视频。

Posted in FPGA, FPGA 教材教案, Verilog, Vivado, Vivado, 开发工具, 开发工具, 开发语言, 教材与教案, 文章, 编程语言