您的位置:首页 > 其它

基于FPGA的CRC原理实现

2014-05-15 16:59 295 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: