千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP接收)

文章目录

  • 前言
  • 心得体会
  • 一、 UDP 协议简单回顾
  • 二、UDP接收实现
  • 三、完整代码展示
  • 四、仿真测试
    • (1)模拟电脑数据发送,
    • (2)测试顶层文件编写
    • (3)仿真文件
    • (4)仿真波形


前言

在前面我们对以太网 UDP 帧格式做了讲解,UDP 帧格式包括前导码+帧界定符、以太网头部数据、IP 头部数据、UDP 头部数据、UDP 数据、FCS 数据,以太网接收模块同样是按照该格式接收数据。

提示:任何文章不要过度深思!万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」 ;不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人 。怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」

心得体会

(1)UDP接收数据,无论是MAC地址,还是IP地址,或者UDP端口,其源端口都为计算机;
(2)在接收数据时不关心源端口(计算机)的MAC地址,还是IP地址,或者UDP端口,只关心目的地址,也就是说接收数据时可以将源端口MAC地址,IP地址,UDP端口全部置 0;
(3)验证时一定要弄清目的地址(开发板)的MAC和P地址,这里与UDP发送中目的MAC、IP(计算机)是相反的,此处需要注意;
(4)本实验针对千兆网,注意查看电脑是否支持。

一、 UDP 协议简单回顾

以太网 UDP 帧的用户数据是打包在 UDP 协议中,而 UDP 协议又是基于 IP 协议之上的,IP 协议又是走 MAC 层发送的,即从包含关系来说:MAC 帧中的数据段为 IP 数据报文,IP 报文中的数据段为 UDP 报文,UDP 报文中的数据段为用户希望传输的数据内容下图为使用 UDP 协议发送数据的层层打包示意图。
在这里插入图片描述
其中,和以太网帧、IP 报文具有帧头一样,UDP 数据报也包含了一个 UDP 报头部分,与 UDP 协议相关的一些信息如端口号,数据包长度等会被打包进 UDP 报头中,然后再与需要传输的 UDP 报文数据一起,作为 IP 报文的数据段送往 IP 层发送。

二、UDP接收实现

GMII 接口信号连接关系及各信号的介绍如下。
1
(注:表格中的方向是站在 MAC 侧角度看的)

在这里插入图片描述
此处给出GMII 接口信号连接关系及各信号的介绍,是为了明确UDP发送与接收需要什么输入与输出。

下面将对各个状态的实现及功能进行简要介绍。

  1. IDLE
    空闲状态,当产生接收数据有效信号时,进入PREAMBLE_CODE状态,否则处于 IDLE 状态,代码如下所示:
 IDLE:     beginGMII_RX_DONE <= 0;if(GMII_DV_reg1 && !GMII_DV_reg2)begincurr_state <= PREAMBLE_CODE;crc_init <= 1;endelsecurr_state <= curr_state;end

上述代码中的GMII_DV_reg1 信号是将接收数据有效信号GMII_DV寄存之后打一拍得到的,GMII_DV_reg2 信号是将GMII_DV_reg1信号打一拍得到的,将GMII_DV_reg2 信号取反与
GMII_DV_reg1 相与得到接收数据有效脉冲,得到该信号之后,进入到PREAMBLE_CODE 状态,
在这里插入图片描述

GMII_DV_reg1 信号和GMII_DV_reg2 信号的实现代码如下所示,代码中对GMII_TXD 信号也进
行了寄存和打拍操作,得到crc_data用于计算crc校验判断与接收到的CRC值是否一致,后续有关crc_xx名称均为计算crc校验所需输入。

//输入数据寄存always @ (posedge clk125m_o  or  negedge reset_n)if(!reset_n)beginGMII_ER_reg <= 0;GMII_DV_reg <= 0;GMII_TXD_reg<= 0;endelse beginGMII_ER_reg <= GMII_ER;GMII_DV_reg <= GMII_DV;GMII_TXD_reg<= GMII_TXD;end//数据打两拍判断接收起始always @ (posedge clk125m_o  or negedge reset_n)if(!reset_n)beginGMII_DV_reg1 <= 0;GMII_DV_reg2 <= 0;GMII_TXD_reg1<= 0;GMII_TXD_reg2<= 0;crc_data        <= 0;endelsebeginGMII_DV_reg1 <= GMII_DV_reg;GMII_DV_reg2 <= GMII_DV_reg1;GMII_TXD_reg1<= GMII_TXD_reg;GMII_TXD_reg2<= GMII_TXD_reg1;crc_data     <= GMII_TXD_reg2;   end
  1. PREAMBLE_CODE 状态
    处于 PREAMBLE_CODE状态的时候,当以太网接收到帧界定符(D5)和 7 个的前导码(55)
    时,进入到ETH_HEADER 状态,代码如下所示:
