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

数据校验的基础运算原理是模2运算,也就是异或运算。
简单讲述一下crc的原理, crc校准首先要确定一个多项式m(x), 例如
根据这个多项式的最高系数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中计算,最后得到的输出数据为:
然后,设输入数据为0000, 多项式的初始数值为00001, 00010, 00100, 01000, 10000;带入lfsr中计算,得到的输出数据为:
根据上述的两表,可得out[0]跟输入数据0,1,2 bit以及多项式的1,2,3bit有关。因此做异或运算;然后依次类推,得到了所有的映射关系。然后就可以得到上述verilog中lfsr的运算关系了。
当然,如果你的crc的多项式初始数值默认为0,即与之前的crc校验冗余码无关,那么其实可以不用计算多项式数值的情况,只看第一个表。现在拿第一个表的对应关系,计算下0010的冗余码。就是11111.

看看那些被“踢出局”的欧美锂电产业
使用无线MCU的智能插头的应用
机器视觉技术如何实现快速准确的定位
全石墨烯光通信链路为数据通信提供强大功能
考勤门禁系统分类构成及近几年行业产值规模情况分析
关于CRC硬件并行化运算的实现方法的探讨
车载音响12v接线图解
美国财政部长:支持美联储发行数字美元
应用于酒店的智能魔镜,将提供舒适的出行体验
哪些外界因素的干扰会影响到传感器信号的传输
智慧能源系统解决方案提供商正泰电器发布2021年报
人工智能发展的严峻挑战要以务实的态度对待近期的技术发展
PROFINET有哪些特性?PROFINET的工作机制是怎样的?
谷歌的操作系统Chrome OS每年都在变得越来越流行
磁翻板液位计在磁干扰和腐蚀性环境中的应用
物尽其用,让“智慧视频”真正“智慧”起来
边缘计算起步阶段_智能快递柜的边缘设备如何发力
电源分配线的电感
基于UPS和EMC的电磁兼容检测的方案解析
4G远程温湿度传感器在仓库中的应用—蜂窝物联