摘要:在介绍CRC校验原理和传统CRC32串行比特算法的基础上,由串行比特型算法推导出一种CRC32并行算法、并结合SATAⅡ协议的要求,完成了SATAⅡ主控制器设计中CRC生成与校验模块的设计。最后通过在ISE平台上编写Verilog硬件描述语言,对SATA协议中帧结构数据进行仿真,验证该CRC32并行算法能够满足SATA接口实时处理的要求。
关键词:CRC32;并行算法;SATA;Verilog
随着通信和存储技术的发展,数据传输速率在急剧提高。然而由于通道传输特性不理想及可能受到干扰或噪声的影响,数据传输过程中难免会发生错误。如何保证可靠性是正确设计一个通信系统或数据存储系统的关键问题所在。
信道编码是提高可靠性的必要手段,实现检错功能的差错控制方法很多,包括奇偶校验、重复码校验、校验和检测、行列冗余码校验、恒比码校验、CRC校验等。其中CRC循环冗余校验是一种高效率的差错控制方案,其特点是编码和解码的方法简单、检错纠错能力强,因而应用于许多领域尤其是串行通信中以实现差错控制。
CRC循环校验算法占用的系统资源少,其实现方法分为软件实现和硬件实现。文中在研究CRC32算法的基础上,结合SATAⅡ协议的具体要求,实现了基于FPCA的CRC32并行算法。
1 CRC校验原理
CRC校验算法是利用线性编码理论,发送方根据一定的规则,生成要传送的n位信息码的r位校验码(CRC码),并将校验码附在信息码后面,最后发送(n+r)位二进制系列。而接收方利用信息码和校验码之间所遵循的同样规则对接受到的二进制系列进行校验,以判断传送中是否出错。为了便于描述,n位信息码用多项式k(x)表示:
由于求CRC校验码采用模2加减运算法则,即不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法在逻辑上是等价的。在模2多项式代数运算中定义的规则有:
式中R(x)即为要求的CRC校验码,xrk(x)+R(x)为发送端向接收端所发送的加入了CRC校验码的信息码,由式(6)可知xrk(x)+R(x)能够被生成多项式G(x)所整除。故接收端对接受到的信息以同样的生成多项式G(x)生成其CRC校验码,如果为0,则表示数据传送过程中未出错,否则出错,应做出相应的处理。
2 CRC32算法介绍
CRC32规范中其生成多项式G(x)如下:
常用的CRC校验码生成算法包括串行比特型算法、查表型算法和并行算法。串行比特型算法主要由一个32比特移位寄存器和异或单元组成。每输入一位串行数据,都会与移位寄存器中相应的位进行异或,异或结果保存在相应的位中,并循环移位一位,直到32位串行数据输入完毕,再进行32次循环移位将每一位寄存器中的数据依次输出,输出的32位数据即为CRC32校验值。其硬件实现框图如图1所示。
串行比特型算法可以很容易通过带反馈的移位寄存器的硬件实现,其吞吐率可以达到200 Mbps,但是远远不能达到高速通信系统的要求。
对于查表法生成CRC校验码,要预先汁算好所要的有效信息位,并存放信息位表中,然后按信息位的顺序计算好所有校验位,并存放于表中,待要使用时通过查表输出对于的CRC校验值。但这种方法需要较大的存储空间存储长度较大的CRC余数表,并且随着并行位数的增加,余数表的长度按指数增加,对于CRC32规范也不具有现实性。
因此,SATA协议中需采用并行CRC32算法以达到3 Gbps的吞吐率。
3 CRC32并行算法推导
CRC32并行算法可由串行比特型算法推导而出。
令需进行校验的32位数据以Q0表示,32位移位寄存器初始值用M0表示即:
Q0=[D0D1D2D3…D31]T (8)
M0=[C0C1C2C3…C31]T (9)
自反馈的移位运算可以采用状态转移矩阵表示,i+1次移位后寄存器的状态Qi+1与i次移位后寄存器的状态Qi之间的关系可通过状态矩阵A表示为:Qi+1=AQi,进一步又可得到第i次的状态Qi可通过初始状态Q0表示为:
式中状态转移矩阵A可由式(7)和CRC32串行实现框图推导得到。首先32位数据串行输入,与移位寄存器相关位中的初始值进行模2加减运算,32次移位后数据输入完毕,即:
然后再进行32次移位,移位寄存器中的内容即为所求的CRC校验值,则:
由式(13)可知:CRC校验值只与CRC校验初始值M0和需校验数据Q0有关,其中A64和A32可以由MATLAB计算得出。通过计算,可以得出CRC校验最高位为:
4 SATA协议中CRC32算法实现
SATA总线主要由应用层、传输层、链路层和物理层组成,其中传输层主要用于传输数据命令,链路层则是对数据进行编码和解码以保证数据在链路中正确传输。SATA总线链路中的信息包含两种结构:原语(Primitive)和帧(Frame),两者都以双字为最小的单位,其结构如图2所示。
帧结构由多个双字组成,包括帧头(SOF)、帧数据、帧尾(EOF)和用于控制码流的控制原语HOLD原语和HOLDA原语。SATA协议中CRC校验模块需自动识别出数据流中的原语,并不计算这些原语的CRC值。在发送信息时,需要由帧数据生成CRC码,即所有非原语数据都要进行CRC编码,并且将生成的CRC值插入到帧尾(EOF)之前进行传输。在接受到数据时,需要对帧数据进行CRC校验,从而判断数据在链路中传输是否出错。在SATA协议中规定CRC校验初始值0x52325032,并且在帧头和帧尾中的数据不能超过2 046个双字。
SATA协议中CRC生成校验模块采用有限状态机来识别传输数据流中的原语,从而完成CRC值的生成与校验。其状态机结构图如图3所示。
其中状态STATE0检测帧头并装入STATE1状态;在STATE1中,当输入数据为帧尾时,则转入STATE3状态,否则转入STATE2状态,在STATE1状态下输出帧头,并设置CRC初始值为0x52325032h;在STATE2中,当输入为帧尾时,则转入STATE3状态,否则转入STATE2状态,对非原语数据进行CRC值生成,并保存到寄存器中,输出为数据或保持原语;在STATE3中输出最终的CRC值,并转入STATE4状态;在STATE4中输出帧尾,并转入STATTE0状态等待下一次数据的输入。
输入一帧数据,并由式(14)进行计算,得出输入数据对应的CRC计算值如表1所示。
其对应的系统仿真结果如图4所示。
仿真结果显示,CRC数据校验与表1中的理论值一致,CRC生成模块能够自动识别数据流中的原语和数据,并能有数据生成正确的CRC校验值。其中每双字数据生成CRC值仅需一个时钟周期,系统输出延时仅为一个时钟周期,相对于串行CRC生成算法,CRC32并行算法更能满足SATA协议对时钟频率的要求。
5 结束语
文中介绍了CRC校验原理和常用CRC32实现算法,并根据比特型算法推导出一种CRC32并行算法的实现方案,该方案实现简单,实现的并行算法相对于串行算法具有速度快,运算简单,并且易于硬件实现等优点。本文还将将CRC32并行算法与SATA协议相结合,实现了满足SATA协议规范的CRC生成和校验模块,并成功应用于SATAⅡ主控制器的设计中。