查看: 2897|回复: 1

FPGA千兆网UDP协议实现

[复制链接]
  • TA的每日心情

    2018-11-20 13:41
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2018-10-29 16:12:39 | 显示全部楼层 |阅读模式
    分享到:
    1)UDP简介

       在此,参考博主夜雨翛然的博文,关于UDP协议的简介:“UDP传输与IP传输非常类似。你可以将UDP协议看作IP协议暴露在传输层的一个接口。UDP协议同样以数据包(datagram)的方式传输,它的传输方式也是"Best Effort"的,所以UDP协议也是不可靠的(unreliable)。那么,我们为什么不直接使用IP协议而要额外增加一个UDP协议呢? 一个重要的原因是IP协议中并没有端口(port)的概念。IP协议进行的是IP地址到IP地址的传输,这意味着两台计算机之间的对话。但每台计算机中需要有多个通信通道,并将多个通信通道分配给不同的进程使用(关于进程,可以参考Linux进程基础)。一个端口就代表了这样的一个通信通道。正如我们在邮局和邮差中提到的收信人的概念一样。UDP协议实现了端口,从而让数据包可以在送到IP地址的基础上,进一步可以送到某个端口”。总结一句就是UDP只是开发出来辅助IP协议具体到端口传输的一个桥梁,对于一些简单的网络通信,UDP还能避免采用TCP这种复杂的传输方式。

    2)UDP协议

    UDP的数据包同样分为头部(header)和数据(payload)两部分。UDP是传输层(transport layer)协议,这意味着UDP的数据包需要经过IP协议的封装(encapsulation),然后通过IP协议传输到目的电脑。随后UDP包在目的电脑拆封,并将信息送到相应端口的缓存中。

    1.png

    伪首部:只用于计算校验和,传输数据时,只需要首部和数据

    源IP:本设计固定为192.168.0.2

    目的IP:本设计固定为192.168.0.3

    UDP长度:首部+数据的长度,单位为字节

    源端口: 固定为1000

    目的端口 :固定位10001

    长度:首部加数据的长度,单位为字节,8+data_len;

    检验和: 计算的是伪首部+首部+数据部分的校验和,其计算方式是:

    a、每两个字节为一组,然后相加,相加结果为17比特,则将最高比特位与低16位进行相加,得到一个16比特的数据;

    b、所有字节都相加完后,最终得到的结果再取反,就是首部的校验和。

    3)整体报文格式
    2.png
    涉及到的IP层以及MAC层报文格式,这里就不再详细阐述了。

    4)FPGA设计与实现(讨论FPGA发送部份)

      UDP协议的实现本质就是将数据按照上述图2的格式封装打包好,但是我这里的MAC层打包采用的是alter千兆网的MAC IP核,数据传输带宽是8bit,我会将数据封装打包好后,每个时钟周期以8bit的速率传输给MAC IP核进行MAC层的封装打包,当然,也可以不采用IP核,直接将数据封装打包好传送到上位机,打包部分我用了两个fifo,一个用于包文的存储,一个用于计算包文的个数,校验码会在包文进行打包前就先计算好。

    a、校验码的设计:

    涉及UDP与IP层的检验码计算,这里列举IP层的检验码计算方式,参考代码如下:
    1. always  @(posedge clk or negedge rst_n)begin
    2.     if(rst_n==1'b0)begin
    3.         assume_temp<= 0;
    4.     end
    5.     else if(add_cnt2)begin
    6.         assume_temp <= assume_sum+ip_assume_add[143-cnt2*16 -:16];
    7.     end
    8.      
    9. end


    10. always  @(*)begin
    11.     assume_sum <= assume_temp[16]+assume_temp[15:0];
    12. end

    13. always  @(posedge clk or negedge rst_n)begin
    14.     if(rst_n==1'b0)begin
    15.          end_cnt2_ff0 <= 0;
    16.     end
    17.     else begin
    18.         end_cnt2_ff0 <= end_cnt2;
    19.     end
    20. end


    21. always  @(posedge clk or negedge rst_n)begin
    22.     if(rst_n==1'b0)begin
    23.         assume <= 0;
    24.     end
    25.     else if(end_cnt2_ff0)begin
    26.         assume <= ~assume_sum;
    27.     end
    28. end
    复制代码

    b、sop、eop的设计

    这点我一开始理解是有错误的,我理解成了仅是发送数据data的第一个字节与最后一个字节,其实sop、eop指整个包文发送的第一个与最后一个字节,正确设计如下:
    1. always  @(posedge clk or negedge rst_n)begin
    2.     if(rst_n==1'b0)begin
    3.         ff_tx_sop <= 0;
    4.     end
    5.     else if(fifo_data_rd==1&&add_cnt1==1&&cnt1==1-1)begin
    6.         ff_tx_sop <= 1;
    7.     end
    8.     else begin
    9.         ff_tx_sop <= 0;
    10.     end
    11. end

    12. always  @(posedge clk or negedge rst_n)begin
    13.     if(rst_n==1'b0)begin
    14.         ff_tx_eop <= 0;
    15.     end
    16.     else if(fifo_data_rd==1&&end_cnt1)begin
    17.         ff_tx_eop <= 1;
    18.     end
    19.     else begin
    20.         ff_tx_eop <= 0;
    21.     end
    22. end
    复制代码

    5)效果展示:
    3.png
    4.png

    当然,这里数据全部发8‘hff仅是为了简单验证,下一步我会继续丰富完善该部分内容,对输入报文进行切包处理,至此,UDP数据打包发送完毕。

    本文作者 谭渣渣

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 22:13
  • 签到天数: 1804 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2018-11-19 10:19:49 | 显示全部楼层
    很不错的资料,学习一下。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 19:45 , Processed in 0.137389 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.