首页 > 其他分享 >万兆以太网协议栈的FPGA实现(三):万兆网CRC

万兆以太网协议栈的FPGA实现(三):万兆网CRC

时间:2024-08-19 22:37:12浏览次数:12  
标签:FPGA crc media 31 assign CRC lfsr data 以太网

参考:

基于FPGA的千兆以太网的实现(3)_以太网crc计算-CSDN博客

 

CRC 802.11来自将8位数据同时输入,再输出32位CRC数值;

其能成功实现的原因就是因为并行化。(下路仅是部分的计算步骤)

结合千兆网CRC的计算思想,我们只需要把第一轮单字节CRC的结果作为第二轮CRC的开始,就可以完成任务。

千兆网CRC:

  always @(*) begin
        crc_lfsr[0]  = crc_r[24] ^ crc_r[30] ^ r_i_data[0] ^ r_i_data[6];
        crc_lfsr[1]  = crc_r[24] ^ crc_r[25] ^ crc_r[30]   ^ crc_r[31]   ^ r_i_data[0] ^ r_i_data[1] ^ r_i_data[6] ^ r_i_data[7];
        crc_lfsr[2]  = crc_r[24] ^ crc_r[25] ^ crc_r[26]   ^ crc_r[30]   ^ crc_r[31]   ^ r_i_data[0] ^ r_i_data[1] ^ r_i_data[2] ^ r_i_data[6] ^ r_i_data[7];
        crc_lfsr[3]  = crc_r[25] ^ crc_r[26] ^ crc_r[27]   ^ crc_r[31]   ^ r_i_data[1] ^ r_i_data[2] ^ r_i_data[3] ^ r_i_data[7];
        crc_lfsr[4]  = crc_r[24] ^ crc_r[26] ^ crc_r[27]   ^ crc_r[28]   ^ crc_r[30]   ^ r_i_data[0] ^ r_i_data[2] ^ r_i_data[3] ^ r_i_data[4] ^ r_i_data[6];
        crc_lfsr[5]  = crc_r[24] ^ crc_r[25] ^ crc_r[27]   ^ crc_r[28]   ^ crc_r[29]   ^ crc_r[30]   ^ crc_r[31]   ^ r_i_data[0] ^ r_i_data[1] ^ r_i_data[3] ^ r_i_data[4] ^ r_i_data[5] ^ r_i_data[6] ^ r_i_data[7];
        crc_lfsr[6]  = crc_r[25] ^ crc_r[26] ^ crc_r[28]   ^ crc_r[29]   ^ crc_r[30]   ^ crc_r[31]   ^ r_i_data[1] ^ r_i_data[2] ^ r_i_data[4] ^ r_i_data[5] ^ r_i_data[6] ^ r_i_data[7];
        crc_lfsr[7]  = crc_r[24] ^ crc_r[26] ^ crc_r[27]   ^ crc_r[29]   ^ crc_r[31]   ^ r_i_data[0] ^ r_i_data[2] ^ r_i_data[3] ^ r_i_data[5] ^ r_i_data[7];
        crc_lfsr[8]  = crc_r[0]  ^ crc_r[24] ^ crc_r[25]   ^ crc_r[27]   ^ crc_r[28]   ^ r_i_data[0] ^ r_i_data[1] ^ r_i_data[3] ^ r_i_data[4];
        crc_lfsr[9]  = crc_r[1]  ^ crc_r[25] ^ crc_r[26]   ^ crc_r[28]   ^ crc_r[29]   ^ r_i_data[1] ^ r_i_data[2] ^ r_i_data[4] ^ r_i_data[5];
        crc_lfsr[10] = crc_r[2]  ^ crc_r[24] ^ crc_r[26]   ^ crc_r[27]   ^ crc_r[29]   ^ r_i_data[0] ^ r_i_data[2] ^ r_i_data[3] ^ r_i_data[5];
        crc_lfsr[11] = crc_r[3]  ^ crc_r[24] ^ crc_r[25]   ^ crc_r[27]   ^ crc_r[28]   ^ r_i_data[0] ^ r_i_data[1] ^ r_i_data[3] ^ r_i_data[4];
        crc_lfsr[12] = crc_r[4]  ^ crc_r[24] ^ crc_r[25]   ^ crc_r[26]   ^ crc_r[28]   ^ crc_r[29]   ^ crc_r[30]   ^ r_i_data[0] ^ r_i_data[1] ^ r_i_data[2] ^ r_i_data[4] ^ r_i_data[5] ^ r_i_data[6];
        crc_lfsr[13] = crc_r[5]  ^ crc_r[25] ^ crc_r[26]   ^ crc_r[27]   ^ crc_r[29]   ^ crc_r[30]   ^ crc_r[31]   ^ r_i_data[1] ^ r_i_data[2] ^ r_i_data[3] ^ r_i_data[5] ^ r_i_data[6] ^ r_i_data[7];
        crc_lfsr[14] = crc_r[6]  ^ crc_r[26] ^ crc_r[27]   ^ crc_r[28]   ^ crc_r[30]   ^ crc_r[31]   ^ r_i_data[2] ^ r_i_data[3] ^ r_i_data[4] ^ r_i_data[6] ^ r_i_data[7];
        crc_lfsr[15] = crc_r[7]  ^ crc_r[27] ^ crc_r[28]   ^ crc_r[29]   ^ crc_r[31]   ^ r_i_data[3] ^ r_i_data[4] ^ r_i_data[5] ^ r_i_data[7];
        crc_lfsr[16] = crc_r[8]  ^ crc_r[24] ^ crc_r[28]   ^ crc_r[29]   ^ r_i_data[0] ^ r_i_data[4] ^ r_i_data[5];
        crc_lfsr[17] = crc_r[9]  ^ crc_r[25] ^ crc_r[29]   ^ crc_r[30]   ^ r_i_data[1] ^ r_i_data[5] ^ r_i_data[6];
        crc_lfsr[18] = crc_r[10] ^ crc_r[26] ^ crc_r[30]   ^ crc_r[31]   ^ r_i_data[2] ^ r_i_data[6] ^ r_i_data[7];
        crc_lfsr[19] = crc_r[11] ^ crc_r[27] ^ crc_r[31]   ^ r_i_data[3] ^ r_i_data[7];
        crc_lfsr[20] = crc_r[12] ^ crc_r[28] ^ r_i_data[4];
        crc_lfsr[21] = crc_r[13] ^ crc_r[29] ^ r_i_data[5];
        crc_lfsr[22] = crc_r[14] ^ crc_r[24] ^ r_i_data[0];
        crc_lfsr[23] = crc_r[15] ^ crc_r[24] ^ crc_r[25]  ^ crc_r[30]   ^ r_i_data[0] ^ r_i_data[1] ^ r_i_data[6];
        crc_lfsr[24] = crc_r[16] ^ crc_r[25] ^ crc_r[26]  ^ crc_r[31]   ^ r_i_data[1] ^ r_i_data[2] ^ r_i_data[7];
        crc_lfsr[25] = crc_r[17] ^ crc_r[26] ^ crc_r[27]  ^ r_i_data[2] ^ r_i_data[3];
        crc_lfsr[26] = crc_r[18] ^ crc_r[24] ^ crc_r[27]  ^ crc_r[28]   ^ crc_r[30]   ^ r_i_data[0] ^ r_i_data[3] ^ r_i_data[4] ^ r_i_data[6];
        crc_lfsr[27] = crc_r[19] ^ crc_r[25] ^ crc_r[28]  ^ crc_r[29]   ^ crc_r[31]   ^ r_i_data[1] ^ r_i_data[4] ^ r_i_data[5] ^ r_i_data[7];
        crc_lfsr[28] = crc_r[20] ^ crc_r[26] ^ crc_r[29]  ^ crc_r[30]   ^ r_i_data[2] ^ r_i_data[5] ^ r_i_data[6];
        crc_lfsr[29] = crc_r[21] ^ crc_r[27] ^ crc_r[30]  ^ crc_r[31]   ^ r_i_data[3] ^ r_i_data[6] ^ r_i_data[7];
        crc_lfsr[30] = crc_r[22] ^ crc_r[28] ^ crc_r[31]  ^ r_i_data[4] ^ r_i_data[7];
        crc_lfsr[31] = crc_r[23] ^ crc_r[29] ^ r_i_data[5];
    end // always

