赞
踩
在进行以太网传输项目中,需要使用到CRC循环校验,虽然有一些辅助工具能够帮助我们自动生成并行的crc硬件电路,但是它到底是如何实现的呢?带着这个疑问我找到了一个大佬的文章,其详细解释了如何实现并行CRC。接下来我将简单介绍一下实现步骤:
1.以CRC5为例:
(1)输入数据宽度为:4即data_in[3:0];
(2)CRC5;
(3)生成多项式为:
2.根据多项式绘制串行电路:
3.实现串行CRC电路
//上述电路实现的功能,其中lfsr_q为每个触发器的当前态,lfsr_c为触发器下一个状态;
always @(*) begin
lfsr_c[0] = lfsr_q[4] ^ data_in[0];
lfsr_c[1] = lfsr_q[0];
lfsr_c[2] = lfsr_q[1] ^ lfsr_q[4] ^ data_in[0];
lfsr_c[3] = lfsr_q[2];
lfsr_c[4] = lfsr_q[3];
end
4.以当前状态为零即lfsr_q=5‘d0,输入data_in分别为(0x01,0x02,0x04,0x08)依次串行输入;
可以得到
同样输入data_in为0x02,0x04,0x08,也可以分别得到一组lfsr_c的值。所以可以得到一个矩阵:
Mout就是lfsr_c,Nin就是data_in;
同理,以输入data_in全为0,初始状态分别为0x01,0x02,0x04,0x08,0x10;
得到另一个矩阵:(其中Min就是lfsr_q)
5.根据上述两个矩阵我们就可以得到并行电路:
由上我们可知Mout就是lfsr_c,Nin就是data_in;
5.通过CRC生成器生成的代码和我们的进行比较
可以看到完全一样:
总结:其他数据位宽或者生成多项式的实现方法是类似的。只不过要注意,初始状态为零时,输入数据值是one-hot编码输入,输入为零时,初始状态值是one-hot编码。
最后附上大佬论文地址:http://outputlogic.com/?p=158
CRC自动生成器网址:http://outputlogic.com/?page_id=321
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。