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、校验码的设计:
涉及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协议实现的更多相关文章
- 010 FPGA千兆网UDP通信【转载】
一.以太网帧格式 图8‑12以太网帧格式 表8‑5以太网帧格式说明 类别 字节数 说明 前导码(Preamble) 8 连续 7 个 8'h55 加 1 个 8'hd5,表示一个帧的开始,用于双方设备 ...
- 011 FPGA千兆网TCP通信【转载】
一.LWIP 首先通过上面的简单分析,我们应该很清楚一件事:TCP协议很复杂,光握手过程就需要"三次握手.四次挥手"的复杂过程,不是特别适合FPGA的纯逻辑实现,因为用FPGA实现 ...
- 千兆以太网TCP协议的FPGA实现
转自https://blog.csdn.net/zhipao6108/article/details/82386355 千兆以太网TCP协议的FPGA实现 Lzx 2017/4/20 写在前面,这应该 ...
- AC6102 开发板千兆以太网UDP传输实验2
AC6102 开发板千兆以太网UDP传输实验 在芯航线AC6102开发板上,设计了一路GMII接口的千兆以太网电路,通过该以太网电路,用户可以将FPGA采集或运算得到的数据传递给其他设备如PC或服务器 ...
- AC6102 开发板千兆以太网UDP传输实验
AC6102 开发板千兆以太网UDP传输实验 在芯航线AC6102开发板上,设计了一路GMII接口的千兆以太网电路,通过该以太网电路,用户可以将FPGA采集或运算得到的数据传递给其他设备如PC或服务器 ...
- 千兆网数据CRC检验和过滤
项目简述 本次项目在计算机将图像数据信息通过千兆网发送给FPGA后,由于接收到的数据可能混乱和无效,需要对数据CRC校验和无效包过滤. 项目原理及框图 对iddr_ctrl模块的输入数据和使能信号,分 ...
- Dalsa Sherlock 直连千兆网相机(通用驱动)
支持 Sherlock 7.1.7.2,用于千兆网相机与 Sherlock 的连接. 可适用于很多厂商的相机,如:巴斯勒(Basler),JAI,堡盟相机(Baumer),灰点相机(Point Gre ...
- linux fedora 14(内核2.6.35.6) PF_RING+libpcap 极速捕获千兆网数据包,不丢包
前面讲到了libpcap 捕获数据包,尤其在千兆网的条件下,大量的丢包,网上搜索好久,大概都是PF_PACKET +MMAP,NAPI,PF_RING之类的方法,我对PF_RING+libpcap进行 ...
- 华为S5700S-52P-LI-AC千兆网管交换机web登录界面配置
研究一下午,包装附的说明书根本就是错误的,通过技术售后和官方的文档结合,总算可以登录交换机的web管理界面. 首先需要使用通讯控制线缆(包装中附)连接电脑和交换机,一头接交换机的Console口,一头 ...
随机推荐
- switch与java
switch结构可以更好的解决等值判断问题switch 选择结构的语法:switch (表达式){case 常量 1://代码块1:break;case 常量 2://代码块2:break;..... ...
- MapReduce Design Patterns(chapter 2(part 1))(二)
随着每天都有更多的数据加载进系统,数据量变得很庞大.这一章专注于对你的数据顶层的,概括性意见的设计模式,从而使你能扩展思路,但可能对局部数据是不适用的.概括性的分析都是关于对相似数据的分组和执行统计运 ...
- ZT android -- 蓝牙 bluetooth (三)搜索蓝牙
android -- 蓝牙 bluetooth (三)搜索蓝牙 分类: Android的原生应用分析 2013-05-31 22:03 2192人阅读 评论(8) 收藏 举报 bluetooth蓝牙s ...
- Spring JPA 主键
JPA主键生成器和主键生成策略 JPA中创建实体时,需要声明实体的主键及其主键生成策略.我们有一个实体类叫做Email,其主键上声明如下: @Id @Column(name = "EMAIL ...
- Django的时区设置问题
1.Django的时区问题 django默认的时区是UTC,平时是没有什么影响的,但是在需要将时间戳转换成本时区的时间或者是获取当前的本地的localtime的时候就出现了问题.之前程序在测试时是运行 ...
- 5 个强大的 HTML5 API
HTML5提供了一些非常强大的JavaScript和HTML API,来帮助开发者构建精彩的桌面和移动应用程序.本文将介绍5个新型的API,希望对你的开发工作有所帮助. 1. 全屏API(Fulls ...
- mvc數據遷移
在本节中,我们将使用Entity Framework Code First 数据迁移功能将模型类的改变应用到数据库中. 默 认情况下,当我们使用Entity Framework Code First ...
- 新闻cms管理系统(一) ---- thinkphp框架准备
1.thinkphp介绍 一个快速.简单的基于MVC和面向对象的轻量级PHP开发框架 MVC:M数据层. V视图层 . C控制层 优点: (1)入手非常快 (2)thinkpjp提供核心内库.文件.函 ...
- PHP去重可用
//国外 $arr6 = array_merge($arr2,$arr4); $arr8 = array(); $arr10 = array(); foreach($arr6 as $k6=> ...
- 博客存档TensorFlow入门一 1.4编程练习
import tensorflow as tf import numpy import matplotlib.pyplot as plt #from sklearn.model_selecti ...