PREAMBLE_CODE:begincrc_init <= 0;if(cnt_preamble == 4'd7)begincurr_state <= ETH_HEADER;cnt_preamble <= 0;endelsebegincnt_preamble <= cnt_preamble + 1'b1;curr_state <= curr_state;endend
  1. ETH_HEADER
    处于 ETH_HEADER 状态时,接收以太网头部数据,当接收完 14 个以太网头部数据之后,进入到 IP_HEADER 状态,如果接收不是7个55和一个D5,则表明此时数据接收错误,进入 IDLE 状态,然后当处于该状态的时候,根据 cnt_eth_header 的值,依次得到 14 个字节的以太网头部数据,分别是 MAC 目的地址(6 个字节)、MAC 源地址(6 个字节)和以太网类型(2 个字节),代码如下所示:
 ETH_HEADER:begincrc_en <= 1;if(cnt_eth_header == 4'd13)begincurr_state <= IP_HEADER;cnt_eth_header <= 0;endelse if((cnt_eth_header == 4'd0) && (preamble_code_check_ok == 1'b0))begincurr_state <= IDLE;cnt_eth_header <= 0;end	elsebegincnt_eth_header <= cnt_eth_header + 1'b1;curr_state <= curr_state;endcase(cnt_eth_header)4'd0 :dst_mac_reg[47:40] <= GMII_TXD_reg2;   4'd1 :dst_mac_reg[39:32] <= GMII_TXD_reg2;4'd2 :dst_mac_reg[31:24] <= GMII_TXD_reg2;4'd3 :dst_mac_reg[23:16] <= GMII_TXD_reg2;4'd4 :dst_mac_reg[15:8]  <= GMII_TXD_reg2;4'd5 :dst_mac_reg[7:0]   <= GMII_TXD_reg2;4'd6 :src_mac_reg[47:40] <= GMII_TXD_reg2;4'd7 :src_mac_reg[39:32] <= GMII_TXD_reg2;4'd8 :src_mac_reg[31:24] <= GMII_TXD_reg2;4'd9 :src_mac_reg[23:16] <= GMII_TXD_reg2;4'd10:src_mac_reg[15:8]  <= GMII_TXD_reg2;4'd11:src_mac_reg[7:0]   <= GMII_TXD_reg2;4'd12:eth_type[15:8] <= GMII_TXD_reg2;4'd13:eth_type[7:0]  <= GMII_TXD_reg2;default: ;	endcaseend

其中preamble_code_check_ok为:

always @ (posedge clk125m_o  or negedge reset_n)if(!reset_n)preamble_code_check_ok <= 1'b0;else if((GMII_TXD_reg2 == 8'hd5) && (cnt_preamble == 4'd7))preamble_code_check_ok <= 1'b1;elsepreamble_code_check_ok <= 1'b0;
  1. IP_HEADER
    (1)接收以太网 IP 头部数据状态IP_HEADER,首先得对接收的以太网 IP 头部数据进行计数,定义一个计数器 cnt_ip_header,当处于该状态的时候进行计数,否则清零,
    (2)然后当处于 IP_HEADER 状态时,获取以太网 IP 头部数据,根据 cnt_ip_header 的值,一共需要获取 20 个字节的数据,分别为 IP 版本(ip_ver)、首部长度(ip_hdr_len)、服务类型(ip_tos)、数据报总长度(total_len)、标识主机发送的每一份数据报(ip_id)、标志位(ip_rsv、ip_df、ip_mf)、段偏移量(ip_frag_offset)、生存期(ip_ttl)、IP 的协议封装类型(ip_protocol)、头部校验和(ip_check_sum)、源 IP 地址(src_ip)和目的 IP 地址(dst_ip),代码如下所示:
IP_HEADER:beginif(cnt_ip_header == 5'd19)begincurr_state <= UDP_HEADER;udp_data_length_reg <= ip_total_len - 16'd20 - 16'd8;cnt_ip_header <= 5'd0;ip_cal_en     <= 1;endelse if(cnt_ip_header >= 5'd1 && eth_header_check_ok == 1'b0)begincurr_state <= IDLE;cnt_ip_header <= 0;endelsebegincnt_ip_header <= cnt_ip_header + 1'b1;curr_state <= curr_state;endcase (cnt_ip_header)5'd0:   {ip_ver,ip_hdr_len}                       <= GMII_TXD_reg2;5'd1:   ip_tos                                    <= GMII_TXD_reg2;5'd2:   ip_total_len[15:8]                        <= GMII_TXD_reg2;5'd3:   ip_total_len[7:0]                         <= GMII_TXD_reg2;5'd4:   ip_id[15:8]                               <= GMII_TXD_reg2;5'd5:   ip_id[7:0]                                <= GMII_TXD_reg2;5'd6:   {ip_rsv,ip_df,ip_mf,ip_frag_offset[12:8]} <= GMII_TXD_reg2;5'd7:   ip_frag_offset[7:0]                       <= GMII_TXD_reg2;5'd8:   ip_ttl                                    <= GMII_TXD_reg2;5'd9:   ip_protocol                               <= GMII_TXD_reg2;5'd10:  ip_check_sum[15:8]                        <= GMII_TXD_reg2;5'd11:  ip_check_sum[7:0]                         <= GMII_TXD_reg2;5'd12:  src_ip_reg[31:24]                         <= GMII_TXD_reg2;5'd13:  src_ip_reg[23:16]                         <= GMII_TXD_reg2;5'd14:  src_ip_reg[15:8]                          <= GMII_TXD_reg2;5'd15:  src_ip_reg[7:0]                           <= GMII_TXD_reg2;5'd16:  dst_ip_reg[31:24]                         <= GMII_TXD_reg2;5'd17:  dst_ip_reg[23:16]                         <= GMII_TXD_reg2;5'd18:  dst_ip_reg[15:8]                          <= GMII_TXD_reg2;5'd19:  dst_ip_reg[7:0]                           <= GMII_TXD_reg2;      default: ;endcaseend

(3)在 ETH_HEADER 状态时,我们获取了以太网头部数据,进入本状态 IP_HEADER 之后,需要判断之前获取的以太网头部数据是否正确,当获取的数据类型等于 ETH_type(0x0800),得到的 MAC 地址等于代码中设定的值Local_mac 时,则代表以太网头部数据接收成功将eth_header_check_ok 信号拉高,否则为低,

always @ (posedge clk125m_o  or negedge reset_n)if(!reset_n)eth_header_check_ok <= 1'b0;else if((eth_type == ETH_type) && (dst_mac_reg == Local_mac) )eth_header_check_ok <= 1'b1;elseeth_header_check_ok <= 1'b0;
  1. UDP_HEADER
    (1)接收 UDP 头部数据状态 UDP_HEADER,进入该状态之后,首先设置一个计数cnt_udp_header 用来计数得到的 UDP 头部数据的个数,
    (2)在 UDP_HEADER 状态时,需要判断前一个状态获取的以太网 IP 头部数据是否正确,当获取的数据正确时,将 ip_header_check_ok 信号拉高,否则为低,
always @ (posedge clk125m_o  or negedge reset_n)if(!reset_n)ip_header_check_ok <= 1'b0;else if({IP_ver,IP_hdr_len,IP_protocol,Check_sum,Local_ip} == {ip_ver,ip_hdr_len,ip_protocol,ip_check_sum,dst_ip_reg})ip_header_check_ok <= 1'b1;elseip_header_check_ok <= 1'b0;

(3)当 cnt_udp_header 计数到 1并且 ip_header_check_ok 信号为 0 时,则代表接收数据出
错,返回 IDLE 状态;当 cnt_udp_header 计数到 7,则代表 UDP 头部数据接收完成,进入 RX_DATA 状态,一共接收了 8 个字节数据分别是源端口号(src_port)、目的端口号(dst_port)、接收的 16 位包括首部在内的 UDP 报文段长度(udp_length)、16 位的 UDP 报头校验和。综上所述,得到 UDP_HEADER 状态机的代码,如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/99425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二证券:临时停牌一般多久?

随着股票买卖市场的日益开展&#xff0c;股票买卖的监管也越来越严格。而前段时刻&#xff0c;上市公司中多家公司被暂时停牌&#xff0c;此举引起了公众对于暂时停牌时刻的重视。那么&#xff0c;暂时停牌一般多久&#xff1f;本篇文章将从多个视点出发&#xff0c;对这一问题…

VsCode 常见的配置、常用好用插件

1、自动保存&#xff1a;不用装插件&#xff0c;在VsCode中设置一下就行 2、设置ctr滚轮改变字体大小 3、设置选项卡多行展示 这样打开了很多个文件&#xff0c;就不会导致有的打开的文件被隐藏 4、实时刷新网页的插件&#xff1a;LiveServer 5、open in browser 支持快捷键…

万界星空科技低代码平台+协同制造MES产品

在生产数字化建设方面&#xff0c;MES产品针对不同的制造行业&#xff0c;开发的工作量较大。传统交付方式开发周期长、过程不可控、质量把控难&#xff0c;同时&#xff0c;开发实施周期长带来了需求变化的可能性增加&#xff0c;周期可能还会延长。 随着数字技术的不断迭代成…

LeetCode-496-下一个更大元素

题目描述&#xff1a; 题目链接&#xff1a;LeetCode-496-下一个更大元素 解题思路&#xff1a; 方法一&#xff1a;暴力 方法二&#xff1a;单调栈 方法一代码实现&#xff1a; class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {// 最笨的方法&am…

【已验证】微信小程序开发-绑定数据23.10.09

四. 绑定数据 WXML页面里的动态数据都是来自.js 文件Page的data&#xff0c;数据绑定就是通过双大 括号&#xff08;{{}}&#xff09;将变量包起来&#xff0c;在WXML页面 里将数据值显示出来。 <!--pages/product/product.wxml--> <view> {{ message }} </vi…

GG-Net: 超声图像中乳腺病变分割的全局指导网络

ATTransUNet 期刊分析摘要贡献方法整体框架1. Global Guidance Block2. Spatial-wise Global Guidance Block3. Channel-wise Global Guidance Block4. Breast Lesion Boundary Detection Module 实验1. 对比实验2. 消融实验2.1 Ablation Analysis of our GG-Net2.2 Ablation A…

用vscode进行远程主机开发

文章目录 插件操作步骤FQA 插件 Remote - SSH - 通过使用 SSH 打开远程计算机或者VM上的文件夹&#xff0c;来连接到任何位置。 操作步骤 使用Vscode利用Remote进行远端开发必须现在Vscode内安装插件 安装完成后&#xff0c;底部工具栏会出现一个绿色按钮&#xff0c;如下…

git命令笔记

git命令笔记 前言&#xff1a;git对于软件开发和协作的重要性不言而喻&#xff0c;在企业开发中&#xff0c;git命令和linux命令的使用同样重要。作为开发者&#xff0c;需要牢记并熟练使用常见的git命令 git工作流程图 命令如下&#xff1a; clone&#xff08;克隆&#xf…

2023旅游产业内容营销洞察报告:如何升级经营模式,适配社媒新链路

2023年我国旅游业强劲复苏&#xff0c;上半年旅游消费增长显著&#xff0c;政府出台一系列文旅扶持政策后&#xff0c;旅游业也在积极寻求数字化转型的升级方式。 上半年以旅游消费为代表的服务业对经济的增长贡献率超过60%&#xff0c;旅游企业普遍实现经营好转&#xff0c;企…

Java中使用C代码

开发工具: Intellij Idea 与 Visual Studio使用方式: Visual生成.dll文件(Windows .dll文件, Linux .so文件); jdk添加.dll文件, Idea java 采用native方式注册与使用c代码.1. 如下图, 打开idea,新建class Demo, 通过命令行生成Demo.h public class Demo {public native voi…

Oracle 云服务即将支持 PostgreSQL!

2023 年 9 月 19 日&#xff0c;Oracle 产品团队发布了一篇文章&#xff0c;宣布 Oracle 云基础架构&#xff08;OCI&#xff09;开始提供 PostgreSQL 服务。目前支持的版本为 PostgreSQL 14.9&#xff0c;提供有限支持&#xff0c;12 月份将会提供正式版本。 众所周知&#x…

案例解读【淘宝API接口的运用:抓取用户数据从而驱动精准营销

我国网络购物用户规模8.12亿占网民整体80.3%&#xff08;来源&#xff1a;中商产业研究院&#xff09;。由此可见&#xff0c;网络购物逐渐成为人们普遍选择的一种消费方式。作为连接买卖双方的服务方&#xff0c;电商平台掌握了海量的用户数据&#xff0c;用户数据作为一种宝贵…

Mac navicat连接mysql出现1045 - Access denied for user ‘root‘

Mac navicat连接mysql出现1045 - Access denied for user ‘root’ 前提&#xff1a;如果你的mac每次开navicat都连接不上&#xff0c;推荐试试我这个方法 1.打开设置–>找到左下角最下面的MySQL–>点击Stop MySQL Server 2.开启一个终端&#xff0c;依次输入以下命令&a…

京东数据接口|电商运营中数据分析的重要性

在电商运营中&#xff0c;数据分析是非常重要的一环&#xff0c;它可以帮助电商企业更好地了解市场、了解消费者、了解产品、了解销售渠道等各种信息&#xff0c;从而制定更为科学有效的运营策略&#xff0c;提高销售效益。 数据方面用户可以直接选择使用数据接口来获取&#…

VMvare虚拟机安装国产麒麟V10桌面操作系统

一、系统下载 进入银河麒麟官网&#xff1a;https://www.kylinos.cn/ 选择桌面操作系统&#xff0c;然后进入操作系统版本选择页面&#xff0c;选择银河麒麟桌面操作系统V10 选择后&#xff0c;进入系统介绍页面&#xff0c;然后点击申请试用 点击后进入申请页面&#xf…

zabbix自定义监控内容和自动发现

6 目录 一、自定义监控内容&#xff1a; 1.明确需要执行的 linux 命令 2.创建 zabbix 的监控项配置文件&#xff0c;用于自定义 key&#xff1a; 3. 在 Web 页面创建自定义监控项模板&#xff1a; 3.1 创建模板&#xff1a; 3.2 创建监控项&#xff1a; 3.3 创建触发器&#…

pdf怎么转成jpg图片格式

pdf怎么转成jpg图片格式&#xff1f;对于大家平时在工作或者生活中的图片使用习惯&#xff0c;经常需要将各种格式的文件转换成易于浏览和使用的JPG格式图片以便保存。如今&#xff0c;因为pdf文件具有更强的稳定性和设备兼容性&#xff0c;PDF文件在平时的电脑使用过程中可以说…

用ffmpeg删除视频的音轨,让视频静音

ffmpeg -i ~/video/video.mp4 -an -vcodec copy ~/video/muteVideo.mp4 删除以后我们查看muteVideo的文件信息&#xff0c;只有一个Stream&#xff1a;video信息了。 再对比看一下video.mp4的信息&#xff0c;是有两个Stream信息&#xff0c;一个video&#xff0c;一个audio。…

【一周安全资讯1007】多项信息安全国家标准10月1日起实施;GitLab发布紧急安全补丁修复高危漏洞

要闻速览 1.以下信息安全国家标准10月1日起实施 2.GitLab发布紧急安全补丁修复高危漏洞 3.主流显卡全中招&#xff01;GPU.zip侧信道攻击可泄漏敏感数据 4.MOVEit漏洞导致美国900所院校学生信息发生大规模泄露 5.法国太空和国防供应商Exail遭黑客攻击&#xff0c;泄露大量敏感…

MFC ExtTextOut函数学习

ExtTextOut - 扩展的文本输出&#xff1b; win32 api的声明如下&#xff1b; ExtTextOut( DC: HDC; {设备环境句柄} X, Y: Integer; {起点坐标} Options: Longint; {选项} Rect: PRect; {指定显示范围; 0 表示限制范围} Str: PChar; {字符串…