名称:千兆以太网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开发板如下,其他开发板可以修改管脚适配:
设计文档:
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