FPGA进阶教程16 同一块FPGA的两个网口实现arp自通信

news/2024/11/15 5:00:25/

本项目使用同一个FPGA的两个网口进行千兆以太网的arp自动绑定

目的是为了以后实现两个FPGA之间进行以太网数据的交互

起因:最近公司画了一块板子,上面有两个网口,市面上常见的项目都是将FPGA与PC端实现arp的自动绑定和UDP数据的回环,很少实现两块FPGA之间的以太网数据通信,所以公司想让我尝试先在一块板的两个网口上实现ARP协议的自动绑定,在查阅了一些资料后发现好像没人做过,只能自己手搓了。。。。

思路:其实实现在同一个FPGA的两个网口进行ARP协议的操作,思路很简单,就是一个网口当主机,另一个网口当从机,下面是我画的一个思路图。

在这里首先简单介绍一下ARP协议:

        如果要实现以太网通信,需要获取对方设备的MAC地址和IP地址,当然了,在不嫌麻烦的前提下,可以进行手动绑定MAC地址,前提是你的上位机是PC端,百度上很多教程教你如何收到绑定MAC地址,但是我们本项目是要实现同一个FPGA的两个网口实现arp协议,那手动绑定mac的情况就不现实了;的确,可以直接在程序里写定对方的mac地址和IP地址,但是为了方便起见,以及为了项目后续的推荐,有一个ARP协议当然是最好的。

        ARP协议,分为ARP请求和ARP应答,源主机发起查询目的MAC地址的报文就称为ARP请求,目的主机相应源主机并发送包含本地MAC地址的报文称为ARP应答。

以下采用了正点原子的官方文档,很详细的介绍了ARP协议:

        当主机需要找出这个网络中的另一个主机的物理地址时,它就可以发送一个 ARP 请求报文,这个报文包含了发送方的 MAC 地址和 IP 地址以及接收方的 IP 地址。因为发送方不知道接收方的物理地址,所以这 个查询分组会在网络层中进行广播,即 ARP 请求时发送的接收方物理地址为广播地址,用 48’hff_ff_ff_ff_ff_ff 表示。 ARP 请求的示意图如下图所示:
        
        上图中的主机 A 发起 ARP 请求,由于发送的目的 MAC 地址为广播地址,所以此时局域网中的所有主机都会进行接收并处理这个 ARP 请求报文,然后进行验证,查看接收方的 IP 地址是不是自己的地址。是则返回 ARP 应答报文,不是则不响应。
        只有验证成功的主机才会返回一个 ARP 应答报文,这个应答报文包含接收方的 IP 地址和物理地址。 ARP 应答的示意图如下图所示:
        
        相信大家如果有一定的ARP基础的话,这些内容都是了解的,我这里的教程主要针对的是在实际项目中有两网口通信需求的工程师,所以arp协议的简介就到这里。
        接下来是代码的编写,首先是顶层文件的编写:
`timescale 1ns / 1ps
//

http://www.ppmy.cn/news/1522476.html

相关文章

网络学习-eNSP配置ACL

AR1路由器配置 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]interface gigabitethernet 0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 192.168.2.254 24 …

chunk-vendors.js 文件过大导致页面加载缓慢解决方案

1、路由懒加载 在 Webpack 中&#xff0c;我们可以使用动态 import语法来定义代码分块点 (split point)&#xff1a; import(./Foo.vue) // 返回 Promise如果您使用的是 Babel&#xff0c;你将需要添加 syntax-dynamic-import 插件&#xff0c;才能使 Babel 可以正确地解析语…

Unity制作更换字体的插件

目录 1.前置知识 1.1 EditorWindow 1&#xff09;目的 2&#xff09;使用方式 1.2 OnGUI() 1&#xff09;目的 2&#xff09;使用方式 1.3 AssetDatabase 1&#xff09;目的 2&#xff09;使用方式 1.4 PrefabUtility 1&#xff09;目的 2&#xff09;使用方式 2…

GNU/Linux - Open函数使用的O_CLOEXEC flag

在 Linux 中&#xff0c;“O_CLOEXEC ”标志与 “open ”系统调用一起使用&#xff0c;用于指定在使用 “exec ”系列函数&#xff08;如 “execve”、“execl ”等&#xff09;执行新程序时&#xff0c;“open ”返回的文件描述符应自动关闭。 In Linux, the O_CLOEXEC flag i…

C++(多态性)

多态 多态是指同样的消息被不同类型的对象接收时导致不同的行为。所谓消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。 最简单的例子就是使用同样的运算符&#xff0c;可以实现整数与整数之间&#xff0c;浮点数与浮点数之间的加法运算。 多…

前端基础面试题·第一篇——HTML

1 .HTML标签头部< !DOCTYPE html> 的作用 DOCTYPE 使 document type的缩写&#xff0c;是html文档的类型声明&#xff0c;告诉浏览器文档的类型&#xff0c;便于解析文档。 这里会涉及到浏览器渲染页面的两种形式&#xff1a; CSS1 Compatible Mode(标准模式): 浏览器使…

Nginx反向代理功能及动静分离实现

一&#xff1a;Nginx支持正向代理和反向代理 1.正向代理 正向代理&#xff0c;指的是通过代理服务器 代理浏览器/客户端去重定向请求访问到目标服务器 的一种代理服务。 正向代理服务的特点是代理服务器 代理的对象是浏览器/客户端&#xff0c;也就是对于目标服务器 来说浏览…

共享内存和信号量

共享内存和信号量可以配合起来一起使用。 什么是共享内存&#xff1f;&#xff1a; 共享内存就是映射一段能被其他进程所访问的内存&#xff0c;这段共享内存由一个进程创建&#xff0c;但多个进程都可以访问。共享内存是最快的IPC方式&#xff0c;它是针对其他进程间通信方式…