• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

千兆以太网UDP协议测试试验设计Verilog代码VIVADO ARTIX-7开发板

10小时前
168
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-2411111Z015951.docx

共1个文件

名称:千兆以太网UDP协议测试试验设计Verilog代码VIVADO? ARTIX-7开发板

软件:VIVADO

语言:Verilog

代码功能:

千兆以太网UDP协议测试试验

实现PC端通过千兆网口发送数据到FPGA,FPGA数据同样是通过千兆网口发回PC端.通信协议采用UDP协议。本实验通过PC端触发,然后开发板通过千兆网接口发送UDP数据给PC端。

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com

本代码已在ARTIX-7开发板验证,ARTIX-7开发板如下,其他开发板可以修改管脚适配:

ARTIX-7开发板.png

设计文档:

1.简介

本试验用来验证开发板FPGA千兆以太网通信接口,通信协议采用UDP协议。本实验通过PC端触发,然后开发板通过千兆网接口发送UDP数据给PC端。

2.实验原理

开发板通过1片RTL8211EG以太网PHY芯片为用户提供网络通信服务。以太网PHY芯片是连接到Artix-7FPGA的IO接口上。RTL8211EG芯片支持10/100/1000Mbps网络传输速率,通过GMII接口跟FPGA进行数据通信。开发板支持MDI/MDX自适应,各种速度自适应,Master/Slave自适应,支持MDIO总线进行PHY的寄存器管理。当网口Link到千兆以太网时,FPGA通过GMII总线和PHY芯片进行数据通信,当网口Link到百兆以太网时,PGA通过MII总线和PHY芯片进行数据通信。另外FPGA可以通过MDI/MDIO管理接口来配置或读取PHY芯片内部的寄存器。在千兆的GMII通信模式下,发送数据时,发送时钟为125Mhz的E1_GTXC信号,数据为E1_TXD[7:0],数据有效信号为E1_TXEN,E1_TXC信号连接但没有使用;接收数据时,接收时钟为125Mhz的E1_RXC信号,数据为E1_RXC[7:0],数据有效信号为E1_RXDV。

具体的网络协议格式和以太网RTL8211EG芯片说明,可在网站上和附带资料搜索。开发板的千兆网接口框图如下:

3.程序设计

主程序为ethernet_test.v,ethernet_test.v里面的udp.v文件主要包含三个verilog程序:ipsend.v、iprecieve.v、crc.v,其中ipsend.v主要是实现UDP报文的发送,

iprecieve.v主要是实现UDP报文的接收,crc.v主要是实现发送和接收报文的CRC校验。本例程代码注释详细,具体内容可打开工程后注释。工程的引脚分配如下:

信号名

方向

管脚

BANK

端口说明

E1_MDC

output

R11

BANK14

MD时钟

E1_MDIO

inout

L18

BANK14

MD数据线

E1_GTXC

output

M18

BANK14

GMII时钟

E1_TXEN

output

R12

BANK14

发送使能

E1_TXER

output

R13

BANK14

发送错误

E1_RXER

input

P17

BANK14

接收错误

E1_CRS

input

U16

BANK14

载波检测

E1_RXCOL

input

V17

BANK14

碰撞输出

E1_PME

input

U12

BANK14

电源管理事件输出

E1_TXC

output

M17

BANK14

发送时钟

E1_RXC

input

N15

BANK14

接收时钟

E1_RDV

input

N16

BANK14

接收数据有效标志输出

E1_RESET

output

V12

BANK14

硬件复位 低有效

E1_ENSWEREG

output

U14

BANK14

电压使能输出

E1_TXDO

output

T13

BANK14

发送数据总线

E1_TXD1

output

R18

BANK14

发送数据总线

E1_TXD2

output

T18

BANK14

发送数据总线

E1_TXD3

output

N14

BANK14

发送数据总线

E1_TXD4

output

P14

BANK14

发送数据总线

E1_TXD5

output

N17

BANK14

发送数据总线

E1_TXD6

output

P18

BANK14

发送数据总线

E1_TXD7

output

M16

BANK14

发送数据总线

E1_RXD0

input

R17

BANK14

接收数据总线

E1_RXD1

input

P15

BANK14

接收数据总线

E1_RXD2

input

R15

BANK14

接收数据总线

E1_RXD3

input

T14

BANK14

接收数据总线

E1_RXD4

input

T15

BANK14

接收数据总线

E1_RXD5

input

V16

BANK14

接收数据总线

E1_RXD6

input

U17

BANK14

接收数据总线

E1_RXD7

input

U18

BANK14

接收数据总线

4.实验现象

4.1准备工作

