设计任务:
使用 FPGA 来构建 MAC 层和 UDP 组包,完成从板卡到主机的数据包传递链路。
项目目的:
通过学习以太网的 UDP 帧协议,完成包的构建和使用网络抓包工具抓包分析数据包是否正确。
千兆以太网心跳包的产生流程:
第一:根据 Timer 定时器产生触发条件,触发产生心跳包,在一些系统中需要根据需求发送心跳包。
第二:根据以太网协议把 UDP 的基本帧结构构建出来。
第三:UDP 包包含两个校验和需要计算,我们这里是使用硬件进行校验和计算,也就是用 FPGA 逻辑电路搭建一个校验和计算模块。
第四:在帧的尾部添加 4 个字节的 CRC 校验字段,完成整个帧的设计。
第五:通过 ODDR 模块完成 8 比特到 4 比特的转换操作。
CRC 填充模块:
将 checksum 模块组成的有 CRC 校验的千兆以太网 UDP 协议包传输到 crc_ctrl 模块,在该模块中推导出 32 位 crc 校验位, CRC 进行校验时不对千兆以太网帧头计算,即 7 个 0x55 和 1 个 0xd5 不参与 CRC 校验,将推导出的 32bit 的 crc 校 验码分成 4 个字节填充到 checksum_ctrl 模块传输来的没有 CRC 校验的千兆以太 网 UDP 协议包后面,即可组成完整的千兆以太网 UDP 包。
1. CRC 计算模块初始值为 0xffffffff
2. CRC 计算结果需要高低位对调,因为我们输入是先从高位输入计算的 CRC, 所以高低位要需要对调。
3. CRC 最后结果需要取反,对调完成的代码需要取反操作才能正确。
以上三步是标准千兆以太网所定义适用于以太网通信。
CRC 填充模块代码实现:
module crc32_d8_send_02(
input wire rst,
input wire sclk,
input wire dsin,
input wire [7:0] din,
input wire pre_flag,
input wire crc_err_en,
output reg dsout,
output reg [7:0] dout
);
//***