1 关于CRC硬件并行化运算的实现方法的探讨-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于CRC硬件并行化运算的实现方法的探讨

冬至子 来源:Bug记录 作者:woodfan 2023-06-20 15:27 次阅读

数据校验的基础运算原理是模2运算,也就是异或运算。

简单讲述一下CRC的原理, CRC校准首先要确定一个多项式M(x), 例如

1.jpg

根据这个多项式的最高系数5, 在数据后补充5位0. 然后对新增0的数据进行模2除法。例如数据0010, 根据上式, M(x)可以写成 110101。那么模2的最终结果为 11111,那么把这个运算结果替换为原先补充的5位0,这就是用于校验的冗余码。这样输出传输后,接收方利用同样的多项式运算,得到的结果是0, 即数据没有传输错误。

图片

更多的CRC内容介绍可以网上查询资料,此处不再赘述。

那么在高速通信中,数据以串行传输的方式在外部传输,但是在内部数据处理还是以并行数据为主。如何实现CRC硬件计算的并行化处理呢?

第一种方法,把运算过程实现,也就是输入与对应的位数做异或。然后多次并行例化这个过程,把上一轮计算的结果作为下一次计算的输入。运算结果的流程如下图:

图片

转成Verilog如下,仅作为一个例子,未仿真验证过:

reg [5:0] lsfr_tmp [3:0] ;

genvar i;
generate for (i = 0; i < 4; i = i + 1) begin: cdc_cal
always @ (posedge clk or posedge rst) begin
if (rst) begin
lsfr_tmp[i] <= 'd0;
end
else if (i != 0) begin
lsfr_tmp[i][0] <= lsfr_tmp[i-1][4] ^ data[3-i];
lsfr_tmp[i][1] <= lsfr_tmp[i-1][0] ;
lsfr_tmp[i][2] <= lsfr_tmp[i-1][4] ^ data[3-i] ^ lsfr_tmp[i-1][1];
lsfr_tmp[i][3] <= lsfr_tmp[i-1][2] ;
lsfr_tmp[i][4] <= lsfr_tmp[i-1][4] ^ data[3-i] ^ lsfr_tmp[i-1][3];
end
else begin
lsfr_tmp[0] <= 'd0;
lsfr_tmp[0][0] <= data_in[3] ;
lsfr_tmp[0][2] <= data_in[3] ;
lsfr_tmp[0][4] <= data_in[3] ;
end
end
end
endgenerate

assign crc_out = lsfr_tmp[3] ;

这种方法确实可行,在中间插入流水线的话,数据的吞吐率应该也不小。

但我们还有第二种方法,根据多项式的LSFR,推导参考资料[1]可以自动生成Verilog代码如下,得出最终的冗余码与输入和多项式之间的映射关系。

还是以4 bits的数据输入和上面的多项式为例,根据得到的verilog CRC并行化代码如下,它的输出与上一次的CRC冗余码也存在关系:

//-----------------------------------------------------------------------------
// CRC module for data[3:0] , crc[4:0]=1+x^2+x^4+x^5;
//-----------------------------------------------------------------------------
module crc(
input [3:0] data_in,
input crc_en,
output [4:0] crc_out,
input rst,
input clk);

reg [4:0] lfsr_q,lfsr_c;

assign crc_out = lfsr_q;

always @(*) begin
lfsr_c[0] = lfsr_q[1] ^ lfsr_q[2] ^ lfsr_q[3] ^ data_in[0] ^ data_in[1] ^ data_in[2];
lfsr_c[1] = lfsr_q[2] ^ lfsr_q[3] ^ lfsr_q[4] ^ data_in[1] ^ data_in[2] ^ data_in[3];
lfsr_c[2] = lfsr_q[1] ^ lfsr_q[2] ^ lfsr_q[4] ^ data_in[0] ^ data_in[1] ^ data_in[3];
lfsr_c[3] = lfsr_q[2] ^ lfsr_q[3] ^ data_in[1] ^ data_in[2];
lfsr_c[4] = lfsr_q[0] ^ lfsr_q[1] ^ lfsr_q[2] ^ lfsr_q[4] ^ data_in[0] ^ data_in[1] ^ data_in[3];