第一步:首先确认一下自己PC的网卡是否是千兆网卡,用户可以点击本地连接查看,再用五类+或者六类网线连接开发板的网口和PC的网口。

第二步:修改PC的IP地址为192.168.0.3。PC的IP Address需要和ethernet_test.v中

设置一致,不然网络调试助手会接收不到开发板发送的UDP数据包。

第三步:安装Wireshark是为了方便用户网络通信的调试,我们在实验的时候可以用这工具来查看PC网口发送的数据和接收到的数据的详细信息。

4.2以太网通信测试

第一步:烧写实验工程中bit,等待两三秒,观看开发板网络接口的LED灯,如果led灯没亮,需要检查网口连接情况。

第二步:以管理员权限打开CMD窗口,输入arp–a查看ARP绑定结果,可以看到开发板的IP地址和MAC地址已经缓存。

第三步:在CMD窗口中,输入ping192.168.0.2查看PC与开发板是否ping通。

第四步:打开附带的网络调试助手并设置参数如下,再按连接按钮(这里的本地的IP地址为PC的IP Address,本地端口需要跟FPGA程序中的一致,为8080)。

这时网络数据接收窗口会显示FPGA发给PC的以太网数据包"HELLOHELLOHELLO"目标主机的IP地址需要和FPGA程序中的IP地址一致,目标端口号也需要和FPGA程序的一致(8080)。如下图显示:

第五步:再在网络调试助手的发送窗口发送一大串字符,在网络的数据接收窗口我们可以看到从FPGA返回的数据也变成刚发送的字符串。也可以发送较少字符,低于46字节,FPGA程序会自动补充至46字节。

第六步:这一步对用户来讲是可选的,用户如果想查看更多数据包传输的信息,可以使用网络抓包工具Wireshark来查看PC的网卡接收和发送的网络数据,打开安装好的wireshark抓包工具,点击菜单抓包->网络接口。

在弹出的抓包接口窗口选择PC的千兆网卡,按开始按钮开始抓包。

在wireshark抓包窗口我们可以看到开发板(192.168.0.2)向PC网口(192.168.0.2)发来的数据包,这里会显示数据包的目标MAC,源MAC,IP包头和UDP包等信息,如下图开发板抓包窗口显示:

部分代码展示:

