《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 业界动态 > 并行CRC-32校验码生成算法研究及其实现

并行CRC-32校验码生成算法研究及其实现

2008-03-19
作者:郭熙业, 苏绍 , 王跃科

  摘 要: 在分析串行结构CRC生成算法的基础上,提出了一种高效的8bit并行CRC-32校验码生成算法。利用该算法在特定FPGA芯片上实现了任意字节的CRC-32校验码的生成模块,该模块仅占用93个逻辑单元,最高数据吞吐量" title="数据吞吐量">数据吞吐量可达2 400Mbps。
  关键词: 并行 CRC-32  状态转移矩阵

 

  随着网络数据业务的快速增长,以太网作为局域网的发展主流经历了从10Mbps、100Mbps到1Gbps的过程,目前正向10Gbps以太网方向发展。千兆以太网数据速率达到了Gbps级,若辅以其他技术,就可以支持多媒体应用,因而以太网化应用领域日益广泛。然而,千兆以太网中物理层具有潜在的不稳定性,例如,在依赖链路和数据特性的基础上,在发送帧中加入足够的冗余信息,就能够在接收端检测出错误并安排受损帧的重发。虽然循环冗余校验CRC(Cyclic Redundancy Check)具有强大的检错能力并在以太网的数据链路层MAC部分实现中得到应用。但传统意义上串行移位结构的CRC,其数据吞吐量远远达不到千兆以太网1Gbps的要求。本文在深入分析串行结构CRC生成算法的基础上,设计并实现了一种针对8bit宽度数据输入的并行CRC-32校验码生成算法。
1 串行结构CRC-32校验码生成方法的分析
  CRC校验码的编码方法是用待发送的二进制数据t(x)乘上x r再除以生成多项式g(x)完成的,最后的余数即为CRC校验码,其中,r为生成多项式的阶数。根据上述原理,在串行结构的实现方法" title="实现方法">实现方法中采用移位寄存器构成除法电路,寄存器的数量与生成多项式g(x)的阶数一致。数据t(x)·x r以二进制位方式依次串行输入除法电路中,当数据输入完毕时,除法电路中寄存器的值即为生成的CRC校验码。
  千兆以太网协议中规定,采用CRC-32的方式对数据进行编码,其生成的多项式为:x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1。对应的串行结构CRC-32校验码生成原理如图1所示。


  当t(x)为8bit时,可将数据表示为多项式:t7x7+t6x6+t5x5+t4x4+t3x3+t2x2+t1x1+t0,多项式的系数即为待编码的二进制数据。串行结构内寄存器的初始值为‘0’,电路开始工作后,二进制数据序列(t7,t6,t5,t4,t3,t2,t1,t0,0,0,……,0)按照从左至右的次序输入除法电路(其中’0’的个数为32),当数据序列输入完毕时,除法电路中寄存器的值即为生成的CRC-32校验码[1]。该电路具有以下特点:
  (1)由于寄存器的初始值为零,因此,在二进制数据序列(t7,t6,t5,t4,t3,t2,t1,t0)输入除法电路过程中,D31的反馈值始终为0,从而保证了二进制序列在数据移位过程中不受反馈值‘异或’运算的影响。当(t7,t6,t5,t4,t3,t2,t1,t0)输入完毕时,寄存器(D0,D1,D2,D3,D4,D5,D6,D7)的值对应为:(t0,t1,t2,t3,t4,t5,t6,t7),其他寄存器的值为‘0’。
  (2)在(t7,t6,t5,t4,t3,t2,t1,t0)输入完毕后,随后输入32个‘0’,由于‘0’在‘异或’运算中不起作用,因此,输入‘0’的过程可认为是除法电路在没有输入数据的情况下进行自反馈" title="自反馈">自反馈式的移位运算。
  因为在千兆以太网中,数据传输速率达到了Gbps级,如果采用每个时钟周期计算1bit数据的串行结构,很难实现CRC校验码的生成。因此,有必要研究并行的CRC校验码编码方法。
2 8bit并行CRC-32校验码生成方法的原理
  自反馈的移位运算可以采用状态转移矩阵" title="状态转移矩阵">状态转移矩阵表示,i+1次移位后寄存器的状态Qi+1与i次移位后寄存器的状态Qi之间的关系可通过状态矩阵A表示为:Qi+1=AQi,进一步又可得到第i次的状态Qi可通过初始状态Q0表示为:
  Qi=AiQ0        (1)
  CRC-32的状态转移矩阵A如图2所示。


  结合串行结构的特点(2)及公式(1),可得出:当二进制序列(t7,t6,t5,t4,t3,t2,t1,t0,0,0,……,0)输入完毕时,寄存器的状态Q即为生成的CRC-32校验码,可表示为:
  Q=A32Q0        (2)
  由于自反馈移位运算从(t7,t6,t5,t4,t3,t2,t1,t0)输入完毕开始,因此,根据串行结构的特点(1)可知,初始状态Q0为(t0,t1,t2,t3,t4,t5,t6,t7,0,0,……,0)T,其中‘0’的数量为24。不难发现,由于Q0的后24项均为‘0’,在矩阵的×、+运算中不影响运算结果,因此,Q的计算可简化为:
  Q=BC          (3)
