Menu Close

IP层接收Verilog工程(eth_ip_rx.v)

IP层接收工程在网络综合实验架构中的位置如图1所示。

ethernet verilog code flowchart

图1

当MAC层接收到数据后,将处理过的数据存储到ip_rx_dram 双端口 RAM IP核, IP 接收层将读取 这个双端口 RAM IP核, 解析相关的IP协议,并送给IP的上层应用,如图2所示。

 

ip rx interface

图2

本模块主要有两个功能需要实现:检查IP包包头信息和将检查后的IP包写入乒乓Buffer。

需要检查IP头中的信息如下所示:

  • 以太网类型 : 0x0800
  • IP 头类型: 0x45
  • 是否是UDP 协议 : 0x11(17)
  • 源IP 地址是否正确
  • 目的IP地址是否正确
  • IP 头的checksum 检查是否正确

当检查过的以太网包都没有问题,将相应的数据写入到UDP_RX_DRAM,整个MAC包都会被写入到UDP_RX_DRAM中。 UDP 层将从MAC包中挑出UDP 的部分,在UDP rx 模块中进行解析。这样做主要是为了方便计算UDP 的checksum 部分。

 

主状态机ip_rx_st逻辑的描述如下,状态示意图如图3(注意省略了状态转移条件不满足时,停留在当前状态的箭头)所示:

状态0: 初始化相关的变量, 将IP_RX_DRAM 和UDP_RX_DRAM的 子地址指针都指向 1023的位置(16bit 地址) ,跳转到状态1。

状态1: 等待1个时钟周期,跳转到状态2。

状态2: 如果IP_RX_DRAM 中有数据包,同时UDP_RX_DRAM的buffer 为空,将ip_rx_addrb_sub = 0,跳转到状态3。

状态3: 读取IP_RX_DRAM中的MAC包长度,将ip_rx_addrb_sub = 1,跳转到状态4。

状态4: 写入MAC的34bytes 的数据,跳转到状态5。

状态5: 一直写入数据,直到MAC包中的数据完全写入成功,跳转到状态6。

状态6: 如果检查IP 包中发现错误,UDP_RX_DRAM的buffer 不会封口;如果没有错误,UDP_RX_DRAM的buffer 封口,同时写入包的程度,跳转到状态7。

状态7: 如果检查IP 包中发现错误,跳转到状态14; 如果检查IP 包中没有错误,跳转到状态15。

状态14: 错误处理,IP_RX_DRAM的buffer 指向下一个包的位置,跳转到状态0。

状态15: 正确处理,IP_RX_DRAM的buffer 指向下一个包的位置,UDP_RX_DRAM的buffer指向下一个包的位置,跳转到状态0。

ip rx state machine flowchart

图3 ip_rx_st 示意图

 


 

伴随状态机(ip_rx_chk_st)逻辑的描述如下,状态示意图如图4(注意省略了状态转移条件不满足时,停留在当前状态的箭头)所示:

在主状态机上,析出相关的数据, 中间任何一步检查到错误,都会跳转到状态14:

状态0:析出des MAC地址, 跳转到状态1。

状态1:析出src MAC地址, 跳转到状态2。

状态2:等待一个时钟周期,跳转到状态3。

状态3:析出 以太网类型 是否是0x0800,是则跳转到状态4,否则跳转到状态14。

状态4:析出IP 头类型是否是0x45,是则跳转到状态5,否则跳转到状态14。

状态5:计算到 第20 byte 的checksum,跳转到状态6。

状态6:读出IP协议类型,跳转到状态7。

状态7: 计算checksum。析出协议类型是否是0x11(UDP),是则跳转到状态8,否则跳转到状态14。

状态8:析出源IP地址, 计算checksum,跳转到状态9。

状态9: 计算checksum。判断源IP地址,如果错误,则跳转到状态14。否则析出目的IP地址,跳转到状态10。

状态10:计算checksum结果。判断目的IP地址,如果错误,则跳转到状态14。否则跳转到状态11。

状态11:如果checksum结果正确,跳转到状态15; 如果checksum 结果错误,跳转到状态14。

状态14:等待一个时钟周期,跳转到状态15。

状态15:等待rx_ip_end信号,跳转到状态0。

 

图4 ip_rx_chk_st示意图

Posted in FPGA, FPGA 教材教案, RISC-V架构, Verilog, 教材与教案, 文章