`timescale?1ns?/?1ps
module?crc?(Clk,?Reset,?Data_in,?Enable,?Crc,CrcNext);
parameter?Tp?=?1;
input?Clk;
input?Reset;
input?[7:0]?Data_in;
input?Enable;
output?[31:0]?Crc;
reg??[31:0]?Crc;
output?[31:0]?CrcNext;
wire?[7:0]?Data;
assign?Data={Data_in[0],Data_in[1],Data_in[2],Data_in[3],Data_in[4],Data_in[5],Data_in[6],Data_in[7]};
assign?CrcNext[0]?=?Crc[24]?^?Crc[30]?^?Data[0]?^?Data[6];
assign?CrcNext[1]?=?Crc[24]?^?Crc[25]?^?Crc[30]?^?Crc[31]?^?Data[0]?^?Data[1]?^?Data[6]?^?Data[7];
assign?CrcNext[2]?=?Crc[24]?^?Crc[25]?^?Crc[26]?^?Crc[30]?^?Crc[31]?^?Data[0]?^?Data[1]?^?Data[2]?^?Data[6]?^?Data[7];
assign?CrcNext[3]?=?Crc[25]?^?Crc[26]?^?Crc[27]?^?Crc[31]?^?Data[1]?^?Data[2]?^?Data[3]?^?Data[7];
assign?CrcNext[4]?=?Crc[24]?^?Crc[26]?^?Crc[27]?^?Crc[28]?^?Crc[30]?^?Data[0]?^?Data[2]?^?Data[3]?^?Data[4]?^?Data[6];
assign?CrcNext[5]?=?Crc[24]?^?Crc[25]?^?Crc[27]?^?Crc[28]?^?Crc[29]?^?Crc[30]?^?Crc[31]?^?Data[0]?^?Data[1]?^?Data[3]?^?Data[4]?^?Data[5]?^?Data[6]?^?Data[7];
assign?CrcNext[6]?=?Crc[25]?^?Crc[26]?^?Crc[28]?^?Crc[29]?^?Crc[30]?^?Crc[31]?^?Data[1]?^?Data[2]?^?Data[4]?^?Data[5]?^?Data[6]?^?Data[7];
assign?CrcNext[7]?=?Crc[24]?^?Crc[26]?^?Crc[27]?^?Crc[29]?^?Crc[31]?^?Data[0]?^?Data[2]?^?Data[3]?^?Data[5]?^?Data[7];
assign?CrcNext[8]?=?Crc[0]?^?Crc[24]?^?Crc[25]?^?Crc[27]?^?Crc[28]?^?Data[0]?^?Data[1]?^?Data[3]?^?Data[4];
assign?CrcNext[9]?=?Crc[1]?^?Crc[25]?^?Crc[26]?^?Crc[28]?^?Crc[29]?^?Data[1]?^?Data[2]?^?Data[4]?^?Data[5];
assign?CrcNext[10]?=?Crc[2]?^?Crc[24]?^?Crc[26]?^?Crc[27]?^?Crc[29]?^?Data[0]?^?Data[2]?^?Data[3]?^?Data[5];
assign?CrcNext[11]?=?Crc[3]?^?Crc[24]?^?Crc[25]?^?Crc[27]?^?Crc[28]?^?Data[0]?^?Data[1]?^?Data[3]?^?Data[4];
assign?CrcNext[12]?=?Crc[4]?^?Crc[24]?^?Crc[25]?^?Crc[26]?^?Crc[28]?^?Crc[29]?^?Crc[30]?^?Data[0]?^?Data[1]?^?Data[2]?^?Data[4]?^?Data[5]?^?Data[6];
assign?CrcNext[13]?=?Crc[5]?^?Crc[25]?^?Crc[26]?^?Crc[27]?^?Crc[29]?^?Crc[30]?^?Crc[31]?^?Data[1]?^?Data[2]?^?Data[3]?^?Data[5]?^?Data[6]?^?Data[7];
assign?CrcNext[14]?=?Crc[6]?^?Crc[26]?^?Crc[27]?^?Crc[28]?^?Crc[30]?^?Crc[31]?^?Data[2]?^?Data[3]?^?Data[4]?^?Data[6]?^?Data[7];
assign?CrcNext[15]?=??Crc[7]?^?Crc[27]?^?Crc[28]?^?Crc[29]?^?Crc[31]?^?Data[3]?^?Data[4]?^?Data[5]?^?Data[7];
assign?CrcNext[16]?=?Crc[8]?^?Crc[24]?^?Crc[28]?^?Crc[29]?^?Data[0]?^?Data[4]?^?Data[5];
assign?CrcNext[17]?=?Crc[9]?^?Crc[25]?^?Crc[29]?^?Crc[30]?^?Data[1]?^?Data[5]?^?Data[6];
assign?CrcNext[18]?=?Crc[10]?^?Crc[26]?^?Crc[30]?^?Crc[31]?^?Data[2]?^?Data[6]?^?Data[7];
assign?CrcNext[19]?=?Crc[11]?^?Crc[27]?^?Crc[31]?^?Data[3]?^?Data[7];
assign?CrcNext[20]?=?Crc[12]?^?Crc[28]?^?Data[4];
assign?CrcNext[21]?=?Crc[13]?^?Crc[29]?^?Data[5];
assign?CrcNext[22]?=?Crc[14]?^?Crc[24]?^?Data[0];
assign?CrcNext[23]?=?Crc[15]?^?Crc[24]?^?Crc[25]?^?Crc[30]?^?Data[0]?^?Data[1]?^?Data[6];
assign?CrcNext[24]?=?Crc[16]?^?Crc[25]?^?Crc[26]?^?Crc[31]?^?Data[1]?^?Data[2]?^?Data[7];
assign?CrcNext[25]?=?Crc[17]?^?Crc[26]?^?Crc[27]?^?Data[2]?^?Data[3];
assign?CrcNext[26]?=?Crc[18]?^?Crc[24]?^?Crc[27]?^?Crc[28]?^?Crc[30]?^?Data[0]?^?Data[3]?^?Data[4]?^?Data[6];
assign?CrcNext[27]?=?Crc[19]?^?Crc[25]?^?Crc[28]?^?Crc[29]?^?Crc[31]?^?Data[1]?^?Data[4]?^?Data[5]?^?Data[7];
assign?CrcNext[28]?=?Crc[20]?^?Crc[26]?^?Crc[29]?^?Crc[30]?^?Data[2]?^?Data[5]?^?Data[6];
assign?CrcNext[29]?=?Crc[21]?^?Crc[27]?^?Crc[30]?^?Crc[31]?^?Data[3]?^?Data[6]?^?Data[7];
assign?CrcNext[30]?=?Crc[22]?^?Crc[28]?^?Crc[31]?^?Data[4]?^?Data[7];
assign?CrcNext[31]?=?Crc[23]?^?Crc[29]?^?Data[5];

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1340

  • 2-2411111Z015951.docx
    下载

相关推荐