FPGA 学习小组
直播中

alexdos

6年用户 804经验值
擅长:可编程逻辑 电源/新能源 嵌入式技术 模拟技术
私信 关注

CAN通信控制的CRC校验

CAN 节点中设有错误检测、标定和自检等措施。检测错误包括多种方式,其中最常用、最有效的一种是 CRC 校验。CRC 序列由循环冗余校验码求得的帧检查序组成。为实现 CRC 计算,被除的多项式系数由包括帧起始、仲裁字段、控制字段、数据字段在内的无填充位数据流给出,其 15 个最低位的系数为 0。此多项式被发生器产生的下列多项式除(系数为模 2 运算):
2.jpg
该多项式除法的余数即为发向总线的 CRC 序列。为完成此运算,可以使用一个 15 位的移位寄存器 CRC-RG(14:0)。被除多项式位数据流由帧起始到数据字段结束的无填充序列给定,如果以 NXTBIT 标记该位数据流的下一位,则 CRC 序列可以用如下的方式求得:

  1. CRC-RG=0 //初始化移位寄存器
  2. REPEAT
  3. CRCNXT = NXTBIT EXOR CRC-RG(14);
  4. CRC-RG(14:1) = CRC-RG(13:0) //寄存器左移一位
  5. CRC-RG(0) = 0;
  6. IF CRCNXT THEN
  7. CRC-RG(14:0) = CRC-RG(14:0) EXOR (4599H)
  8. END IF
  9. UNtiL(CRC 序列开始或者存在一个出错状态)


完成数据 CRC 校验的主要代码如下:

  1. assign crc_next = data ^ crc[14];
  2. assign crc_tmp = {crc[13:0], 1'b0};
  3. //CRC 校验
  4. always @ (posedge clk)
  5. begin
  6. if(initialize)
  7. crc <= #Tp 0;
  8. else if (enable)
  9. begin
  10. if (crc_next)
  11. crc <= #Tp crc_tmp ^ 15'h4599;
  12. else
  13. crc <= #Tp crc_tmp;
  14. end
  15. end

更多回帖

发帖
×
20
完善资料,
赚取积分