接着上一篇百兆网接口的设计与使用,我们接着来进行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、校验码的设计:

涉及UDP与IP层的检验码计算,这里列举IP层的检验码计算方式,参考代码如下:

always  @(posedge clk or negedge rst_n)begin
if(rst_n=='b0)begin
assume_temp<= ;
end
else if(add_cnt2)begin
assume_temp <= assume_sum+ip_assume_add[-cnt2* -:];
end end always @(*)begin
assume_sum <= assume_temp[]+assume_temp[:];
end always @(posedge clk or negedge rst_n)begin
if(rst_n=='b0)begin
end_cnt2_ff0 <= ;
end
else begin
end_cnt2_ff0 <= end_cnt2;
end
end always @(posedge clk or negedge rst_n)begin
if(rst_n=='b0)begin
assume <= ;
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=='b0)begin
ff_tx_sop <= ;
end
else if(fifo_data_rd==&&add_cnt1==&&cnt1==-)begin
ff_tx_sop <= ;
end
else begin
ff_tx_sop <= ;
end
end always @(posedge clk or negedge rst_n)begin
if(rst_n=='b0)begin
ff_tx_eop <= ;
end
else if(fifo_data_rd==&&end_cnt1)begin
ff_tx_eop <= ;
end
else begin
ff_tx_eop <= ;
end
end

5)效果展示:

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

注:本文未经允许,禁止转载,违者必究。

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

  1. 010 FPGA千兆网UDP通信【转载】

    一.以太网帧格式 图8‑12以太网帧格式 表8‑5以太网帧格式说明 类别 字节数 说明 前导码(Preamble) 8 连续 7 个 8'h55 加 1 个 8'hd5,表示一个帧的开始,用于双方设备 ...

  2. 011 FPGA千兆网TCP通信【转载】

    一.LWIP 首先通过上面的简单分析,我们应该很清楚一件事:TCP协议很复杂,光握手过程就需要"三次握手.四次挥手"的复杂过程,不是特别适合FPGA的纯逻辑实现,因为用FPGA实现 ...

  3. 千兆以太网TCP协议的FPGA实现

    转自https://blog.csdn.net/zhipao6108/article/details/82386355 千兆以太网TCP协议的FPGA实现 Lzx 2017/4/20 写在前面,这应该 ...

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

    AC6102 开发板千兆以太网UDP传输实验 在芯航线AC6102开发板上,设计了一路GMII接口的千兆以太网电路,通过该以太网电路,用户可以将FPGA采集或运算得到的数据传递给其他设备如PC或服务器 ...

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

    AC6102 开发板千兆以太网UDP传输实验 在芯航线AC6102开发板上,设计了一路GMII接口的千兆以太网电路,通过该以太网电路,用户可以将FPGA采集或运算得到的数据传递给其他设备如PC或服务器 ...

  6. 千兆网数据CRC检验和过滤

    项目简述 本次项目在计算机将图像数据信息通过千兆网发送给FPGA后,由于接收到的数据可能混乱和无效,需要对数据CRC校验和无效包过滤. 项目原理及框图 对iddr_ctrl模块的输入数据和使能信号,分 ...

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

    支持 Sherlock 7.1.7.2,用于千兆网相机与 Sherlock 的连接. 可适用于很多厂商的相机,如:巴斯勒(Basler),JAI,堡盟相机(Baumer),灰点相机(Point Gre ...

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

    前面讲到了libpcap 捕获数据包,尤其在千兆网的条件下,大量的丢包,网上搜索好久,大概都是PF_PACKET +MMAP,NAPI,PF_RING之类的方法,我对PF_RING+libpcap进行 ...

  9. 华为S5700S-52P-LI-AC千兆网管交换机web登录界面配置

    研究一下午,包装附的说明书根本就是错误的,通过技术售后和官方的文档结合,总算可以登录交换机的web管理界面. 首先需要使用通讯控制线缆(包装中附)连接电脑和交换机,一头接交换机的Console口,一头 ...

随机推荐

  1. Java实例---简单的数据库操作

    源码分析 DAOFactory.java package cn.ftl.mysql ; public class DAOFactory { public static IEmpDAO getIEmpD ...

  2. Asp.Net MVC Identity 2.2.1 使用技巧(七)

    创建角色管理相关视图 1.添加视图 打开RolesAdminController.cs   将鼠标移动到public ActionResult Index()上  右键>添加视图   系统会弹出 ...

  3. Oracle与EntityFramework(EF)的一些事情

    概要 Oracle 和EF 一起用的时候总会有各种问题,这里总结一下解决办法. 模式 Schema 用过Oracle的人应该知道,其实Oracle的用户名一般就是它的模式名称,如果你在用databas ...

  4. 深入剖析php执行原理(4):函数的调用

    本章开始研究php中函数的调用和执行,先来看函数调用语句是如何被编译的. 我们前面的章节弄明白了函数体会被编译生成哪些zend_op指令,本章会研究函数调用语句会生成哪些zend_op指,等后面的章节 ...

  5. 【转】用instruments来检验你的app

    一篇非常好的关于instruments使用的文章! 连接在此

  6. AngularCLI介绍及配置文件主要参数含义解析

    使用Angular CLI可以快速,简单的搭建一个angular2或angular4项目,是只要掌握几行命令就能构建出前端架构的最佳实践,它本质也是使用了webpack来编译,打包,压缩等构建的事情, ...

  7. asp,mdb,工具

    <%set conn=Server.CreateObject("ADODB.Connection")conn.Provider="Microsoft.Jet.OLE ...

  8. BZOJ1972:[SDOI2010]猪国杀(模拟)

    Description 太长就不贴过来了 Solution 这个题是真的不难写……唯一的难度就在于理解题意上面……感觉这就是个阅读理解题啊…… 而且你三国杀玩的越多可能就越难写因为你无法理解那些猪的思 ...

  9. BZOJ1012:[JSOI2008]最大数maxnumber(线段树)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L 个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. ...

  10. tar 打包带软连接的文件

    打包普通文件夹,压缩带参数z,创建tar.gz tar -cvf ./tmp/SK_Aug_camera.tar ./gap_40_5 但是文件夹里含有软连接,带参数 h tar -cvhf ./tm ...