FPGA 20个例程篇:13.千兆网口实现ARP通信协议(下)

这篇具有很好参考价值的文章主要介绍了FPGA 20个例程篇:13.千兆网口实现ARP通信协议(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第五章 外设接口通信,举一反三

13.千兆网口实现ARP通信协议

        完成了RGMII接口和GMII接口转换的代码设计,接下来我们来设计以太网帧的报文解析模块,为了兼顾下一个例程中ICMP和UDP报文的解析,我们把ARP报文解析分成以太网首部解析和ARP数据解析两部分,这样以太网首部解析模块还可以再用到下一个例程当中提高了代码的复用性,同时大家想如果ICMP、UDP、ARP等不同报文的解析都放到一个模块里,代码也会非常杂乱,不容易调试定位问题。完成了RGMII接口和GMII接口转换的代码设计,接下来我们来设计以太网帧的报文解析模块,为了兼顾下一个例程中ICMP和UDP报文的解析,我们把ARP报文解析分成以太网首部解析和ARP数据解析两部分,这样以太网首部解析模块还可以再用到下一个例程当中提高了代码的复用性,同时大家想如果ICMP、UDP、ARP等不同报文的解析都放到一个模块里,代码也会非常杂乱,不容易调试定位问题。

      先来看以太网首部解析模块,如图1所示是ARP帧的报文格式,其中包括了14字节的以太网首部和28字节的ARP请求应答数据,在这个模块中我们来实现以太网首部的解析,注意到以太网的帧前端含8个字节前导码,即64'h55_55_55_55_55_55_55_55_d5,所以在这个模块中也需要去判断前导码是否正确,如表1所示是mac_receive_analy模块信号列表。

       整个模块代码设计中没有过多复杂的功能,按照流程来判断即可,用一个状态机来实现。先判断以太网帧的前导码是否正确,再依次接收以太网目的地址即开发板的MAC地址,以太网源地址即PC的MAC地址,最后接收2字节的帧类型,在这里ARP帧类型为16'h08_06,如图2所示是以太网首部解析模块的代码设计。

fpga例程 arp协议,FPGA 20个例程,fpga开发

图1 ARP帧的报文格式

信号列表

信号名

I/O

位宽

clk

I

1

rst_n

I

1

local_mac_addr

I

48

pc_mac_addr

I

48

gmii_rxd

I

8

gmii_rx_dv

I

1

arp_analy_en

O

1

表1 mac_receive_analy模块信号列表

   fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发

图2 以太网首部解析模块的代码设计

        然后我们再来思考下ARP数据解析模块的代码实现,其实和以太网首部解析模块大同小异,静下心来想想ARP数据报文无外乎只有两种情况,即请求报文和应答报文。

       当以太网首部解析模块判断该帧的前导码正确,接收以太网目的地址是开发板的MAC地址或者是广播地址,且帧类型是ARP帧后会拉高一个时钟周期的arp_analy_en使能信号触发本模块工作,在本模块中继续解析ARP帧的数据部分。

       如表2所示arp_receive_analy模块信号列表,在这个模块中首先需要判断接收到的ARP帧中的源IP地址是否是PC端IP地址,目的IP地址是否是开发板IP地址,然后需要进一步判断是请求还是应答报文。

       如果是请求报文,那么需要在判断报文正确的情况下,拉高一个时钟周期的arp_reply_en使能信号,触发下游arp_transfer发送模块向PC端发送ARP应答报文;如果是应答报文,那么需要在判断报文正确的情况下,把报文中PC端的MAC地址赋值给get_pc_mac_addr信号,没有太多复杂的东西想清楚逻辑很快就能还原出代码,如图3所示是ARP数据解析模块的代码设计。

信号列表

信号名

I/O

位宽

clk

I

1

rst_n

I

1

arp_analy_en

I

1

gmii_rxd

I

8

gmii_rx_dv

I

1

local_ip_addr

I

32

pc_ip_addr

I

32

get_pc_mac_addr

O

48

arp_reply_en

O

1

表2 arp_receive_analy模块信号列表

fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发

图3 ARP数据解析模块的代码设计

        完成了ARP帧的解析模块代码设计,下面我们再来看一看ARP帧的发送模块代码设计,当然在此之前需要补充CRC校验模块的代码设计,这里和前面例程“USB2.0接收并回复CRC16位校验”都是一样的,直接通过网站http://www.easics.com/webtools/crctool即可生成Verilog代码,这里不做过多赘述,笔者只不过重新规范了一下信号名称,如表3所示eth_crc32模块的信号列表,如图4所示是以太网CRC32校验的代码设计。

      在这个模块中,有输入信号crc_clr作为复位信号,所以FPGA每次计算校验完一包完整的CRC数据后拉高一个时钟周期的crc_clr即可再次校验下一包数据,crc_din是需要校验报文的字节输入数据信号,而crc_dout则是计算校准后的输出数据,即CRC校验后的结果。

信号列表

信号名

I/O

位宽

clk

I

1

rst_n

I

1

crc_din

I

8

crc_en

I

1

crc_clr

I

1

crc_dout

O

32

表3 eth_crc32模块信号列表

fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发

图4 以太网CRC32校验的代码设计

       如表4所示是arp_transfer模块信号列表,在这个模块中我们需要按照ARP帧的报文定义向PC端发送ARP应答或者ARP请求报文,所以这个模块当中需要arp_ask_en和arp_reply_en两个输入使能信号,按照报文顺序首先发送前导码,然后发送以太网首部,接着发送ARP数据报文,最后发送CRC32校验和依次打包发送到GMII上的gmii_txd总线即可。

       这个模块的设计中需要注意对于ARP应答和请求报文,报文的具体内容是有一点区别的,注意前导码不需要代入以太网CRC32校验模块中计算CRC,一包报文发送完毕后需要拉高一个时钟周期的crc_clr信号以复位CRC32校验模块,如图5所示是ARP帧的发送模块的代码设计。

信号列表

信号名

I/O

位宽

clk

I

1

rst_n

I

1

arp_ask_en

I

1

arp_reply_en

I

1

local_mac_addr

I

48

local_ip_addr

I

32

pc_mac_addr

I

48

pc_ip_addr

I

32

crc_data

I

32

gmii_txd

O

8

gmii_tx_en

O

1

crc_en

O

1

crc_clr

O

1

表4 arp_transfer模块信号列表

fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发

图5 ARP帧的发送模块的代码设计

      最后我们需要把这些模块都通过顶层模块例化到一起,即用户按下开发板按键,开发板会向PC端发送ARP请求报文,在收到PC端的ARP应答报文后,会把PC端的MAC地址及时更新,另外如果接收到PC端发来的ARP请求报文,会立刻回复PC端ARP应答报文,如图6所示是千兆网口实现ARP通信协议顶层文件的例化。

fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发fpga例程 arp协议,FPGA 20个例程,fpga开发

图6 千兆网口实现ARP通信协议顶层文件的例化

     因为在顶层文件中把PC端的IP地址设置为192.168.0.3,而把开发板的IP地址设置为192.168.0.2,同时把开发板的MAC地址设置为00_11_22_33_44_55,所以如图7所示,我们先在PC端把IP地址设置为192.168.0.3。

fpga例程 arp协议,FPGA 20个例程,fpga开发

图7 设置PC端的IP地址为192.168.0.3

        在这个例程中我们需要安装一个以太网抓包软件叫做“Wireshark”,安装包笔者已经提供给大家,安装过程很简单一路Next即可,用这个软件可以抓包到本地网络和无线网络的以太网帧,感兴趣的同学也可以下载一个叫做“小兵以太网测试仪”的软件,该软件可以自定义以太网报文发送,对于以太网的开发和测试有很大的帮助。

       当然在不安装“小兵以太网测试仪”的情况下,我们仍可以通过PC端的DOS命令来测试以太网的ARP协议,如图8所示,我们在DOS命令下首先输入arp –d,这条命令代表删除PC端的所有以太网ARP缓存表,接着输入ping 192.168.0.2,在这里是通过ping命令来间接发起ARP请求,因为在这个例程中并没有实现 ICMP 协议,所以在ping时会请 求超时,但是在ping的过程中会发起ARP请求,开发板响应后会返回ARP应答报文。

fpga例程 arp协议,FPGA 20个例程,fpga开发

 图8 PC端发起ARP请求

        如图9所示在DOS命令下首先输入arp –a,即可查询PC端的所有以太网ARP缓存表,大家可以清楚地看到PC端已成功通过ARP协议获取到开发板MAC地址。

fpga例程 arp协议,FPGA 20个例程,fpga开发

图9 PC端获取开发板MAC地址成功

        如图10所示,大家打开Wireshark软件,并选择抓包本地连接,按下开发板的按键,如图11所示在Wireshark下即可抓取到开发板向PC端发送的ARP请求报文,在输入ping 192.168.0.2时,如图如图12所示在Wireshark下即可抓取到PC端向开发板发送的ARP请求报文,感兴趣的同学双击该报文,即可显示报文中的详细信息。

fpga例程 arp协议,FPGA 20个例程,fpga开发

图10 Wireshark界面下选择抓包本地连接

fpga例程 arp协议,FPGA 20个例程,fpga开发

图11 Wireshark下抓取到开发板向PC端发送的ARP请求报文

fpga例程 arp协议,FPGA 20个例程,fpga开发

图12 Wireshark下抓取到PC端向开发板发送的ARP请求报文

        同时笔者在mac_receive_analy、arp_receive_analy、arp_transfer三个核心模块下都添加了ILA IP核,如图13到图15所示是分别是在线调试下的波以太网首部解析的ILA波形图、ARP数据解析的ILA波形图和ARP报文发送的ILA波形图。

fpga例程 arp协议,FPGA 20个例程,fpga开发

图13 以太网首部解析的ILA波形图

fpga例程 arp协议,FPGA 20个例程,fpga开发

图14 ARP数据解析的ILA波形图

fpga例程 arp协议,FPGA 20个例程,fpga开发

图15 ARP报文发送的ILA波形图文章来源地址https://www.toymoban.com/news/detail-645765.html

到了这里,关于FPGA 20个例程篇:13.千兆网口实现ARP通信协议(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA 20个例程篇:19.OV7725摄像头实时采集送HDMI显示(三)

           在详细介绍过OV7725 CMOS Sensor的相关背景知识和如何初始化其内部寄存器达到输出预期视频流的目的后,就到了该例程的核心内容即把OV7725输出的视频流预先缓存到外部DDR3颗粒,接着按照HDMI的视频格式把DDR3颗粒内存储的一帧一帧图像数据送显到屏幕上显示,如图1所示

    2024年01月17日
    浏览(57)
  • FPGA 20个例程篇:19.OV7725摄像头实时采集送HDMI显示(一)

           在例程“OV7725摄像头实时采集送HDMI显示”中,我们将走近FPGA图像处理的世界,图像处理、数字信号、高速接口也一直被业界公认为FPGA应用的三大主流领域,这个例程主要基于OV7725摄像头的视频图像采集项目,进行了详细地需求分析,从顶层到底层,从框架到功能,

    2024年02月02日
    浏览(54)
  • FPGA 20个例程篇:19.OV7725摄像头实时采集送HDMI显示(四)

            在介绍完OV7725初始化配置和视频采集模块后,就到了整个项目的核心部分即DDR3乒乓存储图像模块,为了实现整个FPGA项目工程当中良好的实时性,乒乓操作在广泛应用在FPGA视频加速处理和数字信号处理中。        关于乒乓操作,有很多的FPGA相关书籍都多多少少做了

    2024年02月02日
    浏览(49)
  • FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(五)

           如表1所示是dds_ip_transform模块信号列表,在正弦波模块中我们需要把上游指令解析模块中发来的频率控制字和指示信号即dds_din_freq和dds_din_freq_vld、相位控制字和指示信号即dds_din_phase和dds_din_phase_vld、复位信号即ddsip_sclr写入到DDS IP核中,如图1所示是正弦波模块的代码设

    2024年02月01日
    浏览(51)
  • FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(二)

         通过上面的介绍相信大家对数字变频已经有了一个较为整体性的认识,下面笔者来对照XILINX的DDS IP核对数字变频技术展开更进一步的说明,做到了理论和实践很好地结合,这样大家再带入Modelsim进行仿真测试就不仅掌握了数字变频的理论知识,也明白了其IP核的使用方法

    2024年02月22日
    浏览(45)
  • FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(四)

            接着同样地我们也需要完成对千兆网口ETH模块和USB2.0模块的编写,实际上和UART串口模块的设计思想大同小异,也同样地需要完成两项关键功能即识别并解析报文、接收并发送数据,千兆网口ETH和USB2.0的底层驱动在前面的例程中也详细说明了,所以在这里笔者不想再重

    2024年02月04日
    浏览(56)
  • FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(三)

            如图1所示是USB2.0/RS232/ETH控制并行DAC输出任意频率正弦波、梯形波、三角波、方波的整体设计示意图,可以看到上位机通过RS232串口、ETH千兆网口以及USB2.0接口和FPGA建立通信,通过不同的接口发送报文,FPGA在指令解析模块中把相关设置和参数再下发到任意波(方波、

    2023年04月15日
    浏览(47)
  • FPGA千兆网口数据传输MDIO接口——FPGA学习笔记3

            是当今现有局域网采用的最通用的通信协议标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。成本低,通信速率高,抗干扰能力强。 标准以太网:10Mbit/s 快速以太网:100Mbit/s 千兆以太网:1000Mbit/s ......... 以太网和千兆网口其实不完全相同。

    2024年03月24日
    浏览(47)
  • 基于FPGA的视频接口之千兆网口(三UDP搭建)

            相信网络上对于FPGA驱动网口的开发板、博客、论坛数不胜数,为何博主需要重新手敲一遍呢,而不是做一个文抄君呢!因为目前博主感觉网络上描述的多为应用层上的开发,非从底层开始说明,本博主的思虑还是按照老规矩,按照硬件、底层、应用等关系,使用

    2024年02月07日
    浏览(40)
  • FPGA20个例程专栏介绍

                 通过“FPGA基础知识”专栏的实践学习,相信朋友们已经踏上了有趣的FPGA学习之路,掌握了一些必备的FPGA基础知识、开发工具、代码技巧等等,是一个进阶提升的好契机,这里闲话不多说,开门见山笔者结合实际的项目工程经验,精心准备了20个经典的例程。

    2024年02月05日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包