千兆以太网网络层 ARP 协议的原理与 FPGA 实现

news2024/11/24 17:58:22

文章目录

  • 前言
  • 一、ARP 帧的应用场景和存在目的
  • 二、ARP 帧工作原理
  • 三、以太网 ARP 帧发包实例设计
  • 四、以太网 CRC校验代码
  • 五、以太网 ARP 帧发包测试---GMII
    • 1.模拟数据发送
    • 2.仿真模块
    • 3.仿真波形
  • 六、以太网 ARP 帧发包测试---RGMII
    • 1.顶层文件
    • 2 .仿真代码
  • 七、上板测试(RGMII)


前言

本节对以太网电路接口和以太网帧协议做简单的介绍,并在了解了以太网帧协议后,在 FPGA 上实现基于以太网 UDP 帧的发送模块的设计与验证。

提示:以下是本篇文章正文内容,下面案例可供参考

一、ARP 帧的应用场景和存在目的

上一章节,我们介绍了整个以太网传输中最底层的 MAC 帧格式,也提到,MAC 帧并不是直接对用户的数据帧,一段用户信息要想通过以太网传输还需要经过各种传输层协议的层层打包才能最终送入 MAC 帧的数据字段进行传输。无论是传输用户数据还是一些网络通信辅助相关的信息,都需要将数据编码为指定协议后再打包进 MAC 层传输。
所以本节将选择一个最简单的协议 ARP 协议,来介绍以太网 MAC 帧的组包方式,并使用 FPGA 编写 MAC 帧发送器,来发送预先设定好的一段 ARP 协议数据内容,并通过以太网抓包查看数据内容的方式来直观验证 MAC 帧发送器的设计成果。
之所以选择 ARP 协议来辅助进行以太网 MAC 帧发送器的设计,是因为 ARP 协议是所有MAC 帧上层协议中最简单的协议,使用该协议,我们在生成以太网帧的数据和填充字段的内容时会非常的简单方便,而 ARP 协议又能够在 PC 的以太网抓包工具中正确抓取并显示,非常适合我们用来进行最直观的连通性测试。在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件(MAC)地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用。

二、ARP 帧工作原理

