CRC校驗:
CRC即循環冗余校驗碼:是數據通信領域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環冗余檢查(CRC)是一種數據傳輸檢錯功能,對數據進行多項式計算,並將得到的結果附在幀的后面,接收設備也執行類似的算法,以保證數據傳輸的正確性和完整性。
現假設選擇的CRC生成多項式為G(X) = X4 + X3 + 1,要求出二進制序列10110011的CRC校驗碼。下面是具體的計算過程:
①將多項式轉化為二進制序列,由G(X) = X4 + X3 + 1可知二進制一種有五位,第4位、第三位和第零位分別為1,則序列為11001
②多項式的位數位5,則在數據幀的后面加上(5-1)位0,數據幀變為101100110000,然后使用模2除法除以除數11001,得到余數。
③將計算出來的CRC校驗碼添加在原始幀的后面,真正的數據幀為101100110100,再把這個數據幀發送到接收端。
④接收端收到數據幀后,用上面選定的除數,用模2除法除去,驗證余數是否為0,如果為0,則說明數據幀沒有出錯。
CRC 生成多項式:
是接受方和發送方的一個約定,也就是一個二進制數,在整個傳輸過程中,這個數始終保持不變。
在發送方,利用生成多項式對信息多項式做模2除生成校驗碼。在接受方利用生成多項式對收到的編碼多項式做模2除檢測和確定錯誤位置。
應滿足以下條件:
a、生成多項式的最高位和最低位必須為1。
b、當被傳送信息(CRC碼)任何一位發生錯誤時,被生成多項式做模2除后應該使余數不為0。
c、不同位發生錯誤時,應該使余數不同。
d、對余數繼續做模2除,應使余數循環。
將這些要求反映為數學關系是比較復雜的。但可以從有關資料查到常用的對應於不同碼制的生成多項式如下:
CRC校驗在線工具 在線網頁生成工具
打開http://www.easics.com/webtools/crctool,根據需要設置CRC的多項式參數,點擊生成Verilog或VHDL模塊,此循環CRC校驗模塊的CRC_in初始輸入為全1。網頁工具如下圖所示:
下面為此在線工具生成的CRC-12的40bit數據幀的CRC校驗模塊:
////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 1999-2008 Easics NV.
// This source file may be used and distributed without restriction
// provided that this copyright statement is not removed from the file
// and that any derivative work contains the original copyright notice
// and the associated disclaimer.
//
// THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS
// OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
// WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//
// Purpose : synthesizable CRC function
// * polynomial: x^12 + x^6 + x^4 + x^1 + 1
// * data width: 40
//
// Info : tools@easics.be
// http://www.easics.com
////////////////////////////////////////////////////////////////////////////////
module CRC12_D40;
// polynomial: x^12 + x^6 + x^4 + x^1 + 1
// data width: 40
// convention: the first serial bit is D[39]
function [11:0] nextCRC12_D40;
input [39:0] Data;
input [11:0] crc;
reg [39:0] d;
reg [11:0] c;
reg [11:0] newcrc;
begin
d = Data;
c = crc;
newcrc[0] = d[38] ^ d[36] ^ d[34] ^ d[33] ^ d[32] ^ d[30] ^ d[27] ^ d[23] ^ d[20] ^ d[18] ^ d[16] ^ d[11] ^ d[8] ^ d[6] ^ d[0] ^ c[2] ^ c[4] ^ c[5] ^ c[6] ^ c[8] ^ c[10];
newcrc[1] = d[39] ^ d[38] ^ d[37] ^ d[36] ^ d[35] ^ d[32] ^ d[31] ^ d[30] ^ d[28] ^ d[27] ^ d[24] ^ d[23] ^ d[21] ^ d[20] ^ d[19] ^ d[18] ^ d[17] ^ d[16] ^ d[12] ^ d[11] ^ d[9] ^ d[8] ^ d[7] ^ d[6] ^ d[1] ^ d[0] ^ c[0] ^ c[2] ^ c[3] ^ c[4] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11];
newcrc[2] = d[39] ^ d[38] ^ d[37] ^ d[36] ^ d[33] ^ d[32] ^ d[31] ^ d[29] ^ d[28] ^ d[25] ^ d[24] ^ d[22] ^ d[21] ^ d[20] ^ d[19] ^ d[18] ^ d[17] ^ d[13] ^ d[12] ^ d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[2] ^ d[1] ^ c[0] ^ c[1] ^ c[3] ^ c[4] ^ c[5] ^ c[8] ^ c[9] ^ c[10] ^ c[11];
newcrc[3] = d[39] ^ d[38] ^ d[37] ^ d[34] ^ d[33] ^ d[32] ^ d[30] ^ d[29] ^ d[26] ^ d[25] ^ d[23] ^ d[22] ^ d[21] ^ d[20] ^ d[19] ^ d[18] ^ d[14] ^ d[13] ^ d[11] ^ d[10] ^ d[9] ^ d[8] ^ d[3] ^ d[2] ^ c[1] ^ c[2] ^ c[4] ^ c[5] ^ c[6] ^ c[9] ^ c[10] ^ c[11];
newcrc[4] = d[39] ^ d[36] ^ d[35] ^ d[32] ^ d[31] ^ d[26] ^ d[24] ^ d[22] ^ d[21] ^ d[19] ^ d[18] ^ d[16] ^ d[15] ^ d[14] ^ d[12] ^ d[10] ^ d[9] ^ d[8] ^ d[6] ^ d[4] ^ d[3] ^ d[0] ^ c[3] ^ c[4] ^ c[7] ^ c[8] ^ c[11];
newcrc[5] = d[37] ^ d[36] ^ d[33] ^ d[32] ^ d[27] ^ d[25] ^ d[23] ^ d[22] ^ d[20] ^ d[19] ^ d[17] ^ d[16] ^ d[15] ^ d[13] ^ d[11] ^ d[10] ^ d[9] ^ d[7] ^ d[5] ^ d[4] ^ d[1] ^ c[4] ^ c[5] ^ c[8] ^ c[9];
newcrc[6] = d[37] ^ d[36] ^ d[32] ^ d[30] ^ d[28] ^ d[27] ^ d[26] ^ d[24] ^ d[21] ^ d[17] ^ d[14] ^ d[12] ^ d[10] ^ d[5] ^ d[2] ^ d[0] ^ c[0] ^ c[2] ^ c[4] ^ c[8] ^ c[9];
newcrc[7] = d[38] ^ d[37] ^ d[33] ^ d[31] ^ d[29] ^ d[28] ^ d[27] ^ d[25] ^ d[22] ^ d[18] ^ d[15] ^ d[13] ^ d[11] ^ d[6] ^ d[3] ^ d[1] ^ c[0] ^ c[1] ^ c[3] ^ c[5] ^ c[9] ^ c[10];
newcrc[8] = d[39] ^ d[38] ^ d[34] ^ d[32] ^ d[30] ^ d[29] ^ d[28] ^ d[26] ^ d[23] ^ d[19] ^ d[16] ^ d[14] ^ d[12] ^ d[7] ^ d[4] ^ d[2] ^ c[0] ^ c[1] ^ c[2] ^ c[4] ^ c[6] ^ c[10] ^ c[11];
newcrc[9] = d[39] ^ d[35] ^ d[33] ^ d[31] ^ d[30] ^ d[29] ^ d[27] ^ d[24] ^ d[20] ^ d[17] ^ d[15] ^ d[13] ^ d[8] ^ d[5] ^ d[3] ^ c[1] ^ c[2] ^ c[3] ^ c[5] ^ c[7] ^ c[11];
newcrc[10] = d[36] ^ d[34] ^ d[32] ^ d[31] ^ d[30] ^ d[28] ^ d[25] ^ d[21] ^ d[18] ^ d[16] ^ d[14] ^ d[9] ^ d[6] ^ d[4] ^ c[0] ^ c[2] ^ c[3] ^ c[4] ^ c[6] ^ c[8];
newcrc[11] = d[37] ^ d[35] ^ d[33] ^ d[32] ^ d[31] ^ d[29] ^ d[26] ^ d[22] ^ d[19] ^ d[17] ^ d[15] ^ d[10] ^ d[7] ^ d[5] ^ c[1] ^ c[3] ^ c[4] ^ c[5] ^ c[7] ^ c[9];
nextCRC12_D40 = newcrc;
end
endfunction
endmodule