FPGA 学习小组
直播中

alexdos

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

以太网控制器错误处理模块实现代码

在数据传输过程中发生冲突时,数据发送模块首先发送“0x99999999”,然后结束传输。在传输重新开始以前,数据发送模块会做一些补偿。即在重新传输数据以前进行一定时间延迟,延迟时间的长短由错误处理模块产生的随机数决定。这样可以减少再次发生数据冲突的次数。这种随机数采用一种叫做二进制指数补偿算法(Binary Exponential algorithm)产生。

这种算法的过程是这样的:发送者在第一次冲突后延迟一个随机时间,如果第二次发送也产生冲突的话,则延迟第一次时延的两倍;若第三次发送还冲突的话,就延迟 4 倍。执行指数补偿算法的考虑是:如果发生许多发送者这同时发送的事件,将发生严重的拥塞。在这种拥塞中,很可能两个站点选择非常接近的随机时间进行补偿。这样,发生另一次冲突的可能性是很高的。通过使延迟时间加倍,指数补偿算法会很快把站点重新发送的时间间隔显著拉开,使发生再一次冲突的可能性变得非常小了。

错误处理模块的主要代码如下:

  1. `include "timescale.v"
  2. module eth_random (MTxClk, Reset, StateJam, StateJam_q, RetryCnt, NibCnt, ByteCnt,
  3. RandomEq0, RandomEqByteCnt);
  4. parameter Tp = 1;
  5. //输入输出信号
  6. input MTxClk;
  7. input Reset;
  8. input StateJam;
  9. input StateJam_q;
  10. input [3:0] RetryCnt;
  11. input [15:0] NibCnt;
  12. input [9:0] ByteCnt;
  13. output RandomEq0;
  14. output RandomEqByteCnt;
  15. //连线和寄存器
  16. wire Feedback;
  17. reg [9:0] x;
  18. wire [9:0] Random;
  19. reg [9:0] RandomLatched;
  20. always @ (posedge MTxClk or posedge Reset)
  21. begin
  22. if(Reset)
  23. x[9:0] <= #Tp 0;
  24. else
  25. x[9:0] <= #Tp {x[8:0], Feedback};
  26. end
  27. assign Feedback = x[2] ~ ^ x[9];
  28. //产生随机数
  29. assign Random [0] = x[0];
  30. assign Random [1] = (RetryCnt > 1) ? x[1] : 1'b0;
  31. assign Random [2] = (RetryCnt > 2) ? x[2] : 1'b0;
  32. assign Random [3] = (RetryCnt > 3) ? x[3] : 1'b0;
  33. assign Random [4] = (RetryCnt > 4) ? x[4] : 1'b0;
  34. assign Random [5] = (RetryCnt > 5) ? x[5] : 1'b0;
  35. assign Random [6] = (RetryCnt > 6) ? x[6] : 1'b0;
  36. assign Random [7] = (RetryCnt > 7) ? x[7] : 1'b0;
  37. assign Random [8] = (RetryCnt > 8) ? x[8] : 1'b0;
  38. assign Random [9] = (RetryCnt > 9) ? x[9] : 1'b0;
  39. //复位后随机数为 0,发送“0x99999999”后锁存产生的随机数
  40. always @ (posedge MTxClk or posedge Reset)
  41. begin
  42. if(Reset)
  43. RandomLatched <= #Tp 10'h000;
  44. else
  45. begin
  46. if(StateJam & StateJam_q)
  47. RandomLatched <= #Tp Random;
  48. end
  49. end
  50. // 随机数为 0
  51. assign RandomEq0 = RandomLatched == 10'h0;
  52. assign RandomEqByteCnt = ByteCnt[9:0] == RandomLatched & (&NibCnt[6:0]);
  53. endmodule

更多回帖

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