本帖最后由 David_ming 于 2011-3-2 17:06 编辑
:L 修正下:
CRC的常用多项式如下:
CRC-4 x4+x+1
CRC-8 x8+x5+x4+1
CRC-8 x8+x2+x1+1
CRC-8 x8+x6+x4+x3+x2+x1
CRC-12 x12+x11+x3+x+1
CRC-16 x16+x15+x2+1
CRC16-CCITT x16+x12+x5+1
首先,我们要发送一串数字,比如说是 s(x)=101 (3个bit,再多了不好笔算),首先,我们先确定我们要采用的CRC算法是哪种,这里举例用 CRC8(注:也可以采用CRC4,但是抗干扰能力是不同的)
假设我们用 CRC8=x8+x5+x4+1 作为多项式
那么对应的硬件如图crc.jpg
时序为:
1:输入data的第一个bit与最左边的T触发器异或,结果由上面的异或门输出
2:1步的异或门输出在与多项式中的异或门进行异或,结果同时给到最右边异或门
的输入,注意,1步与2步是并行的。
3:clock线来一个时钟该时钟使得T触发器锁住了输入信号,这样一直下去,直到
输入数据流结束。
4:当最后一个bit与最左边的触发器输出异或完成后,此时在来一个clock,将整
个数据再左移一个bit。
5:此时,读总线动作,读出数据,图中右边是LSB,左边是MSB。
注意,1.初始状态的 T 触发器全部为 0.
2.多项式中的X8,X5,X4意思是这几位的值是由它 相邻 LSB 与
dataIN异或门输出来决定的。X5 代表第5位(相对最低位bit0)
下面是数据流“101”的运算过程:
假设发送低位先,那么101最低位是 1 此时它与输入的异或门相异或(左上角标出了dataIN,异或门的另一端是0),结果输出 1,用这个结果与多项式中的 X5的低字节邻位(即X4)相异或,结果输出到 T 触发器的输入端(注意此时还没有时钟过来),于此同时,这个输出的1与X4的低字节邻位相异或(即X3)结果输出到 T的输入端,再于此同时,这个输出的1送到最低LSB的触发器输入端。此时过来一个时钟,每个T触发器的值组成了:
00110001B
继续上面的步骤,数据变成了:
01100010B
在继续,变成了:
11110101B
此时整个位流全部完成运算,读数据总线动作,那么我们把上面这个结果放到 101 后边一起传送出去就OK了,要注意顺序,即:1010 1111 101 |