Menu Close

以太网UDP 实验(eth_ip_tx.v)

eth_ip_tx.v 模块是从UDP_TX_DRAM双端口中读取数据,加上MAC头 + 0800 + IP头 ,计算好IP头的checksum ,之后将数据流发送到TX_IP_FIFO中去.

ethernet verilog code flowchart

图1

ip tx interface

图2

ip_tx_st 状态机解析:

状态0: 初始化相关的数据, 将UDP_TX_DRAM 的子地址指向 1023,跳转到状态机1。

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

状态2: 检查UDP_TX_DRAM 的子地址1023,查看双端口读取出的数据,看看UDP是否有数据准备发送,如果有,跳转到状态机3。

状态3: 根据读出的UDP长度,计算出IP包的长度和以太网包的长度,跳转到状态机4。

状态4: 查看FIFO是否有空间可以存储数据,如果有足够的空间,跳转到状态机5。

状态5: 首先将长度信息写入到FIFO中去,跳转到状态机6。

状态6 – 8: 写入目的MAC地址,跳转到状态机9。

状态9 – 11: 写入源MAC地址,跳转到状态机12。

状态12: 写入0800 以太网类型 ,跳转到状态机13。

状态13- 22: 写入IP头信息 ,跳转到状态机23。

状态23: 读取UDP的数据,写入到FIFO中去,跳转到状态机24。

状态24: 清除UDP双端口,写入FIFO封口信息,跳转到状态机25。

状态25: 清除相关的寄存器 ,跳转到状态机26。

状态26: UDP乒乓buffer 地址转换,跳转到状态机0。

 

副状态机(ip_chk_st)计算IP头checksum :

在发送ip 包时,4500, 4000, 4011  , 前面6 bytes 的信息是固定的,直接计算好checksum 即可。

状态0: 计算 length 的checksum, 跳转状态1。

状态1: 计算 源IP的checksum, 跳转状态2。

状态2: 计算 源IP的checksum, 跳转状态3。

状态3: 计算 目的IP的checksum, 跳转状态4。

状态4: 计算 目的IP的checksum, 跳转状态5。

状态5: 计算 最终的checksum结果, 跳转状态6。

状态6: 表示checksum 计算结束。

 

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

 

图3 状态机示意图

 

eth_ip_tx.v 代码:


 

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