赞
踩
本人在做项目的时候有用到以太网的视频传输,其中CRC校验是难点且核心的一环,故写下这篇文章以做总结。
循环冗余校验简称crc,是数据通信领域中最常见的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。在通信领域中数据的传输可能会出现丢失、错位等错误,如果说接收端没有任何校验那么就不知道接收到的数是否正确,为了保证数据的正确性我们可以使用CRC进行判断数据是否正确。
在我们收发数据的时候需要进行判断,那么我们需要一个判断的手段,所以我们就需要在发送端和接收端都需要一个编码后的信号,也就是码字。码字包含数据位和校验位,这个校验位就是我们所需要的。校验位所得到的方式就是一个一个不断模二取余的过程。最后由发送发送数据位和校验位,另一端去解析校验位,查看所收到的数据是否是我们发送端所发出的数据。
上文中有说到CRC校验码所编码解码的过程其实是一个不断模二取余的过程,那么CRC还需要满足以下的条件:
1.生成的多项式最高位和最低位必须为1
2.当被传信息中有错误时,被生成多项式模2后的余数不为0
3.不同位发生错误时,余数应该不同
4.对余数继续做模2运算应使余数循环
通常我们c语言算模2运算会很好算,但是用verilog去写就很麻烦且蛋疼,不过我们知道模2运算在逻辑运算中就是异或运算,所以我们这里就可以用异或运算去代替模2运算。
我们要用移位寄存器+异或运算的形式去实现CRC电路。
在此之前,我们先做个铺垫,我们先了解一下LFSR(线性反馈移位寄存器),该电路就是由n级触发器和一些异或门来组成,在每个时钟周期内,新的输入值会被反馈到LFSR内部各个触发器的输入端,输人值中的一部分来源于LFSR的输出端,另一部分由LFSR各输出端进行异或运算得到。该电路所具有的特点契合我们之前做推导的时候的条件,LFSR电路一共有两类常用的电路,斐波那契LFSR和伽罗瓦LFSR,斐波那契LFSR也叫做多到一型LFSR,即多个触发器的输出通过异或逻辑来驱动一个触发器的输入,伽罗瓦LFSR叫做一到多型LFSR,即一个触发器的输出通过异或逻辑启动多个除法器的输入。
下图为斐波那契LFSR:
下图为伽罗瓦LFSR
伽瓦罗LFSR有更快的速度,斐波那契为了满足建立保持时间的要求,其频率更小所以速度会慢一点。我们这里选用伽瓦罗LFSR去写CRC。
在伽瓦罗LFSR中反馈多项式的相关性(即多项式的系数,非零即一)为一的时候要有一个异或门。例如对于反馈多项式f(x)=x3+x2+1而言,相关性为1_101,
输出序列的顺序为:111-110-100-001-010-101-011-111
位数变多则同理。
以上介绍了校验码的生成,在解校验的时候需要将校验位和需要校验的信息位一起移入CRC的电路。根据IEEE的要求,校验和解校验的电路默认初始为全1。
本文介绍了crc的工作原理及方式,代码按照思路去使用异或运算即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。