verilog网卡设计
以太网有七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、表示层和应用层。
物理层编码成码流,数据链路层也称为MAC地址,网络层实现源和终点连接,传输层实现端到端网络数据传输,对于FPGA数据传输来说可以传数据了。
以太网物理层接口分为MII接口、GMII接口和RGMII接口,除了MII接口为百兆以太网外,其余两种为千兆以太网。



接下来以百兆以太网网卡为例来分析整个网卡的结构,
以太网网卡MAC层由以太网帧头、数据部分和CRC校验3部分组成,其中MAC层的数据部分为网络层,网络层由IP报头和数据部分组成,网络层的数据部分为传输层的,传输层由UDP头和数据部分组成,用户数据就可以在UDP层传输。

以太网帧头格式如下:
| 字段 | 字段长度(字节) | 描述 |
| 前导码 | 7 | 0x55,01010101 |
| 帧开始符 | 1 | 表明下一字节的MAC字段0xD5(11010101) |
| 目的MAC地址 | 6 | 指明帧的接受者(接受的网卡地址)在电脑的开始菜单输入cmd,输入命令ipconfig-all |
| 源MAC地址 | 6 | 指明帧的发送者(发送方的物理网卡地址) |
| 长度类型 | 2 | 帧数据字段长度,ARP(0X0806)UDP(0x0800) |
| 数据和填充(上层数据) | 46-1500 | 上层数据, 通常为3层,协议数据单元 |
| 帧校验序列 | 4 | 校验数据,校验的是目的MAC、源MAC、长度类型和数据部分 |
网络层:
IP 是 TCP/IP 协议族中最核心的协议,所有的 TCP、UDP、ICMP、IGMP 数据都以IP数据报的格式传输。IP仅提供尽力而为的传输服务,如果发生某种错误,IP 会丢失该数据,然后发送 ICMP 消息给信源端。网络层包含IP报头和数据部分

| 网络层 | 字段 | 长度 (字节) | 名称 | 描述 |
| IP 报 头 | 版本+首部长度 | 1 | IP协议版本 IP首部长度 | 版本就是 IPV4或者 IPV6 ,一般选 择 IPV4 ,即版本值为 4。 IP首部长度即有多少个 32位数(IP报头),当 IP首部长度为 20时(即无可选字段),该值为 5.(5*4 =20个字节) |
| 服务类型 | 1 | 指示了报文的优 先权等 | 默认全部置 0即可 | |
| 总长度 | 2 | IP报文长度 | IP报文(报头+数据)长度 | |
| 分段标识 | 2 | 是否属于同一数 据段 | IP报文的分段 ID | |
| 段标识和段偏 移 | 2 | 可设为 0 | ||
| 生存周期 (TTL) | 1 | 可以经过的最大 路由数 | 生存时间字段设置了数据报可以经过的最多路由器数,表示数据包在网络上生存多久。TTL的初始值由源主机设置(通常为 32 或 64),一旦经过一个处理它的路由器,它的值就减去 1。当该字段的值为 0 时,数据报就被丢弃,并发送 ICMP 消息通知源主机。这样当封包在传递过程中由于某些原因而未能抵达目的地 的时候就可以避免其一直充斥在网路上面。 占 8位。 | |
| 上层协议类型(传输层协议) | 1 | 指该封包所使用的网络协议类型,如ICMP、DNS等。占 8位。 | 常用协议号: 00 :IP 01 :ICMP 06 :TCP 17 :UDP | |
| 报头校验和 | 2 | IP报头的校验和 | 只是报头的校验和不含数据部分 | |
| 源 IP地址 | 4 | 发送端的 IP地址 | ||
| 目的 IP地址 | 4 | 接收端的 IP地址 | ||
| 数据部分 | 可选字段 | 可选 | 没有的时候长度可以为 0 |
报头检验和的计算方法:
| 协议类型报头长度 | 服务类型 | IP 报文长度 | 分段标识 | 分段和偏移 | |||
| 0x45 | 0x00 | 0x00 | 0x32 | 0x00 | 0x00 | 0x00 | 0x00 |
| 普通 | 50 字节 | ||||||
| 生存周期 | 上层协议 | 报头校验和 | 源地址 | ||||
| 0x40 | 0x11 | 0xf9 | 0x59 | 0xc0 | 0xa8 | 0x00 | 0x08 |
| 64 级 | 17 UDP | 192 | 168 | 0 | 8 | ||
| 目标地址 | |||||||
| 0xc0 | 0xa8 | 0x00 | 0x09 | ||||
| 192 | 168 | 0 | 9 | ||||
按照上述提到的IP首部校验和的方法计算IP首部校验和,即:
1:0x4500+0x0032+0x0000+0x0000+0x4011+0x0000(计算时强制0
)+0xC0a8+0x0008+0xC0a8+0x0009=0x206A4
2:0x0002+0x06A4=0x06A6;
3:sum=~0x06A6=0xf959;
传输层:传输层UDP头和数据部分,UDP由16位源端口号、16位目的端口、16位UDP长度和16位UDP校验和。

| 传输层 | 字段 | 长度 (字节) | 描述 | |
| UDP头 | 源端口号 | 2 | 例如 5000 | 发送方的网络端口地址 |
| 目的端口号 | 2 | 例如 6000 | 接收方的网络端口地址 | |
| UDP长度 | 2 | UDP报文长度 | UDP报文(含数据)长度,包含UDP头的长度8和数据部分长度,单位都是字节 | |
| UDP校验和 | 2 | UDP报头校验和 | UDP协议的报头和数据的和校验,可以全部设置为0 | |
| 数据 | UDP数据 | n | 用户根据数据进行定义 |
百兆以太网的数据发送方式:一个8位数据先发低4位再发高4位,最后发CRC校验数据的8位数据时,先发高4位再发低4位。

利用verilog实现的结构如下:

仿真波形如下:

板级实现:可以通过wireshark抓包工具看到网卡发送到笔记本电脑的数据。
更多推荐


所有评论(0)