源主机发出 ARP 请求,询问“IP 地址是 192.168.0.1 的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播),目的主机接收到广播的 ARP 请求,发现其中的 IP 地址与本机相符,则发送一个 ARP 应答数据包给源主机,将自己的硬件地址填写在应答包中。然后源主机收到该应答报文,就能从报文中解析得知目的主机的硬件地址是多少,然后就能正确的发送数据了。
每台主机都维护一个 ARP 缓存表,可以用 arp -a 命令查看。缓存表中的表项有过期时间(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP 请求来获得目的主机的硬件地址。由于网络上的 IP 地址本身是动态分配的(Ipv4 资源严重不足,所以采用动态分配机制),上网时每个设备的 IP 地址在不同的时间点其地址都有可能不同,所以某个网络设备在不同的时间,其 IP 地址可能不一样,所以需要用这种缓存表项定期失效的机制来避免 MAC 地址和不同时刻 IP 地址绑定的冲突。下表为完整的 ARP 帧每个字段的数据意义(包含了以太网帧头部字段)。
在这里插入图片描述
注意到源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次,这两个字段的内容值是不一样的。在发送 ARP 请求帧时,以太网首部中的目的 MAC 地址为广播地址,也就是 6 字节的 0xFF。而 ARP 数据报中,当发送请求报文时,由于目的 MAC 地址暂时无法知晓,所以将其值填充为 0。ARP 返回报文中的值由于已经知晓,所以以太网首部和 ARP数据报中的值用实际值填充。硬件类型指链路层网络类型,1 为以太网,协议类型指要转换的地址类型,0x0800 为 IP
地址。后面两个地址长度对于以太网地址和 IP 地址分别为 6 和 4(字节)。op 字段为 1 表示
ARP 请求,op 字段为 2 表示 ARP 应答。每个字段具体的功能描述如下表所示。
在这里插入图片描述
在这里插入图片描述

三、以太网 ARP 帧发包实例设计

`timescale 1ns/1ns
module eth_send(
	rst_n,
	
	tx_go,
	data_length,
	
	des_mac,
	src_mac,
	type_length,
	CRC_Result,
	CRC_EN,
	
	//数据fifo
	fifo_rdreq,
	fifo_rddata,
	fifo_rdclk,
	
	//GMII 接口信号	
	gmii_tx_clk,
	gmii_tx_en,
	gmii_tx_er,
	gmii_tx_data
);

	input rst_n; //复位输入
	input tx_go; //发送启动信号,单时钟周期高脉冲使能一次发送
	
	input [47:0]des_mac; //目标MAC地址
	input [47:0]src_mac; //本机/源MAC地址
	input [15:0]type_length;	//数据帧类型
	input [31:0]CRC_Result;	//CRC校验结果
	input [15:0]data_length;	//数据长度
	
	output CRC_EN;
	
	output fifo_rdreq;	//fifo读取请求	
	input [7:0]fifo_rddata;	//fifo读取到数据内容
	output fifo_rdclk;	//fifo读时钟
	
	//MII 接口信号	
	input gmii_tx_clk; //GMII接口发送时钟,由PHY芯片产生,25MHz
	output reg gmii_tx_en;	//GMII接口发送数据使能信号,高电平有效
	output gmii_tx_er;	//发送错误,用以破坏数据包发送
	output reg [7:0]gmii_tx_data;	//GMII接口数据总线,FPGA通过该数据线将需要发送的数据依次送给PHY芯片

	reg [5:0] cnt;		//序列机计数器,本以太网帧发送系统使用线性序列机方式设计
	reg en_tx;	//内部的数据帧发送使能信号,高电平时将数据通过MII接口送出
	wire en_tx_data;	//发送MAC帧中数据部分使能信号,一个完整的MAC帧包含数据和MAC帧头以及结尾的校验部分,本信号用于标识帧中数据段部分
	reg [15:0]data_num;	//待发送的数据帧中数据部分数量
	
	reg [47:0]r_des_mac; //目标MAC地址
	reg [15:0]r_type_length;	//数据帧类型
	
	assign fifo_rdreq = en_tx_data;	//fifo读请求,fifo需要设置为show ahead模式
	
	assign fifo_rdclk = gmii_tx_clk;	//fifo读时钟
	
	always@(posedge gmii_tx_clk)
	if(tx_go)
		r_des_mac <= des_mac;
	else
		r_des_mac <= r_des_mac;
		
	always@(posedge gmii_tx_clk)
	if(tx_go)
		r_type_length <= type_length;
	else
		r_type_length <= r_type_length;
	
	//根据发送启动信号产生内部发送使能信号
	always@(posedge gmii_tx_clk or negedge rst_n)
	if(!rst_n)
		en_tx <= #1  1'd0;
	else if(tx_go)
		en_tx <= #1  1'd1;
	else if(cnt >= 27)//一帧数据发送完成,清零发送使能信号
		en_tx <= #1  1'd0;
	
	//主序列机计数器
	always@(posedge gmii_tx_clk or negedge rst_n)
	if(!rst_n)
		cnt <= #1  6'd0;
	else if(en_tx)begin
		if(!en_tx_data) 
			cnt <= #1  cnt + 6'd1;
		else	//在发送整个帧中的数据部分时,计数器暂停
			cnt <= #1  cnt;
	end
	else
		cnt <= #1  6'd0;		
	
	//帧中数据发送使能信号
	assign en_tx_data = (cnt == 23) && (data_num > 1);
	
	//待发送数据计数器,每发送一个数据段中的数据,本计数器减1.
	always@(posedge gmii_tx_clk or negedge rst_n)
	if(!rst_n)
		data_num <= #1  0;
	else if(tx_go)
		data_num <= #1  data_length;
	else if(en_tx_data)
		data_num <= #1  data_num - 1'b1;
	else
		data_num <= #1  data_num;
		
	assign CRC_EN = ((cnt > 9) && (cnt <= 24));
	
	//序列机部分,根据不同的时刻,切换MII接口数据线上的内容,包含前导码、分隔符、目的地址、源地址、以太网帧类型/长度、数据段数据、结尾CRC校验值
	always@(posedge gmii_tx_clk or negedge rst_n)
	if(!rst_n)
		gmii_tx_data <= #1  8'd0;
	else begin
		case(cnt)
			1, 2, 3, 4, 5, 6, 7:
				gmii_tx_data <= #1  8'h55;	//前导码
				
			8: gmii_tx_data <= #1  8'hd5;	//分隔符
			
			//目的MAC地址
			9: gmii_tx_data <= #1  r_des_mac[47:40];
			10: gmii_tx_data <= #1  r_des_mac[39:32];
			11: gmii_tx_data <= #1  r_des_mac[31:24];
			12: gmii_tx_data <= #1  r_des_mac[23:16];
			13: gmii_tx_data <= #1  r_des_mac[15:8];
			14: gmii_tx_data <= #1  r_des_mac[7:0];

			//源MAC地址
			15: gmii_tx_data <= #1  src_mac[47:40];
			16: gmii_tx_data <= #1  src_mac[39:32];
			17: gmii_tx_data <= #1  src_mac[31:24];
			18: gmii_tx_data <= #1  src_mac[23:16];
			19: gmii_tx_data <= #1  src_mac[15:8];
			20: gmii_tx_data <= #1  src_mac[7:0];
			
			//以太网帧类型/长度
			21: gmii_tx_data <= #1  r_type_length[15:8];
			22: gmii_tx_data <= #1  r_type_length[7:0];
			
			//发送数据
			23: gmii_tx_data <= #1  fifo_rddata;
			
			//发送CRC 校验结果
			24: gmii_tx_data <= #1  CRC_Result[31:24];
			25: gmii_tx_data <= #1  CRC_Result[23:16];
			26: gmii_tx_data <= #1  CRC_Result[15:8];
			27: gmii_tx_data <= #1  CRC_Result[7:0];
	
			28: gmii_tx_data <= #1  8'd0;
			default: gmii_tx_data <= #1  8'd0;
		endcase
	end
	
	//MII数据发送使能信号
	always@(posedge gmii_tx_clk or negedge rst_n)
	if(!rst_n)
		gmii_tx_en <= #1  1'b0;
	else if((cnt >= 

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

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

相关文章

浅显易懂理解傅里叶变换

说起电子硬件专业&#xff0c;那不得不提的就是傅里叶变换了。 大学课程中应该吓倒了很多人&#xff0c;谈傅里叶色变了。 本次就来重新认识一下电子硬件中的傅里叶变化。 首先理解之前&#xff0c;当然是需要先知道傅里叶这位大牛的人物百科啦。 傅里叶是法国数学家&#xff0…

【数据结构】平衡二叉搜索树(AVL树)——AVL树的概念和介绍、AVL树的简单实现、AVL树的增删查改

文章目录 平衡二叉搜索树&#xff08;AVL树&#xff09;1.AVL树的概念和介绍2.AVL树的简单实现2.1AVL树的插入2.2AVL树的旋转2.2.1左旋2.2.2右旋2.2.3右左双旋2.2.4左右双旋 全部源码 平衡二叉搜索树&#xff08;AVL树&#xff09; 为什么要引入平衡二叉搜索树&#xff1f; 在之…

jdk 中的 keytool 的使用,以及提取 jks 文件中的公钥和私钥

这里暂时只需要知道如何使用就可以了。 首先是生成一个密钥&#xff0c; keytool -genkeypair -alias fanyfull -keypass ffkp123456 -validity 365 -storepass ffsp123456 -keystore fanyfull.jks -keyalg RSA解释一下这里的选项&#xff0c; -alias 密钥对的名称-keypass …

等变性的AI:从离散到连续

这篇文章主要介绍了在科学问题中如何实现不变性或等变性&#xff0c;其中介绍了实现等变性的数学和物理基础&#xff0c;包括离散和连续对称变换的示例&#xff0c;并描述了在实践中如何使用张量积。文章还讨论了如何处理数据中的对称性&#xff0c;以及如何开发适应对称性约束…

喜报!Coremail荣获广东省信息技术应用创新优秀产品和解决方案

导语 近日&#xff0c;由广东省信息技术应用创新产业联盟组织的“2023 年广东省信息技术应用创新成果交流会”在广州顺利召开。 Coremail作为会员单位受邀出席此次交流会。会上&#xff0c;Coremail荣获优秀产品和解决方案奖项&#xff0c;CACTER邮件安全网关获评“2022年广东…

阿里云服务器操作系统怎么选择?阿里云镜像区别

阿里云服务器操作系统怎么选择&#xff1f;小白镜像选择攻略&#xff01;阿里云服务器镜像怎么选择&#xff1f;云服务器操作系统镜像分为Linux和Windows两大类&#xff0c;Linux可以选择Alibaba Cloud Linux&#xff0c;Windows可以选择Windows Server 2022数据中心版64位中文…

想了解商品期权开户门槛?零门槛开户,不用担心!

商品期权不是零门槛开户&#xff0c;不过可以通过第三方期权分仓软件实现0门槛参与商品期权&#xff0c;股指期权&#xff0c;上证50ETF期权、沪深300ETF期权和创业板ETF期权交易&#xff0c;下文介绍想了解商品期权开户门槛&#xff1f;零门槛开户&#xff0c;不用担心&#x…

【Seata】04 - Seata TCC 模式 Demo 调用流程分析

文章目录 前言参考目录版本说明前置知识1、TCC 模式预留资源2、TCC 模式可能会出现的问题2.1、幂等性问题2.2、空回滚问题2.3、悬挂问题 测试 Demo1、数据库表结构2、模块说明3、调用逻辑说明4、分析流程说明 Seata TCC 模式 Commit 调用流程1、调用流程图2、TCC 动作拦截器&am…

【华为云云耀云服务器L实例评测|使用教学】一文带你快速入手华为云云耀云服务器L实例

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

DC/DC开关电源学习笔记(七)低压大电流DC/DC变换技术

低压大电流DC/DC变换技术 1. 无暂态要求的低压大电流DC/DC变换技术2. 负载极其快速变化的低压大电流DC/DC变换技术2.1 非隔离型 VRM2.2 隔离型VRM低压大电流高功率 DC/DC 变换技术,已从前些年的 3.3V 降至现在的 1.0V 左右,电流目前已可达到几十安至几百安。同时,电源的输出指标…

使用CFimagehost源码搭建免费的PHP图片托管私人图床,无需数据库支持

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

vue3+scss开启写轮眼

vue3scss开启写轮眼 一、相关技术二、使用步骤1.安装依赖2.眼球3 勾玉4 旋转动画5 综合 一、相关技术 采用vue3vitescss的技术内容进行开发 二、使用步骤 1.安装依赖 代码如下&#xff1a; npm install sass2.眼球 首先我们根据需要 将眼睛的基础形状描绘出来&#xff0c…

【AI+医疗】AI在医疗影像设备工作周期中的应用探索

导读 随着人工智能技术的飞速发展&#xff0c;越来越多的领域开始与人工智能技术深度融合&#xff0c;产生了一种新型的技术模式——AI。AI是指将人工智能技术与其他领域的技术或应用进行结合&#xff0c;在提高效率、精度和创新能力的同时&#xff0c;也为人工智能技术的发展提…

The Sandbox 和 Burrito 钱包达成合作!

我们很高兴宣布与 Burrito 钱包达成合作&#xff0c;这是韩国领先的区块链公司 Rotonda 推出的一款全新的 Web3 钱包。此次合作旨在丰富 The Sandbox 平台的用户体验&#xff0c;实现更无缝的资产管理和转移。 此次合作的主要优势之一是将 Burrito 钱包集成到 The Sandbox 生态…

功率放大器的作用有哪些

功率放大器是电子设备中常见的一个组件&#xff0c;其作用是将输入信号的能量放大到更高的功率级别&#xff0c;以用于驱动高功率负载或者提供足够的功率来满足特定需求。功率放大器在各种应用领域中发挥着重要作用&#xff0c;下面将详细介绍功率放大器的作用与应用。 图&…

【【萌新编写RiscV之经典计算机组成与设计RISCV书记录 总4】】

萌新编写RiscV之经典计算机组成与设计RISCV书记录 总4 其实我一开始不想做这个因为实在是实现的功能复杂 但是都差不多的逻辑 基本目的 实现下列操作 条件分支指令branch if equal (beq)。 算术逻辑指令 add sub and or 条件分支指令branch if equal (beq)。 我们确定一下CP…

最新ChatGPT网站源码+支持GPT4.0+支持Midjourney绘画+支持国内全AI模型

一、智能创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&…

【MySQL从删库到跑路 | 基础第二篇】——谈谈SQL中的DML语句

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 前言 前面我们…

华为Mate 60难以撼动苹果的市场份额

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;一些分析师认为&#xff0c;如果华为能够大规模生产Mate 60&#xff0c;那么华为的新智能手机将对苹果的市场份额构成威胁。 &#xff08;2&#xff09;还有消息称中国将禁止某…

【Node.js】模块化:

文章目录 1、模块化的基本概念2、Node.js 中模块化【1】Node.js 中模块的分类【2】加载模块【3】模块作用域【4】向外共享模块作用域中的成员【5】模块化规范 3、npm与包&#xff08;包/依赖/插件&#xff09;【1】包的基本知识&#xff1a;【2】开发属于自己的包【3】发布包 4…