|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
- 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协议上都说需要预置来实现,可是两者结果为何不一致呢?到底需不需要预置值呢?请教一下各位朋友。 |
|