名称:千兆以太网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
1438