摘 要: 在分析串行結(jié)構(gòu)CRC生成算法的基礎上,提出了一種高效的8bit并行CRC-32校驗碼生成算法。利用該算法在特定FPGA芯片上實現(xiàn)了任意字節(jié)的CRC-32校驗碼的生成模塊,該模塊僅占用93個邏輯單元,最高數(shù)據(jù)吞吐量" title="數(shù)據(jù)吞吐量">數(shù)據(jù)吞吐量可達2 400Mbps。
關鍵詞: 并行 CRC-32? 狀態(tài)轉(zhuǎn)移矩陣
?
隨著網(wǎng)絡數(shù)據(jù)業(yè)務的快速增長,以太網(wǎng)作為局域網(wǎng)的發(fā)展主流經(jīng)歷了從10Mbps、100Mbps到1Gbps的過程,目前正向10Gbps以太網(wǎng)方向發(fā)展。千兆以太網(wǎng)數(shù)據(jù)速率達到了Gbps級,若輔以其他技術,就可以支持多媒體應用,因而以太網(wǎng)化應用領域日益廣泛。然而,千兆以太網(wǎng)中物理層具有潛在的不穩(wěn)定性,例如,在依賴鏈路和數(shù)據(jù)特性的基礎上,在發(fā)送幀中加入足夠的冗余信息,就能夠在接收端檢測出錯誤并安排受損幀的重發(fā)。雖然循環(huán)冗余校驗CRC(Cyclic Redundancy Check)具有強大的檢錯能力并在以太網(wǎng)的數(shù)據(jù)鏈路層MAC部分實現(xiàn)中得到應用。但傳統(tǒng)意義上串行移位結(jié)構(gòu)的CRC,其數(shù)據(jù)吞吐量遠遠達不到千兆以太網(wǎng)1Gbps的要求。本文在深入分析串行結(jié)構(gòu)CRC生成算法的基礎上,設計并實現(xiàn)了一種針對8bit寬度數(shù)據(jù)輸入的并行CRC-32校驗碼生成算法。
1 串行結(jié)構(gòu)CRC-32校驗碼生成方法的分析
CRC校驗碼的編碼方法是用待發(fā)送的二進制數(shù)據(jù)t(x)乘上x r再除以生成多項式g(x)完成的,最后的余數(shù)即為CRC校驗碼,其中,r為生成多項式的階數(shù)。根據(jù)上述原理,在串行結(jié)構(gòu)的實現(xiàn)方法" title="實現(xiàn)方法">實現(xiàn)方法中采用移位寄存器構(gòu)成除法電路,寄存器的數(shù)量與生成多項式g(x)的階數(shù)一致。數(shù)據(jù)t(x)·x r以二進制位方式依次串行輸入除法電路中,當數(shù)據(jù)輸入完畢時,除法電路中寄存器的值即為生成的CRC校驗碼。
千兆以太網(wǎng)協(xié)議中規(guī)定,采用CRC-32的方式對數(shù)據(jù)進行編碼,其生成的多項式為:x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1。對應的串行結(jié)構(gòu)CRC-32校驗碼生成原理如圖1所示。
當t(x)為8bit時,可將數(shù)據(jù)表示為多項式:t7x7+t6x6+t5x5+t4x4+t3x3+t2x2+t1x1+t0,多項式的系數(shù)即為待編碼的二進制數(shù)據(jù)。串行結(jié)構(gòu)內(nèi)寄存器的初始值為‘0’,電路開始工作后,二進制數(shù)據(jù)序列(t7,t6,t5,t4,t3,t2,t1,t0,0,0,……,0)按照從左至右的次序輸入除法電路(其中’0’的個數(shù)為32),當數(shù)據(jù)序列輸入完畢時,除法電路中寄存器的值即為生成的CRC-32校驗碼[1]。該電路具有以下特點:
(1)由于寄存器的初始值為零,因此,在二進制數(shù)據(jù)序列(t7,t6,t5,t4,t3,t2,t1,t0)輸入除法電路過程中,D31的反饋值始終為0,從而保證了二進制序列在數(shù)據(jù)移位過程中不受反饋值‘異或’運算的影響。當(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’的過程可認為是除法電路在沒有輸入數(shù)據(jù)的情況下進行自反饋" title="自反饋">自反饋式的移位運算。
因為在千兆以太網(wǎng)中,數(shù)據(jù)傳輸速率達到了Gbps級,如果采用每個時鐘周期計算1bit數(shù)據(jù)的串行結(jié)構(gòu),很難實現(xiàn)CRC校驗碼的生成。因此,有必要研究并行的CRC校驗碼編碼方法。
2 8bit并行CRC-32校驗碼生成方法的原理
自反饋的移位運算可以采用狀態(tài)轉(zhuǎn)移矩陣" title="狀態(tài)轉(zhuǎn)移矩陣">狀態(tài)轉(zhuǎn)移矩陣表示,i+1次移位后寄存器的狀態(tài)Qi+1與i次移位后寄存器的狀態(tài)Qi之間的關系可通過狀態(tài)矩陣A表示為:Qi+1=AQi,進一步又可得到第i次的狀態(tài)Qi可通過初始狀態(tài)Q0表示為:
Qi=AiQ0 (1)
CRC-32的狀態(tài)轉(zhuǎn)移矩陣A如圖2所示。
結(jié)合串行結(jié)構(gòu)的特點(2)及公式(1),可得出:當二進制序列(t7,t6,t5,t4,t3,t2,t1,t0,0,0,……,0)輸入完畢時,寄存器的狀態(tài)Q即為生成的CRC-32校驗碼,可表示為:
Q=A32Q0 (2)
由于自反饋移位運算從(t7,t6,t5,t4,t3,t2,t1,t0)輸入完畢開始,因此,根據(jù)串行結(jié)構(gòu)的特點(1)可知,初始狀態(tài)Q0為(t0,t1,t2,t3,t4,t5,t6,t7,0,0,……,0)T,其中‘0’的數(shù)量為24。不難發(fā)現(xiàn),由于Q0的后24項均為‘0’,在矩陣的×、+運算中不影響運算結(jié)果,因此,Q的計算可簡化為:
Q=BC (3)
式中,矩陣B為矩陣A32的前8列,而C為(t0,t1,t2,t3,t4,t5,t6,t7)T。
3 并行算法的實現(xiàn)
公式(3)即為輸入8bit數(shù)據(jù)情況下CRC-32校驗碼的生成公式。在采用該公式進行校驗碼計算時,首先由MATLAB等數(shù)學工具計算出A32(其中的加法運算為模2加),然后從計算結(jié)果中取出前8列得到B,最后再根據(jù)公式(3)計算得到Q。采用VHDL語言實現(xiàn)公式(3),其程序如圖3所示。其中,t[7..0]為輸入的8bit數(shù)據(jù),CRC[31..0]為生成的校驗碼。程序中考慮了輸入數(shù)據(jù)及輸出數(shù)據(jù)的倒序操作。
利用上述并行算法,輔以4B的移位寄存器,便可實現(xiàn)多字節(jié)的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數(shù)據(jù),‘fcs_out’代表生成的校驗碼。另外,程序中‘crc’ 和 ‘t’滿足圖3所示的運算關系。由于這部分描述在前面已經(jīng)介紹過,因此在程序中省略。
目前,該方法已在Altera公司的StratixGX40系列FPGA芯片上實現(xiàn),僅占用93個邏輯單元,便可實現(xiàn)任意字節(jié)的CRC-32校驗碼的計算,最高數(shù)據(jù)吞吐量達到2 400Mbps,完全能夠滿足千兆以太網(wǎng)的數(shù)據(jù)傳輸速度要求。圖4為輸入特定10個字節(jié)時校驗碼生成模塊的仿真結(jié)果,生成的校驗碼與低速率情況下采用串行結(jié)構(gòu)生成的校驗碼完全一致。
本文以千兆以太網(wǎng)CRC-32校驗碼的生成算法作為研究對象,深入分析了串行結(jié)構(gòu)的實現(xiàn)方法,并根據(jù)數(shù)據(jù)‘0’在異或運算中不影響運算結(jié)果的特性,總結(jié)出串行結(jié)構(gòu)實現(xiàn)方法的兩個特點,并在此基礎上提出一種高效的8bit并行CRC-32校驗碼生成算法。該算法與傳統(tǒng)的利用狀態(tài)轉(zhuǎn)移矩陣實現(xiàn)并行運算的方法相比[3],其狀態(tài)轉(zhuǎn)移方程更加簡單,校驗碼可由輸入的8bit數(shù)據(jù)經(jīng)過‘異或’運算直接得到,從而更加便于硬件實現(xiàn)。
參考文獻
[1] ?王新梅,肖國鎮(zhèn).糾錯碼—原理與方法[M].西安:電子科技大學出版社,1991.
[2] ?CUNNINGHAM D G, PH.D, LANE W G, et al. 千兆以太網(wǎng)[M].北京:清華大學出版社,2000.
[3] ?NG S L, DEWAR B. Parallel realization of ATM cell header CRC[J]. Communications, 1996,(19):257-263.
[4] ?朱榮華.一種CRC并行計算原理及實現(xiàn)方法[J].電子學報,1999,27(4):143-145.