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

文章目录

  • 前言
  • 一、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,//数据fifofifo_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芯片产生,25MHzoutput 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;elser_des_mac <= r_des_mac;always@(posedge gmii_tx_clk)if(tx_go)r_type_length <= type_length;elser_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)beginif(!en_tx_data) cnt <= #1  cnt + 6'd1;else	//在发送整个帧中的数据部分时,计数器暂停cnt <= #1  cnt;endelsecnt <= #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;elsedata_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 begincase(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;endcaseend//MII数据发送使能信号always@(posedge gmii_tx_clk or negedge rst_n)if(!rst_n)gmii_tx_en <= #1  1'b0;else if((cnt >= 

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

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

相关文章

Java的序列化

写在前面 本文看下序列化和反序列化相关的内容。 源码 。 1&#xff1a;为什么&#xff0c;什么是序列化和反序列化 Java对象是在jvm的堆中的&#xff0c;而堆其实就是一块内存&#xff0c;如果jvm重启数据将会丢失&#xff0c;当我们希望jvm重启也不要丢失某些对象&#xff…

css自学框架之图片懒加载

首先解释一下什么叫图片懒加载。图片懒加载是一种在页面加载时&#xff0c;延迟加载图片资源的技术&#xff0c;也就是说图片资源在需要的时候才会加载&#xff0c;就是在屏幕显示范围内加载图片&#xff0c;屏幕显示范围外图片不加载。 一、关键函数 用到的关键函数&#xf…

The driver has not received any packets from the server

在测试数据迁移时遇到的错误。 目录 一、错误 二、解决 三、数据迁移测试 3.1 环境 3.2 源码及测试 3.2.1 源码 3.2.2 测试结果&#xff08;太慢&#xff09; 3.2.3 源码修改 3.2.4 异常及解决 一、错误 The driver has not received any packets from the server. 二…

Openresty(二十一)ngx.balance和balance_by_lua灰度发布

一 openresty实现灰度发布 ① 灰度发布 说明&#xff1a; 早期博客对灰度发布的概念进行解读,并且对原生 nginx灰度实现进行讲解后续&#xff1a; 主要拿节点引流的灰度发布,并且关注gray灰度策略 相关借鉴 ② 回顾HTTP反向代理流程 ngx_http_upstream 可操作点&#…

汉威科技亮相上海传感器展并发表主题演讲,智能传感器大有可为

9月15日&#xff0c;第8届中国&#xff08;上海&#xff09;国际传感器技术与应用展览会圆满落幕&#xff0c;该展会吸引了逾400家传感领域国内外的企业、100余家专业传感应用单位、500余位传感大咖共同参与&#xff0c;展会观众达30000人。作为全球三大传感器展之一的盛会&…

AI与医疗保健:革命性技术如何拯救生命

文章目录 引言AI的应用领域1. 影像识别2. 疾病诊断3. 药物研发4. 个性化治疗 AI技术1. 机器学习2. 深度学习3. 自然语言处理4. 基因组学 实际案例1. Google Health的深度学习模型2. IBM Watson for Oncology3. PathAI的病理学分析 道德和隐私考虑结论 &#x1f389;欢迎来到AIG…

深度解析NLP文本摘要技术:定义、应用与PyTorch实战

目录 1. 概述1.1 什么是文本摘要&#xff1f;1.2 为什么需要文本摘要&#xff1f; 2. 发展历程2.1 早期技术2.2 统计方法的崛起2.3 深度学习的应用2.4 文本摘要的演变趋势 3. 主要任务3.1 单文档摘要3.2 多文档摘要3.3 信息性摘要 vs. 背景摘要3.4 实时摘要 4. 主要类型4.1 抽取…

Promethus(普罗米修斯)安装与配置(亲测可用)

1. 普罗米修斯概述 Prometheus(是由go语言(golang)开发)是一套开源的监控&报警&时间序列数 据库的组合。适合监控docker容器。 Prometheus是最初在SoundCloud上构建的开源系统监视和警报工具包 。自2012年成立以来&#xff0c;许多公司和组织都采用了Prometheus&#…

python-爬虫-requests

安装模块 pip install requests在jupyter notebook里使用ShiftTab查看 requests requests库的主要方法 方法解释requests.requset()构造一个请求&#xff0c;支持以下各种方法requests.get()获取HTML的主要方法requests.head()获取HTML头部信息requests.post()向HTML网页提…

WebRTC 源码 编译 iOS端

1. 获取依赖工具 首先&#xff0c;确保你已经安装了以下工具&#xff1a; GitDepot ToolsXcode&#xff08;确保已安装命令行工具&#xff09; 2. 下载 depot_tools 使用 git 克隆 depot_tools 并将其添加到你的 PATH 中&#xff1a; /path/to/depot_tools 替换为自己的路径…

ATF(TF-A) EL3 SPMC威胁模型-安全检测与评估

安全之安全(security)博客目录导读 ATF(TF-A) 威胁模型汇总 目录 一、简介 二、评估目标 1、数据流图 三、威胁分析 1、信任边界 2、资产 3、威胁代理 4、威胁类型 5、威胁评估 5.1 端点在直接请求/响应调用中模拟发送方FF-A ID 5.2 端点在直接请求/响应调用中模拟…

驱动开发,IO多路复用(select,poll,epoll三种实现方式的比较)

1.IO多路复用介绍 在使用单进程或单线程情况下&#xff0c;同时处理多个输入输出请求&#xff0c;需要用到IO多路复用&#xff1b;IO多路复用有select/poll/epoll三种实现方式&#xff1b;由于不需要创建新的进程和线程&#xff0c;减少了系统资源的开销&#xff0c;减少了上下…