万兆以太网MAC设计(14)FPGA实现巨型以太网数据帧传输

前言

万兆以太网设计最终章节,巨型以太网数据帧传输设计。对于标准以太网而言,数据传输范围为46-1500字节,当大于1500字节后数据将无法传输。在IP层的报文描述当中,有一个分片字段,通过该字段即可实现将巨型数据帧拆分为多个小于1500字节的数据进行传输。

一、UDP_RX模块设计

在UDP接收模块当中增加以下新设计:

  1. 将接收到的数据先存入RAM当中,如果当前数据是一个单独的包,则立刻输出,如果是一个分片数据包,则继续等待所有分片输入后,一次性输出完整的巨型数据帧。通过w_recv_pkt_end 信号判断当前是否接收到了完整的数据包。看似简单,实则经历了极其漫长的调试工作。。
//完整的一个包输入指示信号
//表示没有分片,那么last到来即一个包结束; 分片但是当前分片后没有更多片
assign w_recv_pkt_end = r_udp_pkt_valid && ((rs_axis_ip_last && r_udp_split == 0 && r_udp_offset == 0) || 
                        (rs_axis_ip_last && r_udp_split == 1 && r_udp_more_split == 0));
  1. r_udp_pkt_valid指示信号,该信号用于判断当前数据是否是一个有效的UDP数据包,只有当数据有效,我们才会将其数据存入RAM,并且将其长度信息存入FIFO。(看似简单,实则调试时候诸多BUG源于此信号判断)
 //检测是否为UDP数据包,通过user当中的type字段判断即可
always @(posedge i_clk or posedge i_rst) begin
    if(i_rst)
        r_udp_pkt_valid <= 'd0;
    else if(s_axis_ip_valid && !rs_axis_ip_valid && s_axis_ip_user[36:29] == 8'd17 && w_ip_flags[2] == 0)//分片udp没有包头
        r_udp_pkt_valid <= 'd1;
    else if(s_axis_ip_valid && !rs_axis_ip_valid && ((s_axis_ip_user[36:29] != 8'd17) || (s_axis_ip_data[47:32] != ri_dymanic_src_port)))
        r_udp_pkt_valid <= 'd0;
    else if(s_axis_ip_valid && !rs_axis_ip_valid && s_axis_ip_user[36:29] == 8'd17 && s_axis_ip_data[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顺子学不会FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值