万兆网CRC

步骤1:输入初始值

r_crc_value会每个时钟周期更新;     always @(posedge i_clk) begin         if(i_rst) begin             r_crc_value <= 32'hffff_ffff;         end else if(i_valid == 0) begin             r_crc_value <= 32'hffff_ffff;         end else if(i_valid == 1'b1) begin             r_crc_value <= w_crc_data[7];         end else begin             r_crc_value <= r_crc_value;         end     end
 

步骤二:计算每个字节的CRC32:

        assign w_crc_data[i_1][0]  = r_crc_media[i_1][24] ^ r_crc_media[i_1][30] ^ r_i_data[i_1][0] ^ r_i_data[i_1][6];
        assign w_crc_data[i_1][1]  = r_crc_media[i_1][24] ^ r_crc_media[i_1][25] ^ r_crc_media[i_1][30]   ^ r_crc_media[i_1][31]   ^ r_i_data[i_1][0] ^ r_i_data[i_1][1] ^ r_i_data[i_1][6] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][2]  = r_crc_media[i_1][24] ^ r_crc_media[i_1][25] ^ r_crc_media[i_1][26]   ^ r_crc_media[i_1][30]   ^ r_crc_media[i_1][31]   ^ r_i_data[i_1][0] ^ r_i_data[i_1][1] ^ r_i_data[i_1][2] ^ r_i_data[i_1][6] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][3]  = r_crc_media[i_1][25] ^ r_crc_media[i_1][26] ^ r_crc_media[i_1][27]   ^ r_crc_media[i_1][31]   ^ r_i_data[i_1][1] ^ r_i_data[i_1][2] ^ r_i_data[i_1][3] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][4]  = r_crc_media[i_1][24] ^ r_crc_media[i_1][26] ^ r_crc_media[i_1][27]   ^ r_crc_media[i_1][28]   ^ r_crc_media[i_1][30]   ^ r_i_data[i_1][0] ^ r_i_data[i_1][2] ^ r_i_data[i_1][3] ^ r_i_data[i_1][4] ^ r_i_data[i_1][6];
        assign w_crc_data[i_1][5]  = r_crc_media[i_1][24] ^ r_crc_media[i_1][25] ^ r_crc_media[i_1][27]   ^ r_crc_media[i_1][28]   ^ r_crc_media[i_1][29]   ^ r_crc_media[i_1][30]   ^ r_crc_media[i_1][31]   ^ r_i_data[i_1][0] ^ r_i_data[i_1][1] ^ r_i_data[i_1][3] ^ r_i_data[i_1][4] ^ r_i_data[i_1][5] ^ r_i_data[i_1][6] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][6]  = r_crc_media[i_1][25] ^ r_crc_media[i_1][26] ^ r_crc_media[i_1][28]   ^ r_crc_media[i_1][29]   ^ r_crc_media[i_1][30]   ^ r_crc_media[i_1][31]   ^ r_i_data[i_1][1] ^ r_i_data[i_1][2] ^ r_i_data[i_1][4] ^ r_i_data[i_1][5] ^ r_i_data[i_1][6] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][7]  = r_crc_media[i_1][24] ^ r_crc_media[i_1][26] ^ r_crc_media[i_1][27]   ^ r_crc_media[i_1][29]   ^ r_crc_media[i_1][31]   ^ r_i_data[i_1][0] ^ r_i_data[i_1][2] ^ r_i_data[i_1][3] ^ r_i_data[i_1][5] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][8]  = r_crc_media[i_1][0]  ^ r_crc_media[i_1][24] ^ r_crc_media[i_1][25]   ^ r_crc_media[i_1][27]   ^ r_crc_media[i_1][28]   ^ r_i_data[i_1][0] ^ r_i_data[i_1][1] ^ r_i_data[i_1][3] ^ r_i_data[i_1][4];
        assign w_crc_data[i_1][9]  = r_crc_media[i_1][1]  ^ r_crc_media[i_1][25] ^ r_crc_media[i_1][26]   ^ r_crc_media[i_1][28]   ^ r_crc_media[i_1][29]   ^ r_i_data[i_1][1] ^ r_i_data[i_1][2] ^ r_i_data[i_1][4] ^ r_i_data[i_1][5];
        assign w_crc_data[i_1][10] = r_crc_media[i_1][2]  ^ r_crc_media[i_1][24] ^ r_crc_media[i_1][26]   ^ r_crc_media[i_1][27]   ^ r_crc_media[i_1][29]   ^ r_i_data[i_1][0] ^ r_i_data[i_1][2] ^ r_i_data[i_1][3] ^ r_i_data[i_1][5];
        assign w_crc_data[i_1][11] = r_crc_media[i_1][3]  ^ r_crc_media[i_1][24] ^ r_crc_media[i_1][25]   ^ r_crc_media[i_1][27]   ^ r_crc_media[i_1][28]   ^ r_i_data[i_1][0] ^ r_i_data[i_1][1] ^ r_i_data[i_1][3] ^ r_i_data[i_1][4];
        assign w_crc_data[i_1][12] = r_crc_media[i_1][4]  ^ r_crc_media[i_1][24] ^ r_crc_media[i_1][25]   ^ r_crc_media[i_1][26]   ^ r_crc_media[i_1][28]   ^ r_crc_media[i_1][29]   ^ r_crc_media[i_1][30]   ^ r_i_data[i_1][0] ^ r_i_data[i_1][1] ^ r_i_data[i_1][2] ^ r_i_data[i_1][4] ^ r_i_data[i_1][5] ^ r_i_data[i_1][6];
        assign w_crc_data[i_1][13] = r_crc_media[i_1][5]  ^ r_crc_media[i_1][25] ^ r_crc_media[i_1][26]   ^ r_crc_media[i_1][27]   ^ r_crc_media[i_1][29]   ^ r_crc_media[i_1][30]   ^ r_crc_media[i_1][31]   ^ r_i_data[i_1][1] ^ r_i_data[i_1][2] ^ r_i_data[i_1][3] ^ r_i_data[i_1][5] ^ r_i_data[i_1][6] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][14] = r_crc_media[i_1][6]  ^ r_crc_media[i_1][26] ^ r_crc_media[i_1][27]   ^ r_crc_media[i_1][28]   ^ r_crc_media[i_1][30]   ^ r_crc_media[i_1][31]   ^ r_i_data[i_1][2] ^ r_i_data[i_1][3] ^ r_i_data[i_1][4] ^ r_i_data[i_1][6] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][15] = r_crc_media[i_1][7]  ^ r_crc_media[i_1][27] ^ r_crc_media[i_1][28]   ^ r_crc_media[i_1][29]   ^ r_crc_media[i_1][31]   ^ r_i_data[i_1][3] ^ r_i_data[i_1][4] ^ r_i_data[i_1][5] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][16] = r_crc_media[i_1][8]  ^ r_crc_media[i_1][24] ^ r_crc_media[i_1][28]   ^ r_crc_media[i_1][29]   ^ r_i_data[i_1][0] ^ r_i_data[i_1][4] ^ r_i_data[i_1][5];
        assign w_crc_data[i_1][17] = r_crc_media[i_1][9]  ^ r_crc_media[i_1][25] ^ r_crc_media[i_1][29]   ^ r_crc_media[i_1][30]   ^ r_i_data[i_1][1] ^ r_i_data[i_1][5] ^ r_i_data[i_1][6];
        assign w_crc_data[i_1][18] = r_crc_media[i_1][10] ^ r_crc_media[i_1][26] ^ r_crc_media[i_1][30]   ^ r_crc_media[i_1][31]   ^ r_i_data[i_1][2] ^ r_i_data[i_1][6] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][19] = r_crc_media[i_1][11] ^ r_crc_media[i_1][27] ^ r_crc_media[i_1][31]   ^ r_i_data[i_1][3] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][20] = r_crc_media[i_1][12] ^ r_crc_media[i_1][28] ^ r_i_data[i_1][4];
        assign w_crc_data[i_1][21] = r_crc_media[i_1][13] ^ r_crc_media[i_1][29] ^ r_i_data[i_1][5];
        assign w_crc_data[i_1][22] = r_crc_media[i_1][14] ^ r_crc_media[i_1][24] ^ r_i_data[i_1][0];
        assign w_crc_data[i_1][23] = r_crc_media[i_1][15] ^ r_crc_media[i_1][24] ^ r_crc_media[i_1][25]  ^ r_crc_media[i_1][30]   ^ r_i_data[i_1][0] ^ r_i_data[i_1][1] ^ r_i_data[i_1][6];
        assign w_crc_data[i_1][24] = r_crc_media[i_1][16] ^ r_crc_media[i_1][25] ^ r_crc_media[i_1][26]  ^ r_crc_media[i_1][31]   ^ r_i_data[i_1][1] ^ r_i_data[i_1][2] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][25] = r_crc_media[i_1][17] ^ r_crc_media[i_1][26] ^ r_crc_media[i_1][27]  ^ r_i_data[i_1][2] ^ r_i_data[i_1][3];
        assign w_crc_data[i_1][26] = r_crc_media[i_1][18] ^ r_crc_media[i_1][24] ^ r_crc_media[i_1][27]  ^ r_crc_media[i_1][28]   ^ r_crc_media[i_1][30]   ^ r_i_data[i_1][0] ^ r_i_data[i_1][3] ^ r_i_data[i_1][4] ^ r_i_data[i_1][6];
        assign w_crc_data[i_1][27] = r_crc_media[i_1][19] ^ r_crc_media[i_1][25] ^ r_crc_media[i_1][28]  ^ r_crc_media[i_1][29]   ^ r_crc_media[i_1][31]   ^ r_i_data[i_1][1] ^ r_i_data[i_1][4] ^ r_i_data[i_1][5] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][28] = r_crc_media[i_1][20] ^ r_crc_media[i_1][26] ^ r_crc_media[i_1][29]  ^ r_crc_media[i_1][30]   ^ r_i_data[i_1][2] ^ r_i_data[i_1][5] ^ r_i_data[i_1][6];
        assign w_crc_data[i_1][29] = r_crc_media[i_1][21] ^ r_crc_media[i_1][27] ^ r_crc_media[i_1][30]  ^ r_crc_media[i_1][31]   ^ r_i_data[i_1][3] ^ r_i_data[i_1][6] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][30] = r_crc_media[i_1][22] ^ r_crc_media[i_1][28] ^ r_crc_media[i_1][31]  ^ r_i_data[i_1][4] ^ r_i_data[i_1][7];
        assign w_crc_data[i_1][31] = r_crc_media[i_1][23] ^ r_crc_media[i_1][29] ^ r_i_data[i_1][5];

