基于FPGA的CRC原理实现

来源:互联网 发布:管家婆软件怎么用 编辑:程序博客网 时间:2024/05/16 19:14

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
0 0
原创粉丝点击