《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 業(yè)界動態(tài) > 并行CRC-32校驗(yàn)碼生成算法研究及其實(shí)現(xiàn)

并行CRC-32校驗(yàn)碼生成算法研究及其實(shí)現(xiàn)

2008-03-19
作者:郭熙業(yè), 蘇紹 , 王躍科

  摘 要: 在分析串行結(jié)構(gòu)CRC生成算法的基礎(chǔ)上,提出了一種高效的8bit并行CRC-32校驗(yàn)碼生成算法。利用該算法在特定FPGA芯片上實(shí)現(xiàn)了任意字節(jié)的CRC-32校驗(yàn)碼的生成模塊,該模塊僅占用93個(gè)邏輯單元,最高數(shù)據(jù)吞吐量" title="數(shù)據(jù)吞吐量">數(shù)據(jù)吞吐量可達(dá)2 400Mbps。
  關(guān)鍵詞: 并行 CRC-32? 狀態(tài)轉(zhuǎn)移矩陣

?

  隨著網(wǎng)絡(luò)數(shù)據(jù)業(yè)務(wù)的快速增長,以太網(wǎng)作為局域網(wǎng)的發(fā)展主流經(jīng)歷了從10Mbps、100Mbps到1Gbps的過程,目前正向10Gbps以太網(wǎng)方向發(fā)展。千兆以太網(wǎng)數(shù)據(jù)速率達(dá)到了Gbps級,若輔以其他技術(shù),就可以支持多媒體應(yīng)用,因而以太網(wǎng)化應(yīng)用領(lǐng)域日益廣泛。然而,千兆以太網(wǎng)中物理層具有潛在的不穩(wěn)定性,例如,在依賴鏈路和數(shù)據(jù)特性的基礎(chǔ)上,在發(fā)送幀中加入足夠的冗余信息,就能夠在接收端檢測出錯(cuò)誤并安排受損幀的重發(fā)。雖然循環(huán)冗余校驗(yàn)CRC(Cyclic Redundancy Check)具有強(qiáng)大的檢錯(cuò)能力并在以太網(wǎng)的數(shù)據(jù)鏈路層MAC部分實(shí)現(xiàn)中得到應(yīng)用。但傳統(tǒng)意義上串行移位結(jié)構(gòu)的CRC,其數(shù)據(jù)吞吐量遠(yuǎn)遠(yuǎn)達(dá)不到千兆以太網(wǎng)1Gbps的要求。本文在深入分析串行結(jié)構(gòu)CRC生成算法的基礎(chǔ)上,設(shè)計(jì)并實(shí)現(xiàn)了一種針對8bit寬度數(shù)據(jù)輸入的并行CRC-32校驗(yàn)碼生成算法。
