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

news/2024/11/15 22:45:03/文章来源:https://www.cnblogs.com/VerweileDoch/p/18368254

参考:

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

 

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

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

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

千兆网CRC:

  always @(*) begincrc_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

即可完成计算。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/784024.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试场景题:一次关于线程池使用场景的讨论。

你好呀,我是歪歪。 来一起看看一个关于线程池使用场景上的问题,就当是个场景面试题了。 问题是这样的:字有点多,我直接给你上个图你就懂了:前端发起一个生成报表页面的请求,这个页面上的数据由后端多个接口返回,另外由于微服务化了,所以数据散落在每个微服务中,因此需…

R语言VAR模型的多行业关联与溢出效应可视化分析

全文链接:https://tecdat.cn/?p=37397 原文出处:拓端数据部落公众号 摘要:本文对医疗卫生、通信、金融、房地产和零售等行业的数据展开深入研究。通过读取数据、计算收益率、构建 VAR 模型并进行估计,进一步分析各行业变量的影响及残差的协方差与相关矩阵。同时,计算传…

【流程化办公利器】可视化表单拖拽生成器优势多

一起来了解可视化表单拖拽生成器的诸多优势特点,看看它是如何给企业高效助力的。当前,实现流程化办公早已成为大家的发展愿景。低代码技术平台拥有可视化操作界面、够灵活、易操作等多个优势特点,可以在推动企业实现降本、增效、提质等方面全力护航,是不多得的优质软件平台…

C#上传excel,解析主从表,1W数据快速插入数据库,5s完成

参考文章 net core天马行空系列-各大数据库快速批量插入数据方法汇总 ExcelMapperController核心代码 [HttpPost] public async Task<IActionResult> ImportToDoItems(IFormFile file) {if (file == null || file.Length == 0){return BadRequest("File is empty&qu…

Linux scp 文件传输

scp将本服务器的文件传输到远程服务器 基本语法 scp `[源路径]` `[目标服务器]`:`[目标路径]`样例 将本服务器123.txt文件传输到远程服务器并重命名为456.txt scp 123.txt user@remote_server:/home/tabu/456.txt使用-r选项复制整个目录 scp -r tabu/* user@remote_server:/hom…

Android libusb

一、环境:配置NDK环境 1、下载libusb源码: https://github.com/libusb/libusb/releases,如下图所示2、删除一些和Android平台无关的文件,删除后的文件如下图所示:思考问题:Android是怎么获取usb设备?如上图所示:连接adb shell,然后cd到/sys/bus/usb/devices/目录,命令…

《花100块做个摸鱼小网站! 》第三篇—热搜表结构设计和热搜数据存储

⭐️基础链接导航⭐️ ☁️ 阿里云活动地址 🐟 上班摸鱼小网站地址 💻 源码库地址一、前言 大家好呀,我是summo,第一篇已经教会大家怎么去阿里云买服务器,以及怎么搭建JDK、Redis、MySQL这些环境。第二篇我们把后端的应用搭建好了,并且完成了第一个爬虫(抖音)。那么这一…

关于STM32H750打破flash--2M限制的简单办法

STM32H750VBTx的flash官方规定只能使用128K的flash,但是其实是可以绕过限制,使用其片内2M的flash空间。 这里介绍一种较为简单的实现的办法,这个办法不同网络上介绍的办法,可以在keil上较轻松地实现。因为它可以使用较高STM32CubeMX(6.12.0)和keil(5.29)的版本。 首先按…

c语言中读入整型数据和浮点型数据

001、读入整型数据[root@PC1 test]# ls test.c [root@PC1 test]# cat test.c ## 测试脚本 #include <stdio.h>int main(void) {int i; //声明整型变量puts("please input an integer.");printf("input an i…

CSP24

学了些DP 学校题库有\(BUG\)首先要满足条件\(x,y\)的二进制有1的位必然包含\(a\),然后让\(s-2a\),也就是除去二进制包含\(a\)有1的位,然后\(<0\)肯定无解,其次是如果有与\(a\)同一级的含\(1\)二进制位也不合法点击查看代码 #include <bits/stdc++.h> #define speed()…