end // always

always @(posedge clk, posedge rst) begin
if(rst) begin
lfsr_q <= {5{1'b1}};
end
else begin
lfsr_q <= crc_en ? lfsr_c : lfsr_q;
end
end // always
endmodule // crc

那么它们之间的关系是如何得出的呢?根据参考资料2 提供的资料来看,关系的得出如下。

首先,输入的数据以及多项式的值会影响输出的结果。

其次,整个过程是模2运算,也就是非0即1。那么,可以把输入数据和多项式对数据结果的影响分开计算,最后整合。且我们可以用独热码的形式计算输入的每一位对输出的影响。

因此,首先考虑输入数据对结果的影响,将多项式的初始数值设为0;输入数据分别设为0001, 0010, 0100, 1000. 带入到上图的LFSR中计算,最后得到的输出数据为:

1.jpg

然后,设输入数据为0000, 多项式的初始数值为00001, 00010, 00100, 01000, 10000;带入LFSR中计算,得到的输出数据为:

1.jpg

根据上述的两表,可得out[0]跟输入数据0,1,2 bit以及多项式的1,2,3bit有关。因此做异或运算;然后依次类推,得到了所有的映射关系。然后就可以得到上述Verilog中lfsr的运算关系了。

当然,如果你的CRC的多项式初始数值默认为0,即与之前的CRC校验冗余码无关,那么其实可以不用计算多项式数值的情况,只看第一个表。现在拿第一个表的对应关系,计算下0010的冗余码。就是11111.

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CRC校验
    +关注

    关注

    0

    文章

    84

    浏览量

    15207
  • Verilog语言
    +关注

    关注

    0

    文章

    113

    浏览量

    8224
  • LSFR算法
    +关注

    关注

    0

    文章

    2

    浏览量

    1056
收藏 人收藏

    评论

    相关推荐

    Verilog并行CRC校验

    Verilog并行CRC校验
    发表于 08-20 21:52

    在Virtex-5 FPGA中使用CRC硬模块

    作为硬莫块提供的CRC模块可加速检错进程 CRC计算所依据的原理,并且探讨用线性反馈移位寄存器实现硬件
    发表于 06-18 10:04 21次下载

    Xmodem协议中CRC算法的FPAG实现

    基于解决Xmodem协议中CRC校验的目的,以经典的LFSR硬件电路为基础,采用了按字节并行运算CRC校验码,以及多字节CRC算法的
    发表于 05-07 15:29 47次下载
    Xmodem协议中<b class='flag-5'>CRC</b>算法的FPAG<b class='flag-5'>实现</b>

    一种基于矩阵的并行CRC校验算法

    串行编码原理得到8 位并行数据的CRC 校验矩阵,之后对矩阵进行迭代简化,得到32 位并行数据的参数矩阵,此参数矩阵作为该CRC 算法的核心实现
    发表于 10-30 16:39 3次下载
    一种基于矩阵的<b class='flag-5'>并行</b><b class='flag-5'>CRC</b>校验算法

    基于CRC-32并行在千兆以太网中应用

    CRC实现方式分为串行方式和并行方式,由于并行方式一个时钟周期内可以处理8个bit,与千兆以太网的C;MIl接口协议相符合,故千兆以太网的CRC
    发表于 11-13 14:20 12次下载
    基于<b class='flag-5'>CRC</b>-32<b class='flag-5'>并行</b>在千兆以太网中应用

    基于FPGA的并行CRC算法的UART控制器

    基于串行异步收发器(UART)的通信中经常用到循环冗余校验(CRC),常见的CRC校验电路多为串行校验,校验所需时钟周期较多,基于查找表或输入矩阵转换的并行算法,需要存储余数表,占用大量的硬件
    发表于 11-18 11:24 2060次阅读
    基于FPGA的<b class='flag-5'>并行</b><b class='flag-5'>CRC</b>算法的UART控制器

    基于Matlab和GPU的BESO方法的全流程并行计算策略

    针对传统并行计算方法实现结构拓扑优化快速计算的硬件成本高、程序开发效率低的问题,提出了一种基于Matlab和图形处理器(GPU)的双向渐进结构优化(BESO)方法的全流程
    发表于 12-21 15:04 2次下载
    基于Matlab和GPU的BESO<b class='flag-5'>方法</b>的全流程<b class='flag-5'>并行</b>计算策略

    如何使用FPGA实现32位并行数据的CRC16编码器

    在数据通信中, 提高数据在通信中的可靠性,以及快速的数据处理能力一直是人们所追求的,循环冗余校验CRC就是一种广泛采用的差错控制方法,也是一种最常用的信道编码方法。在介绍CRC码原理之
    发表于 03-10 15:50 14次下载
    如何使用FPGA<b class='flag-5'>实现</b>32位<b class='flag-5'>并行</b>数据的<b class='flag-5'>CRC</b>16编码器

    使用FPGA实现高速CRC并行算法的设计研究

    的高速CRC并行吏现递推公式,可适用于并行处理位宽小于等于生成多项式阶数和大于生成多项式阶数条件下的并行帧校验应用。最后分别设计了这2种条件下的硬件
    发表于 03-23 15:44 13次下载
    使用FPGA<b class='flag-5'>实现</b>高速<b class='flag-5'>CRC</b><b class='flag-5'>并行</b>算法的设计研究

    并行CRC电路HDL代码的快速生成

    CRC校验的实现基于串行位移寄存器,如果要处理并行数据,需要对电路进行改进。本文介绍了一种并行CRC电路HDL代码的快速生成钟算法,只需要带
    发表于 03-28 09:29 16次下载
    <b class='flag-5'>并行</b><b class='flag-5'>CRC</b>电路HDL代码的快速生成

    USB数据传输中CRC校验码的并行算法实现

    文章介绍了用于 USB 总线数据传输的CRC 校验的原理和算法,并且采用并行电路实现 USB2.0 中的 CRC产生和CRC校验,与传统的串
    发表于 03-28 09:32 11次下载
    USB数据传输中<b class='flag-5'>CRC</b>校验码的<b class='flag-5'>并行</b>算法<b class='flag-5'>实现</b>

    CRC校验码并行计算的FPGA实现

    用软件实现 CRC 校验码计算很难满足高速数据通信的要求 ,基于硬件实现方法中 ,有串行经典算法 LFSR 电路 以及由软件算法推导出来的
    发表于 03-28 09:34 30次下载
    <b class='flag-5'>CRC</b>校验码<b class='flag-5'>并行</b>计算的FPGA<b class='flag-5'>实现</b>

    关于STM32F4xx的硬件CRC32校验

    关于STM32F4xx的硬件CRC32校验一、概述前段时间由于项目所需,要对MCU上某些数据进行CRC32校验,MCU选用的是STM32F4系列,以前看到过STM32有
    发表于 12-03 15:51 19次下载
    <b class='flag-5'>关于</b>STM32F4xx的<b class='flag-5'>硬件</b><b class='flag-5'>CRC</b>32校验

    一种并行CRC计算的通用算法及其实现

    摘要:本文从一已提出的通用数学表达式出发,研究了一种并行循环冗余校验(CRC)计算的新算法,该算法是一种迭代算法,可以逐步更新校验序列,适用于CRC计算的各种参数选择。这一算法适合硬件
    发表于 02-21 09:45 0次下载

    N32G45x硬件CRC计算Modbus的CRC16

    以前都是使用软件CRC,浪费计算时间,有硬件CRC不用,真是可惜。本次使用硬件CRC对ModBus的CR
    的头像 发表于 10-16 15:01 1103次阅读
    N32G45x<b class='flag-5'>硬件</b><b class='flag-5'>CRC</b>计算Modbus的<b class='flag-5'>CRC</b>16