关于CRC编解码的问题
时间:10-02
整理:3721RD
点击:
- always @(posedge clk or negedge rst)
- begin
- if (!rst)
- begin
- crc_out <= 5'b00000;
- //crc_alu <= 5'b01001;
- crc_alu <= 5'b00000;
- crc_done <= 1'b0;
- data_out <= 1'bz;
- end
- else if (crc_en)
- begin
- if (!trans_end)
- begin
- crc_done <= 1'b0;
- data_out <= data_in;
- crc_tmp = data_in ^ crc_alu[4];
- crc_alu[4] <= crc_alu[3];
- crc_alu[3] <= crc_tmp ^ crc_alu[2];
- for(i=2; i>0; i=i-1)
- crc_alu[i] <= crc_alu[i-1];
- crc_alu[0] <= crc_tmp;
- end
- else
- begin
- crc_out <= crc_alu;
- crc_done <= 1'b1;
- end
- end
- end
这是一段自己写的CRC5代码。看了CRC的资料,也理解了CRC的计算方法,数值(软件)计算时,直接用需要校验的数据除以生成多项式得到最后的余式即可,即为CRC5校验码。但是用硬件实现时,我看资料上串行的采用LFSR(Linear feedback shift register)的结构,MSB优先依次输入,同时需要对寄存器先预置值,比如01001,但是通过这样的方法计算得到的CRC5为什么与手算的不一样呢?
比如说,待校验数据为0100 1101,我手算的CRC5结果为10001,但是verilog代码仿真的结果是00100,当我把预置值改为00000的时候,仿真的结果倒是和手算的一致。生成多项式为101001。所以我就不理解了,ISO_IEC18000-6C协议上都说需要预置来实现,可是两者结果为何不一致呢?到底需不需要预置值呢?请教一下各位朋友。
其实crc计算公式有专门的代码生成网站,www.outputlogic.com;生成的代码,需要对输入和输出做相应的位序做处理一下,计算出来的校验值就和软件计算的校验值相同了!如果学习的话,还是多摸索一下!
好的 谢谢。
