FPGA 学习小组
直播中

alexdos

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

以太网控制器数据接收模块有哪些重要模块?

1.数据接收状态机

数据接收的整个过程由一个状态机控制完成。数据的接收与发送是相反的过程:首先去除报头,然后去除 SFD(帧起始分隔符),随后接收数据,最后进行 CRC 校验判断数据在传输过程中是否受损。流程与数据发送的流程相反,这里不再赘述,请参考源代码。

2.计数器模块

数据接收的计数器模块包括接收数据过程中的所有计数器。内容与数据发送模块中的计数器模块类似,请参考源代码。

3.CRC 校验模块

数据接收模块的 CRC 校验首先根据接收到的数据计算产生 32 位 CRC 校验序列,然后跟接收到的 CRC 校验序列比较,判断数据在传输过程中是否损坏。数据接收模块的 CRC 校验的源代码和数据发送模块的 CRC 校验代码一样。

4.地址检查模块

地址检查模块将检查接收数据中的目的地址是否和接收模块的地址一致。如果地址不一致,接收到的数据将被清除。地址检查模块的主要代码如下:

  1. `include "timescale.v"
  2. module eth_rxaddrcheck(MRxClk, Reset, RxData, Broadcast ,r_Bro ,r_Pro, ByteCntEq2,
  3. ByteCntEq3,
  4. ByteCntEq4, ByteCntEq5, ByteCntEq6, ByteCntEq7, HASH0, HASH1, CrcHash, CrcHashGood,
  5. StateData,
  6. RxEndFrm, Multicast, MAC, RxAbort, AddressMiss, PassAll,
  7. ControlFrmAddressOK);
  8. parameter Tp = 1;
  9. //输入输出信号
  10. input MRxClk;
  11. ….
  12. //连线与寄存器
  13. wire BroadcastOK;
  14. ….
  15. //地址非法标志
  16. assign RxAddressInvalid = ~(UnicastOK | BroadcastOK | MulticastOK | r_Pro);
  17. //广播正确标志
  18. assign BroadcastOK = Broadcast & ~r_Bro;
  19. //检查接收数据使能
  20. assign RxCheckEn = | StateData;
  21. // 在地址周期报告地址错误
  22. always @ (posedge MRxClk or posedge Reset)
  23. begin
  24. if(Reset)
  25. RxAbort <= #Tp 1'b0;
  26. else if(RxAddressInvalid & ByteCntEq7 & RxCheckEn)
  27. RxAbort <= #Tp 1'b1;
  28. else
  29. RxAbort <= #Tp 1'b0;
  30. end
  31. // 写 ff 到 BD 状态寄存器中,表示“地址丢失”
  32. always @ (posedge MRxClk or posedge Reset)
  33. begin
  34. if(Reset)
  35. AddressMiss <= #Tp 1'b0;
  36. else if(ByteCntEq7 & RxCheckEn)
  37. AddressMiss <= #Tp (~(UnicastOK | BroadcastOK | MulticastOK | (PassAll &
  38. ControlFrmAddressOK)));
  39. end
  40. //哈希地址检查,多点发送
  41. always @ (posedge MRxClk or posedge Reset)
  42. begin
  43. if(Reset)
  44. MulticastOK <= #Tp 1'b0;
  45. else if(RxEndFrm | RxAbort)
  46. MulticastOK <= #Tp 1'b0;
  47. else if(CrcHashGood & Multicast)
  48. MulticastOK <= #Tp HashBit;
  49. end
  50. //地址探测,单点发送
  51. always @ (posedge MRxClk or posedge Reset)
  52. begin
  53. if(Reset)
  54. UnicastOK <= #Tp 1'b0;
  55. else
  56. if(RxCheckEn & ByteCntEq2)
  57. UnicastOK <= #Tp RxData[7:0] == MAC[47:40];
  58. else
  59. if(RxCheckEn & ByteCntEq3)
  60. UnicastOK <= #Tp ( RxData[7:0] == MAC[39:32]) & UnicastOK;
  61. else
  62. if(RxCheckEn & ByteCntEq4)
  63. UnicastOK <= #Tp ( RxData[7:0] == MAC[31:24]) & UnicastOK;
  64. else
  65. if(RxCheckEn & ByteCntEq5)
  66. UnicastOK <= #Tp ( RxData[7:0] == MAC[23:16]) & UnicastOK;
  67. else
  68. if(RxCheckEn & ByteCntEq6)
  69. UnicastOK <= #Tp ( RxData[7:0] == MAC[15:8]) & UnicastOK;
  70. else
  71. if(RxCheckEn & ByteCntEq7)
  72. UnicastOK <= #Tp ( RxData[7:0] == MAC[7:0]) & UnicastOK;
  73. else
  74. if(RxEndFrm | RxAbort)
  75. UnicastOK <= #Tp 1'b0;
  76. end
  77. assign IntHash = (CrcHash[5])? HASH1 : HASH0;
  78. always@(CrcHash or IntHash)
  79. begin
  80. case(CrcHash[4:3])
  81. 2'b00: ByteHash = IntHash[7:0];
  82. 2'b01: ByteHash = IntHash[15:8];
  83. 2'b10: ByteHash = IntHash[23:16];
  84. 2'b11: ByteHash = IntHash[31:24];
  85. endcase
  86. end
  87. assign HashBit = ByteHash[CrcHash[2:0]];
  88. endmodule

更多回帖

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