1. 程式人生 > >基於FPGA的CRC原理實現

基於FPGA的CRC原理實現

CRC校驗原理看起來比較複雜,好難懂,因為大多數書上基本上是以二進位制的多項式形式來說明的。其實很簡單的問題,其根本思想就是先在要傳送的幀後面附加一個數(這個就是用來校驗的校驗碼,但要注意,這裡的數也是二進位制序列的,下同),生成一個新幀傳送給接收端。當然,這個附加的數不是隨意的,它要使所生成的新幀能與傳送端和接收端共同選定的某個特定數整除(注意,這裡不是直接採用二進位制除法,而是採用一種稱之為“2除法”)。到達接收端後,再把接收到的新幀除以(同樣採用“2除法”)這個選定的除數。因為在傳送端傳送資料幀之前就已通過附加一個數,做了“去餘”處理(也就已經能整除了),所以結果應該是沒有餘數。如果有餘數,則表明該幀在傳輸過程中出現了差錯

module CRC10 (Clock, Data_In, CRC_En, CRC_Clr, CRC_Out);

input Clock;
input CRC_En;
input CRC_Clr;
output [9:0] CRC_Out;
//reg [9:0] CRC_Out;
input [31:0] Data_In;


reg CRC_En_reg;
reg CRC_Clr_reg;
reg [31:0] Data_In_reg;


always @ (posedge Clock)
begin
CRC_En_reg = CRC_En ;
CRC_Clr_reg = CRC_Clr ;
Data_In_reg = Data_In ;
end


reg crcfb;
reg [9:0] CRC_Reg;
integer i;


assign CRC_Out = CRC_Reg;


always @ (posedge Clock)
begin
    if (CRC_Clr_reg)
        CRC_Reg <= 0;
    else if (CRC_En_reg) 
begin
        for (i=31;i>=0;i=i-1)
begin
                   crcfb     <=CRC_Reg[9];
          CRC_Reg[9]<=CRC_Reg[8]^crcfb;
          CRC_Reg[8]<=CRC_Reg[7];
          CRC_Reg[7]<=CRC_Reg[6];
          CRC_Reg[6]<=CRC_Reg[5];
          CRC_Reg[5]<=CRC_Reg[4]^crcfb;
          CRC_Reg[4]<=CRC_Reg[3]^crcfb;
          CRC_Reg[3]<=CRC_Reg[2];
          CRC_Reg[2]<=CRC_Reg[1];
          CRC_Reg[1]<=CRC_Reg[0]^crcfb;
          CRC_Reg[0]<=Data_In_reg[i]^crcfb;
end
end
end
endmodule