FPGA千兆网UDP协议实现

上一篇百兆网接口的设计与使用,我们接着来进行FPGA百兆网UDP(User Datagram Protocol)协议的设计。

1)UDP简介

在此,参考博主夜雨翛然的博文“https://www.cnblogs.com/HPAHPA/p/7737531.html”关于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: UDP数据格式

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

源IP:本设计固定为192.168.0.2

目的IP:本设计固定为192.168.0.3

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

源端口: 固定为1000

目的端口 :固定位10001

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

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

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

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

3)整体报文格式

参考博主洋葱洋葱的“https://www.cnblogs.com/cofin/p/9306770.html”博文

图 2:  UDP协议整体报文发送格式

涉及到的IP层以及MAC层报文格式,这里就不再详细阐述了。

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

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

a、校验码的设计:

列举IP层的检验码计算方式,参考代码如下:

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1‘b0)begin
        assume_temp<= 0;
    end
    else if(add_cnt2)begin
        assume_temp <= assume_sum+ip_assume_add[143-cnt2*16 -:16];
    end

end

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

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1‘b0)begin
         end_cnt2_ff0 <= 0;
    end
    else begin
        end_cnt2_ff0 <= end_cnt2;
    end
end

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1‘b0)begin
        assume <= 0;
    end
    else if(end_cnt2_ff0)begin
        assume <= ~assume_sum;
    end
end

 b、sop、eop的设计

这点我一开始理解是有错误的,我理解成了仅是发送数据data的第一个字节与最后一个字节,其实sop、eop指整个包文发送的第一个与最后一个字节,正确设计如下:

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1‘b0)begin
        ff_tx_sop <= 0;
    end
    else if(fifo_data_rd==1&&add_cnt1==1&&cnt1==1-1)begin
        ff_tx_sop <= 1;
    end
    else begin
        ff_tx_sop <= 0;
    end
end

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1‘b0)begin
        ff_tx_eop <= 0;
    end
    else if(fifo_data_rd==1&&end_cnt1)begin
        ff_tx_eop <= 1;
    end
    else begin
        ff_tx_eop <= 0;
    end
end

5)效果展示:

当然,这里数据全部发ff也是不太合理的,至此,UDP数据打包发送完毕。

原文地址:https://www.cnblogs.com/tanqiqi/p/9441973.html

时间: 2024-10-12 19:12:38

FPGA千兆网UDP协议实现的相关文章

AC6102 开发板千兆以太网UDP传输实验

AC6102 开发板千兆以太网UDP传输实验 在芯航线AC6102开发板上,设计了一路GMII接口的千兆以太网电路,通过该以太网电路,用户可以将FPGA采集或运算得到的数据传递给其他设备如PC或服务器,或者接收其他设备传输过来的数据并进行处理. 接触过以太网的用户,应该最常听说的是TCP/IP协议,确实,在PC端或者嵌入式系统中,TCP/IP协议应用非常广泛,因此,当大家看到FPGA上带有以太网接口时,可能第一个想到的也是实现TC/IP协议.这里,首先可以很肯定的告诉大家,使用FPGA实现TCP

MiS603开发板 第十三章 千兆网RGMII PHY测试

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第十三章 千兆网RGMII PHY测试 13.1 RGMII 简介 RGMII(Reduced Gigabit Me

Dalsa Sherlock 直连千兆网相机(通用驱动)

支持 Sherlock 7.1.7.2,用于千兆网相机与 Sherlock 的连接. 可适用于很多厂商的相机,如:巴斯勒(Basler),JAI,堡盟相机(Baumer),灰点相机(Point Grey)...等等 1. 支持多个相机连接: 2. 支持黑白和彩色相机的单独或并存连接: 3. 支持采集图像buffer(防漏检),可设置队列的大小,是否启用: 4. 可根据相机序号(sn)进行排序(0,1,2-): 5. 可配置硬件触发.连续触发和初始化时相机的各个参数: 6. 可在sherlock中

linux fedora 14(内核2.6.35.6) PF_RING+libpcap 极速捕获千兆网数据包,不丢包

前面讲到了libpcap 捕获数据包,尤其在千兆网的条件下,大量的丢包,网上搜索好久,大概都是PF_PACKET +MMAP,NAPI,PF_RING之类的方法,我对PF_RING+libpcap进行实验,发现千兆网条件下,捕获数据包的性能很好,几乎不丢包, 实验环境搭配流程如下: 1)下载PF_RING:svn co https://svn.ntop.org/svn/ntop/trunk/PF_RING/ 2)下载完后,在PF_RING/kernel下面make编译pf_ring,生成pf_r

迅为双核imx6DL核心板_ARM定制专家_Cortex SATA 千兆网 4G GPS

核心板参数 尺寸:51mm*61mm CPU:Freescale Cortex-A9 双核精简版 i.MX6DL,主频 1.2 GHz 内存:1GB DDR3 存储:8GB EMMC 存储 EEPROM:4MB的EEPROM用来存储关键数据 电源管理:内部独立 工作电压:5V 系统支持:Linux-QT/Android/Ubuntu操作系统 引角扩展:引出脚多达320个,满足用户各类扩展需求 SATA接口:无 商业级运行温度:0℃到+70 ℃ 配套底板: 核心板正面: 核心板背面: 丝印图: C

FPGA设计千兆以太网MAC(2)——以太网协议及设计规划

上篇该系列博文中通过MDIO接口实现了PHY芯片的状态检测,验证其已处于1000M 全双工工作模式.在设计MAC逻辑之前,要先清楚MAC与PHY之间的接口以及以太网协议细节,这样才能保证网络的兼容性.本文内容多来自Xilinx官方文档pg051 tri-mode-eth-mac. 1.GMII接口 此处使用较简单的GMII接口,接口列表及说明如下: TX方向时钟tx_mac_aclk由FPGA给出,RX方向时钟gmii_rx_clk由PHY芯片经过内部CDR模块从接收数据中恢复出来,时钟频率均为

MiS603开发板 第十四章 UDP协议网络传输

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第十四章 UDP协议网络传输 本实验将实现FPGA 芯片和PC 之间进行千兆以太网数据通信, 通信协议采用Ether

【小梅哥FPGA进阶学习之旅】基于Altera FPGA 的DDR2+千兆以太网电路设计

DDR2电路设计 在高速大数据的应用中,高速大容量缓存是必不可少的硬件.当前在FPGA系统中使用较为广泛的高速大容量存储器有经典速度较低的单数据速率的SDRAM存储器,以及速度较高的双速率DDR.DDR2.DDR3型SDRAM存储器,DDR系列的存储器都需要FPGA芯片有对应的硬件电路结构支持.对于Altera Cyclone IV系列的FPGA,其最高支持到DDR2存储器(不支持DDR3存储器,到了Cyclone V系列的FPGA才支持DDR3存储器).芯航线AC6102开发板作为一个高速应用

千兆网络中——使用五类线、超五类线和六类线的区别

去年入手了一台Seagate的Central.一直没时间好好研究,直接插上就用了.内网速度一直维持在10M-15M左右.今年618换了款千兆路由器,速度瞬间提升到了50M-70M.线缆用的都是五类,心中就产生疑问:如果换成超五类线或者六类线,性能是不是能再提高点??于是网上搜到一个哥们十分专业的回答,忍不住粘下来跟大家共享: 原帖地址:http://we.poppur.com/thread-1098485-1-1.html 5类线的传输频率标准是100MHz  超5一般是125MHz  6类标准