CRC16校验码移位算法及VHDL实现
2017-06-05王玉玲王燕锋
王玉玲++王燕锋
摘 要 在数据输出过程中,为保证数据的可靠性,通常会在数据的末尾加上校验信息。CRC校验技术编码和解码过程简单,纠错能力强,被广泛应用于通信领域。本文介绍一种移位产生CRC校验码的方法,并给出了其VHDL实现及仿真分析。
【关键词】CRC 校验移位 CRC16 VHDL
在数据传输过程中,由于信道干扰,往往使得发送和接收的数据不一致。为了降低误码率,保证传输数据的可靠性,通常会改进信道的传输质量或在传输的数据中加入校验信息。在各种校验方法中,循环冗余校验CRC(CyclicRedundancy Check)是一种最常用的方法。CRC校验技术是一种十分有效的数据传输错误检测技术,由于其编码和解码过程简单,检错和纠错能力强,广泛应用于通信领域用于实现差错控制。串行通信普遍应用于工业通信控制领域,如何提高数据的传输可靠性尤为重要,现有的串口在数据传输过程中加入CRC校验可提高数据传输的可靠性。普通串行口不自带CRC校验功能,大多数应用中都是通过软件编程计算CRC码后再附加在数据末尾传输的,由于软件执行耗费时间长,影响数据的传输速度。现场可编程门阵列FPGA (Field-Programmable Gate Array)在数字系统设计中已被广泛使用。用硬件描述语言(VHDL)实现CRC校验码的计算,然后下载到FPGA芯片中,硬件实现CRC校验,与软件实现相比,对数据的传输速度影响较小。本文介绍一种CRC16校验码串行产生的方法,并给出了其VHDL实现及仿真分析。
1 CRC校验原理
在发送方要发送的K位数据码后,以一定的规则产生一个r位用于校验的监督码,附加在原数据后面,构成的信息码为n=k+r位,因此,这种编码又叫(n,k)码。接收方根据通信双方约定的规则进行校验,确定数据是否出错。这个规则即“生成多项式”。K位数据码表示为M(x),选择合适的CRC生成多项式G(x),G(x)的最高次幂为r。把M(x)左移r位,即M(x)*xr对G(x)做不借位除法(即异或运算),所得余数为CRC校验码,即:
其中R(x)为CRC校验码。发送方以上述原理生成校验码附加在数据末尾发送出去,接收方接收到的数据也对同样的G(x)做除法,如果余数为0,则认为数据传送无误,否则按出错处理。
2 CRC16校驗实现原理图
常用的生成多项式有多种,如CRC4、CRC8、CRC16和CRC32等。计算CRC校验码可以用串行和并行的方法实现。串行实现电路结构简单,但比较耗时,位数越多越费时。并行实现电路结构复杂,但节省时间。本文介绍一种采用CRC16生成多项式串行移位产生校验码的计算过程。生成多项式为G(x)=g16x16+g15x15+……+g1x+g0,在实际使用中,并不需要考虑最高位,它总是被舍弃的,因此只要考虑余下16个数据位。在串行通信中实现移位计算CRC16校验码的原理如图1所示。
图1中为乘法,⊕为异或。
图1所示为CRC16校验原理图由D触发器、与门和异或门构成。
实现原理:发送一个字节数据,末尾加入16位校验码。CRC16寄存器初始化为0,串行移入数据,CRC16寄存器左移1位,检查移除位,如果为1,CRC16寄存器与生成多项式异或,结果存入CRC16寄存器,如果不为0,则仅仅移位,不做异或。循环进行24次后,C15……C0为所求校验码。用Cik表示上一次移位后CRC的值,Cik+1表示本次移位CRC的值,其关系如式2所示。式2中i=1,2,3,4,……,15。
用CRC16产生校验码由于G(x)并不是所有位都为1,因此其具体实现要简单得多。G(x)=x16+x15+x2+1是CRC16生成多项式中最常用形式,舍弃掉最高位,编码为1000 0000 0000 0011,由式2可知,Cik和Cik+1的关系如式3所示。式3中i=2,15,j=1,3,4……14。
用该生成多项式产生校验码,由于只有第15、2和0位为1,因此每次移位产生的CRC值中只要C15、C2及C0位和移出的位和对应的g值有关,CRC的其它位值都等于上次移位的CRC值中对应低一位的值。其产生校验码的原理图只要在图1中保留D寄存器及C15、C2和C0对应的异或门,其它位对应的乘法和异或可以全部省去,大大简化了电路。
3 CRC校验在FPGA中的实现和仿真
在FPGA中进行系统设计,可采用硬件描述语言(HDL)设计也可以采用原理图的设计方法。本文采用两者结合形式进行,采用自下而上的设计方法,先模块化设计产生1位数据的CRC16校验码,然后顶层文件调用以上的模块产生8位数据的CRC16校验码。顶层文件的实体定义为:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY work;
ENTITY CRC16 IS
port(CLK : IN STD_LOGIC;
d : IN STD_LOGIC_VECTOR(7 downto0);
c:OUT STD_LOGIC_VECTOR(15 downto 0));END CRC16;
设计采用的编程环境为QUARTUS II。由实体的定义可知,输入信号有8位数据(D) 和时钟信号(CLK),输出信号为16位CRC校验码。结构体的实现流程图如图2所示。
在编程基础上,建立仿真文件,对以上VHDL实现CRC16校验码的程序进行仿真测试,结果如图3所示,与手工计算的结构完全一致。如待传送数据位00001110,采用G(x)=x16+x15+x2+1产生校验码,校验码码为1000000000100111,与结果完全一致。
4 结束语
由以上VHDL设计的CRC校验码产生模块,仿真分析后,在实验室环境下,通过引脚配置,把程序下载到FPGA上进行测试,结果与预期的相一致,因此证明本设计思路及方法是可用的。但要在实际串口通信中使用,还需要进一步的分析和测试。
参考文献
[1]梁海华,盘丽娜等.CRC查询表及其并行矩阵生成方法[J].计算机科学,2012,39(6A):154-156.
[2]王良俊,马琪.USB3.0中的CRC校验原理与实现[J].现代电子技术:2011,34(18):170-171.
[3]任勇峰,庄新敏.VHDL与硬件实现速成[M].北京:国防工业出版社,2005.
[4]王月琴,杨恒新.CRC码串并结合算法的研究与实现[J].计算机技术与发展,2014,24(06):103-105.
[5]赵鸿图,李卫彬等.CRC编解码算法及在通信规约DNP3.0中的应用[J].河南理工大学学报(自然科学版),2009.28(05):596-598.
作者简介
王玉玲(1979-),女,江西省景德镇市人.工学硕士学位。毕业于东华理工大学。现为湖州师范学院讲师。研究方向为嵌入式系统、集成电路设计。
作者单位
湖州师范学院 浙江省湖州市 313000