FPGA 学习小组
直播中

alexdos

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

以太网控制器CRC校验模块实现代码

CRC校验模块计算产生发送数据需要的 CRC 校验序列。计算产生的 CRC 校验需要添加到数据帧上。这个模块同时被接收数据模块用来计算 CRC 校验序列,然后和接收到的 CRC 校验序列进行比较,从而判断传输过程中是否发生错误。CRC 校验模块的主要代码如下:

  1. include "timescale.v"
  2. module eth_crc (Clk, Reset, Data, Enable, Initialize, Crc, CrcError);
  3. parameter Tp = 1;
  4. //输入、输出信号
  5. input Clk;
  6. input Reset;
  7. input [3:0] Data;
  8. input Enable;
  9. input Initialize;
  10. output [31:0] Crc;
  11. output CrcError;
  12. reg [31:0] Crc;
  13. wire [31:0] CrcNext;
  14. //计算获得 CRC 序列
  15. assign CrcNext[0] = Enable & (Data[0] ^ Crc[28]);
  16. assign CrcNext[1] = Enable & (Data[1] ^ Data[0] ^ Crc[28] ^ Crc[29]);
  17. assign CrcNext[2] = Enable & (Data[2] ^ Data[1] ^ Data[0] ^ Crc[28] ^ Crc[29] ^ Crc[30]);
  18. assign CrcNext[3] = Enable & (Data[3] ^ Data[2] ^ Data[1] ^ Crc[29] ^ Crc[30] ^ Crc[31]);
  19. assign CrcNext[4] = (Enable & (Data[3] ^ Data[2] ^ Data[0] ^ Crc[28] ^ Crc[30] ^ Crc[31]))^ Crc[0];
  20. assign CrcNext[5] = (Enable & (Data[3] ^ Data[1] ^ Data[0] ^ Crc[28] ^ Crc[29] ^ Crc[31]))^ Crc[1];
  21. assign CrcNext[6] = (Enable & (Data[2] ^ Data[1] ^ Crc[29] ^ Crc[30])) ^ Crc[ 2];
  22. assign CrcNext[7] = (Enable & (Data[3] ^ Data[2] ^ Data[0] ^ Crc[28] ^ Crc[30] ^ Crc[31]))^ Crc[3];
  23. assign CrcNext[8] = (Enable & (Data[3] ^ Data[1] ^ Data[0] ^ Crc[28] ^ Crc[29] ^ Crc[31]))^ Crc[4];
  24. assign CrcNext[9] = (Enable & (Data[2] ^ Data[1] ^ Crc[29] ^ Crc[30])) ^ Crc[5];
  25. assign CrcNext[10] = (Enable & (Data[3] ^ Data[2] ^ Data[0] ^ Crc[28] ^ Crc[30] ^ Crc[31]))^ Crc[6];
  26. assign CrcNext[11] = (Enable & (Data[3] ^ Data[1] ^ Data[0] ^ Crc[28] ^ Crc[29] ^ Crc[31]))^ Crc[7];
  27. assign CrcNext[12] = (Enable & (Data[2] ^ Data[1] ^ Data[0] ^ Crc[28] ^ Crc[29] ^ Crc[30]))^ Crc[8];
  28. assign CrcNext[13] = (Enable & (Data[3] ^ Data[2] ^ Data[1] ^ Crc[29] ^ Crc[30] ^ Crc[31]))^ Crc[9];
  29. assign CrcNext[14] = (Enable & (Data[3] ^ Data[2] ^ Crc[30] ^ Crc[31])) ^ Crc[10];
  30. assign CrcNext[15] = (Enable & (Data[3] ^ Crc[31])) ^ Crc[11];
  31. assign CrcNext[16] = (Enable & (Data[0] ^ Crc[28])) ^ Crc[12];
  32. assign CrcNext[17] = (Enable & (Data[1] ^ Crc[29])) ^ Crc[13];
  33. assign CrcNext[18] = (Enable & (Data[2] ^ Crc[30])) ^ Crc[14];
  34. assign CrcNext[19] = (Enable & (Data[3] ^ Crc[31])) ^ Crc[15];
  35. assign CrcNext[20] = Crc[16];
  36. assign CrcNext[21] = Crc[17];
  37. assign CrcNext[22] = (Enable & (Data[0] ^ Crc[28])) ^ Crc[18];
  38. assign CrcNext[23] = (Enable & (Data[1] ^ Data[0] ^ Crc[29] ^ Crc[28])) ^ Crc[19];
  39. assign CrcNext[24] = (Enable & (Data[2] ^ Data[1] ^ Crc[30] ^ Crc[29])) ^ Crc[20];
  40. assign CrcNext[25] = (Enable & (Data[3] ^ Data[2] ^ Crc[31] ^ Crc[30])) ^ Crc[21];
  41. assign CrcNext[26] = (Enable & (Data[3] ^ Data[0] ^ Crc[31] ^ Crc[28])) ^ Crc[22];
  42. assign CrcNext[27] = (Enable & (Data[1] ^ Crc[29])) ^ Crc[23];
  43. assign CrcNext[28] = (Enable & (Data[2] ^ Crc[30])) ^ Crc[24];
  44. assign CrcNext[29] = (Enable & (Data[3] ^ Crc[31])) ^ Crc[25];
  45. assign CrcNext[30] = Crc[26];
  46. assign CrcNext[31] = Crc[27];
  47. //初始化和复位 CRC 校验序列
  48. always @ (posedge Clk or posedge Reset)
  49. begin
  50. if (Reset)
  51. Crc <= #1 32'hffffffff;
  52. else
  53. if(Initialize)
  54. Crc <= #Tp 32'hffffffff;
  55. else
  56. Crc <= #Tp CrcNext;
  57. end
  58. //发生错误时的结果
  59. assign CrcError = Crc[31:0] != 32'hc704dd7b; // CRC not equal to magic number
  60. endmodule

更多回帖

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