式中,矩阵B为矩阵A32的前8列,而C为(t0,t1,t2,t3,t4,t5,t6,t7)T
3 并行算法的实现
  公式(3)即为输入8bit数据情况下CRC-32校验码的生成公式。在采用该公式进行校验码计算时,首先由MATLAB等数学工具计算出A32(其中的加法运算为模2加),然后从计算结果中取出前8列得到B,最后再根据公式(3)计算得到Q。采用VHDL语言实现公式(3),其程序如图3所示。其中,t[7..0]为输入的8bit数据,CRC[31..0]为生成的校验码。程序中考虑了输入数据及输出数据的倒序操作。


  利用上述并行算法,辅以4B的移位寄存器,便可实现多字节的CRC-32校验码的生成。用VHDL语言对其进行描述如下:
entity CRC is
  port(
    clk  :in std_logic;
    crc_en :in std_logic;
    rst  :in std_logic;
    data_in  :in std_logic_vector(7 downto 0);
    fcs_out :out std_logic_vector(31 downto 0)
    );
end CRC;
architecture check_crc of CRC is
signal  fcs : std_logic_vector(31 downto 0);
constant ini_fcs : std_logic_vector(31 downto 0):=x
'FFFFFFFF';
signal  t : std_logic_vector(7 downto 0);             
begin
t<=fcs xor data_in;
process(crc_en,rst,clk)
variable fcs_shifted : std_logic_vector(31 downto 0);
variable crc  :   std_logic_vector(31 downto 0);
begin 
if clk'event and clk='1' then
 if crc_en = '1' then
  if rst='1' then 
   fcs <= ini_fcs;
   fcs_shifted := (others => '-');
   crc_out  :=  (others => '-');
  else
   fcs_shifted(23 downto 0):= fcs(31 downto 8);
   fcs_shifted(31 downto 24):=x'00'; 
   fcs <= fcs_shifted xor crc;   
  end if;   
  fcs_out <= (others => '-');   
 elsif crc_en = '0' then
  fcs_out  <= not fcs;
  fcs   <= (others => '-');
  fcs_shifted := (others => '-');
  crc_out     :=  (others => '-');
 end if;
end if; 
end process; 
end check_crc;
  程序中:‘clk’代表时钟信号,‘crc_en’代表使能信号,‘rst’代表复位信号,‘data_in’代表输入的任意的8bit数据,‘fcs_out’代表生成的校验码。另外,程序中‘crc’ 和 ‘t’满足图3所示的运算关系。由于这部分描述在前面已经介绍过,因此在程序中省略。
  目前,该方法已在Altera公司的StratixGX40系列FPGA芯片上实现,仅占用93个逻辑单元,便可实现任意字节的CRC-32校验码的计算,最高数据吞吐量达到2 400Mbps,完全能够满足千兆以太网的数据传输速度要求。图4为输入特定10个字节时校验码生成模块的仿真结果,生成的校验码与低速率情况下采用串行结构生成的校验码完全一致。


  本文以千兆以太网CRC-32校验码的生成算法作为研究对象,深入分析了串行结构的实现方法,并根据数据‘0’在异或运算中不影响运算结果的特性,总结出串行结构实现方法的两个特点,并在此基础上提出一种高效的8bit并行CRC-32校验码生成算法。该算法与传统的利用状态转移矩阵实现并行运算的方法相比[3],其状态转移方程更加简单,校验码可由输入的8bit数据经过‘异或’运算直接得到,从而更加便于硬件实现。
参考文献
[1]  王新梅,肖国镇.纠错码—原理与方法[M].西安:电子科技大学出版社,1991.
[2]  CUNNINGHAM D G, PH.D, LANE W G, et al. 千兆以太网[M].北京:清华大学出版社,2000.
[3]  NG S L, DEWAR B. Parallel realization of ATM cell header CRC[J]. Communications, 1996,(19):257-263.
[4]  朱荣华.一种CRC并行计算原理及实现方法[J].电子学报,1999,27(4):143-145.

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。