步骤三:将每个字节的CRC结果作为下一个字节CRC的初始值:

r_crc_media用来记录这个数值; r_crc_media[0]是上一轮计算的结果;作为这一轮CRC的初值; 如果是第一个字节,上一个字节就是上一轮的结果;         always @(*) begin             if(i_1 > 0) begin                 r_crc_media[i_1] = w_crc_data[i_1-1];             end else begin                 r_crc_media[i_1] = r_crc_media[i_1];             end         end

即可完成计算。

 

标签:FPGA,crc,media,31,assign,CRC,lfsr,data,以太网
From: https://www.cnblogs.com/VerweileDoch/p/18368254

相关文章

  • RK3568调试YT8531单网口千兆以太网PHY芯片,GAMC调试
    异常现象当硬件上使用YT8531替代Realtek瑞昱的RTL8211之后,出现系统能够正确识别ETHx,也能设置IP地址,但是外部无法ping成功或者重启后IP地址还会丢失的问题;硬件排查思路检查电源:输入3.3v;输出1.1v,RGMII的电平配置是否如设计预期(1.8v/2.5v/3.3v),尤其RGMII电平配置为3.3......
  • 网络监控加速设备:搭载CPU(海光3350) +FPGA(复旦微V7 690T )高性能网安设备
        网络加速监控设备通常是指能够监测和优化网络数据传输速度的硬件或软件系统。尤其是在处理大量数据流、数据中心、云计算等领域,对高速数据传输、性能的稳定性及较强的扩展性有特别高的要求。下面这款设备就应运而生。简介    网络监控加速设备是集协议检测......
  • [GUET-CTF2019]虚假的压缩包1附送RSA解密&CRC破解png宽高&异或python脚本
    解压得到下图两个zip文件,虚假的压缩包、真实的压缩包使用010editor打开,发现是伪加密,把09改为00即可打开打开以后,发现是是一个rsa解密题上python脚本importgmpy2deffind_pq(n):forpinrange(2,int(n**0.5)+1):ifn%p==0:q=......
  • 无网卡Ubuntu通过网线有线接入Windows主机子网,以太网子网显示“未识别的网络”,且无Int
    因为工作需要,开始在Ubuntu主机上部署CAPEv2沙箱草单的是,我的Ubuntu主机没有网卡。于是选择通过一根网线将Ubuntu与另一台Windows主机相连,使Ubuntu成为Windows的子网从而可以上网首先常规操作:控制面板→网络和Internet→网络和共享中心→更改适配器设置,进入如下界面右键WLAN→......
  • CORDIC算法解释及FPGA实现(圆坐标系)
    CORDIC算法原理阐述CORDIC(CoordinateRotationDigitalComputer)算法,即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数、双曲线、指数、对数的计算。伪旋转在笛卡尔坐标平面(下方左图)由\(({x_1},{y_1})\)旋转θ角度至\(({x_2},{y_2})\)得到:\(({\hat......
  • fpga图像处理实战-对数变换
    对数变换        图像对数变换(LogarithmicTransformation)是一种非线性灰度变换方法,常用于增强图像中的细节,特别是在图像中存在较大的亮度范围时。对数变换通过压缩亮度范围,使得较暗区域的细节更加明显,同时抑制过亮区域的影响。它在图像处理中的应用非常广泛,特别是在......
  • fpga图像处理实战-图像缓存(FIFO)
    FPGA实现`timescale1ns/1ps////Company://Engineer:////CreateDate:2024/08/1813:47:22//DesignName://ModuleName:line_buffer//ProjectName://TargetDevices://ToolVersions://Description:////Dependencies:////Revision......
  • 详解Xilinx FPGA高速串行收发器GTX/GTP(9)--TX/RX通道
    目录1、TX端的剩余模块1.1、TXPIPEControl1.2、TXGearbox1.3、PCIEBeacon1.4、SATAOOB1.5、PhaseAdjustFIFO1.6、Polarity1.7、PISO1.8、TXPre/PostEmp和10、TXDriver1.9、TXOOBandPCIE1.10、TXDriver1.11、TXPhaseInterpolatorController(包括12......
  • 基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
    目录1.算法运行效果图预览2.算法运行软件版本3.部分程序4.算法理论概述5.算法完整程序工程1.算法运行效果图预览(完整程序运行后无水印)将FPGA的仿真结果导入到MATLAB中,分别得到MATLAB的结果和FPGA的结果:2.算法运行软件版本vivado2019.2matlab2022a3.部分程序......
  • 【A GUIDE TO CRC ERROR DETECTION ALGORITHM】 (译文3-Todo)
    11."Reflected"Table-DrivenImplementations“反射”表驱动实现Despitethefactthattheabovecodeisprobablyoptimizedaboutasmuchasitcouldbe,thisdidnotstopsomeenterprisingindividualsfrommakingthingsevenmorecomplicated.Toundersta......