1 串行結(jié)構(gòu)CRC-32校驗(yàn)碼生成方法的分析
  CRC校驗(yàn)碼的編碼方法是用待發(fā)送的二進(jìn)制數(shù)據(jù)t(x)乘上x r再除以生成多項(xiàng)式g(x)完成的,最后的余數(shù)即為CRC校驗(yàn)碼,其中,r為生成多項(xiàng)式的階數(shù)。根據(jù)上述原理,在串行結(jié)構(gòu)的實(shí)現(xiàn)方法" title="實(shí)現(xiàn)方法">實(shí)現(xiàn)方法中采用移位寄存器構(gòu)成除法電路,寄存器的數(shù)量與生成多項(xiàng)式g(x)的階數(shù)一致。數(shù)據(jù)t(x)·x r以二進(jìn)制位方式依次串行輸入除法電路中,當(dāng)數(shù)據(jù)輸入完畢時(shí),除法電路中寄存器的值即為生成的CRC校驗(yàn)碼。
  千兆以太網(wǎng)協(xié)議中規(guī)定,采用CRC-32的方式對數(shù)據(jù)進(jìn)行編碼,其生成的多項(xiàng)式為:x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1。對應(yīng)的串行結(jié)構(gòu)CRC-32校驗(yàn)碼生成原理如圖1所示。


  當(dāng)t(x)為8bit時(shí),可將數(shù)據(jù)表示為多項(xiàng)式:t7x7+t6x6+t5x5+t4x4+t3x3+t2x2+t1x1+t0,多項(xiàng)式的系數(shù)即為待編碼的二進(jìn)制數(shù)據(jù)。串行結(jié)構(gòu)內(nèi)寄存器的初始值為‘0’,電路開始工作后,二進(jìn)制數(shù)據(jù)序列(t7,t6,t5,t4,t3,t2,t1,t0,0,0,……,0)按照從左至右的次序輸入除法電路(其中’0’的個(gè)數(shù)為32),當(dāng)數(shù)據(jù)序列輸入完畢時(shí),除法電路中寄存器的值即為生成的CRC-32校驗(yàn)碼[1]。該電路具有以下特點(diǎn):
  (1)由于寄存器的初始值為零,因此,在二進(jìn)制數(shù)據(jù)序列(t7,t6,t5,t4,t3,t2,t1,t0)輸入除法電路過程中,D31的反饋值始終為0,從而保證了二進(jìn)制序列在數(shù)據(jù)移位過程中不受反饋值‘異或’運(yùn)算的影響。當(dāng)(t7,t6,t5,t4,t3,t2,t1,t0)輸入完畢時(shí),寄存器(D0,D1,D2,D3,D4,D5,D6,D7)的值對應(yīng)為:(t0,t1,t2,t3,t4,t5,t6,t7),其他寄存器的值為‘0’。
  (2)在(t7,t6,t5,t4,t3,t2,t1,t0)輸入完畢后,隨后輸入32個(gè)‘0’,由于‘0’在‘異或’運(yùn)算中不起作用,因此,輸入‘0’的過程可認(rèn)為是除法電路在沒有輸入數(shù)據(jù)的情況下進(jìn)行自反饋" title="自反饋">自反饋式的移位運(yùn)算。
  因?yàn)樵谇д滓蕴W(wǎng)中,數(shù)據(jù)傳輸速率達(dá)到了Gbps級,如果采用每個(gè)時(shí)鐘周期計(jì)算1bit數(shù)據(jù)的串行結(jié)構(gòu),很難實(shí)現(xiàn)CRC校驗(yàn)碼的生成。因此,有必要研究并行的CRC校驗(yàn)碼編碼方法。
2 8bit并行CRC-32校驗(yàn)碼生成方法的原理
  自反饋的移位運(yùn)算可以采用狀態(tài)轉(zhuǎn)移矩陣" title="狀態(tài)轉(zhuǎn)移矩陣">狀態(tài)轉(zhuǎn)移矩陣表示,i+1次移位后寄存器的狀態(tài)Qi+1與i次移位后寄存器的狀態(tài)Qi之間的關(guān)系可通過狀態(tài)矩陣A表示為:Qi+1=AQi,進(jìn)一步又可得到第i次的狀態(tài)Qi可通過初始狀態(tài)Q0表示為:
  Qi=AiQ0        (1)
  CRC-32的狀態(tài)轉(zhuǎn)移矩陣A如圖2所示。


  結(jié)合串行結(jié)構(gòu)的特點(diǎn)(2)及公式(1),可得出:當(dāng)二進(jìn)制序列(t7,t6,t5,t4,t3,t2,t1,t0,0,0,……,0)輸入完畢時(shí),寄存器的狀態(tài)Q即為生成的CRC-32校驗(yàn)碼,可表示為:
  Q=A32Q0        (2)
  由于自反饋移位運(yùn)算從(t7,t6,t5,t4,t3,t2,t1,t0)輸入完畢開始,因此,根據(jù)串行結(jié)構(gòu)的特點(diǎn)(1)可知,初始狀態(tài)Q0為(t0,t1,t2,t3,t4,t5,t6,t7,0,0,……,0)T,其中‘0’的數(shù)量為24。不難發(fā)現(xiàn),由于Q0的后24項(xiàng)均為‘0’,在矩陣的×、+運(yùn)算中不影響運(yùn)算結(jié)果,因此,Q的計(jì)算可簡化為:
  Q=BC          (3)
