Menu Close

以太网UDP 实验(eth_udp_tx.v)

当从应用层得到数据时, eth_udp_tx.v 模块将在应用层发送过来数据的基础上,附加上udp 源port, udp 目的port , udp 长度, udp 的checksum 信息。 打成一个完整的udp包,送给ip层。在这个模块中,UDP_TX_CHECKSUM_EN 参数用来控制是否在udp 数据上加载checksum信息,如果不加载checksum 信息, 在checksum 的位置上填写0; 如果加载checksum,就需要计算 udp 头和整体的udp 数据,生成真实的checksum。

ethernet verilog code flow chart

图1

ethernet UDP interface

图2

本节内容关心的一些关键信号,以时序图的方式呈现,如图3所示:

图3

 

udp_tx_st和udp_chk_st两个状态机的示意如图4(注意省略了状态转移条件不满足时,停留在当前状态的箭头)所示。

图4 udp_tx_st和udp_chk_st状态机示意图

 

udp_tx_st 状态机逻辑:

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

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

状态机2:当buffer 目前为空,跳转到状态机3。

状态机3:在地址0 的位置上填写udp 源port,跳转到状态机4。

状态机4:在地址1 的位置上填写udp 目的port,跳转到状态机5。

状态机5:先是在地址3 的位置上填写udp checksum 为 0,跳转到状态机6。

状态机6:将应用层的数据(byte)写入到buffer中去,跳转到状态机7。

状态机7:将应用层的数据(byte)写入到buffer中去,跳转到状态机8,如果没有数据,跳转到状态9。

状态机8:将应用层的数据(byte)写入到buffer中去,跳转到状态机7,如果没有数据,跳转到状态9。

状态机9:正常的数据包结束,在地址2 的位置上填写udp 的长度,如果需要计算checksum,跳转到状态10; 如果不需要checksum, 跳转到状态13。

状态机10:在udp头上填写udp 的checksum,跳转到状态13。

状态机13:对UDP_TX_DRAM的buffer进行封包,跳转到状态14。

状态机14:跳转到状态15。

状态机15:UDP_TX_DRAM的buffer 加一,跳转到状态0。

 

udp_chk_st 伴随状态机:

状态0: 初始化 udp_chk_sum = 16’h0011, 跳转状态 1。

状态1: 计算udp 数据的checksum, 当udp数据写入结束后,跳转状态 2。

状态2: 再计算一次udp length的checksum,跳转状态 3。

状态3: 计算源ip 地址checksum,跳转状态 4。

状态4: 计算源ip 地址checksum,跳转状态 5。

状态5: 计算目的ip 地址checksum,跳转状态 6。

状态6: 计算目的ip 地址checksum,跳转状态 7。

状态7: 计算完整的udp的checksum,标识udp checksum 计算结束,跳转状态 8。

状态8: 等待当前包封包结束,跳转状态 0。

 

eth_udp_tx.v 代码:

更多详细内容请参考相关视频。

扩展练习:将本模块中的一段式状态机改成三段式状态机实现。

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