式中,矩陣B為矩陣A32的前8列,而C為(t0,t1,t2,t3,t4,t5,t6,t7)T
3 并行算法的實(shí)現(xiàn)
  公式(3)即為輸入8bit數(shù)據(jù)情況下CRC-32校驗(yàn)碼的生成公式。在采用該公式進(jìn)行校驗(yàn)碼計(jì)算時(shí),首先由MATLAB等數(shù)學(xué)工具計(jì)算出A32(其中的加法運(yùn)算為模2加),然后從計(jì)算結(jié)果中取出前8列得到B,最后再根據(jù)公式(3)計(jì)算得到Q。采用VHDL語言實(shí)現(xiàn)公式(3),其程序如圖3所示。其中,t[7..0]為輸入的8bit數(shù)據(jù),CRC[31..0]為生成的校驗(yàn)碼。程序中考慮了輸入數(shù)據(jù)及輸出數(shù)據(jù)的倒序操作。


  利用上述并行算法,輔以4B的移位寄存器,便可實(shí)現(xiàn)多字節(jié)的CRC-32校驗(yàn)碼的生成。用VHDL語言對其進(jìn)行描述如下:
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’代表時(shí)鐘信號,‘crc_en’代表使能信號,‘rst’代表復(fù)位信號,‘data_in’代表輸入的任意的8bit數(shù)據(jù),‘fcs_out’代表生成的校驗(yàn)碼。另外,程序中‘crc’ 和 ‘t’滿足圖3所示的運(yùn)算關(guān)系。由于這部分描述在前面已經(jīng)介紹過,因此在程序中省略。
  目前,該方法已在Altera公司的StratixGX40系列FPGA芯片上實(shí)現(xiàn),僅占用93個(gè)邏輯單元,便可實(shí)現(xiàn)任意字節(jié)的CRC-32校驗(yàn)碼的計(jì)算,最高數(shù)據(jù)吞吐量達(dá)到2 400Mbps,完全能夠滿足千兆以太網(wǎng)的數(shù)據(jù)傳輸速度要求。圖4為輸入特定10個(gè)字節(jié)時(shí)校驗(yàn)碼生成模塊的仿真結(jié)果,生成的校驗(yàn)碼與低速率情況下采用串行結(jié)構(gòu)生成的校驗(yàn)碼完全一致。


  本文以千兆以太網(wǎng)CRC-32校驗(yàn)碼的生成算法作為研究對象,深入分析了串行結(jié)構(gòu)的實(shí)現(xiàn)方法,并根據(jù)數(shù)據(jù)‘0’在異或運(yùn)算中不影響運(yùn)算結(jié)果的特性,總結(jié)出串行結(jié)構(gòu)實(shí)現(xiàn)方法的兩個(gè)特點(diǎn),并在此基礎(chǔ)上提出一種高效的8bit并行CRC-32校驗(yàn)碼生成算法。該算法與傳統(tǒng)的利用狀態(tài)轉(zhuǎn)移矩陣實(shí)現(xiàn)并行運(yùn)算的方法相比[3],其狀態(tài)轉(zhuǎn)移方程更加簡單,校驗(yàn)碼可由輸入的8bit數(shù)據(jù)經(jīng)過‘異或’運(yùn)算直接得到,從而更加便于硬件實(shí)現(xiàn)。
參考文獻(xiàn)
[1] ?王新梅,肖國鎮(zhèn).糾錯(cuò)碼—原理與方法[M].西安:電子科技大學(xué)出版社,1991.
[2] ?CUNNINGHAM D G, PH.D, LANE W G, et al. 千兆以太網(wǎng)[M].北京:清華大學(xué)出版社,2000.
[3] ?NG S L, DEWAR B. Parallel realization of ATM cell header CRC[J]. Communications, 1996,(19):257-263.
[4] ?朱榮華.一種CRC并行計(jì)算原理及實(shí)現(xiàn)方法[J].電子學(xué)報(bào),1999,27(4):143-145.

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。