当前位置:   article > 正文

verilog多因素影响仲裁器设计_轮询仲裁器verilog

轮询仲裁器verilog

前三篇讲了固定优先级仲裁器的设计、轮询仲裁器的设计、权重轮询仲裁器设计:

Verilog固定优先级仲裁器——Fixed Priority Arbiter_weixin_42330305的博客-CSDN博客

Verilog轮询仲裁器设计——Round Robin Arbiter_verilog实现轮询_weixin_42330305的博客-CSDN博客

Verilog权重轮询仲裁器设计——Weighted Round Robin Arbiter_weixin_42330305的博客-CSDN博客

但是在实际应用中,影响轮询的因素可能有多种,简单的轮询无法实现,这就需要多因素影响的仲裁器。

一、轮询仲裁器的另一种实现方法

我们先来介绍与上面链接中不同的轮询仲裁的实现方式。

  1. genvar i;
  2. generate
  3. for(i=0;i<8;i=i+1) begin:REQ_RR_PRI
  4. always@(*) begin
  5. if(arb_rr_cur==i)
  6. req_rr_pri[i] = 3'd7;
  7. else if(arb_rr_cur>i)
  8. req_rr_pri[i] = arb_rr_cur - i - 3'd1;
  9. else
  10. req_rr_pri[i] = 3'd7 - i - arb_rr_cur;
  11. end
  12. end
  13. endgenerate

每一个req都有一个排序值:req_rr_pri

arb_rr_cur表示上一次被serve的req的编号,当某个req被serve后,它的优先级转为最低

如图所示:

 

 之后比较req_rr_pri的值,最大的胜出

二、多种因素影响

假设每一个req同时伴随了一个qos值,在仲裁时,qos值大的需要优先被serve

那么我们比较的因素就不仅仅是req_rr_pri的值,而是qos和req_rr_pri合并后的值,即{qos_arb[i],req_rr_pri[i]}

一般情况下,轮询的比较优先级最低(想想为什么?)

三、完整代码示例

  1. module multi_influenced_arb
  2. (
  3. input clk,
  4. input reset_n,
  5. input [7:0] req,
  6. input [8*4-1:0] qos,
  7. output [7:0] grant
  8. );
  9. reg [2:0] arb_rr_cur;
  10. wire [2:0] arb_rr_nxt;
  11. reg [2:0] req_rr_pri[7:0];
  12. wire [3:0] qos_arb[7:0];
  13. wire [6:0] arb_pri[7:0];
  14. always @(posedge clk or negedge reset_n)
  15. begin
  16. if(!reset_n)
  17. arb_rr_cur <= 4'b0;
  18. else if(|grant)
  19. arb_rr_cur <= arb_rr_nxt;
  20. end
  21. genvar i;
  22. generate
  23. for(i=0;i<8;i=i+1) begin:REQ_RR_PRI
  24. assign qos_arb[i] = qos[i*4+:4];
  25. always@(*) begin
  26. if(arb_rr_cur==i)
  27. req_rr_pri[i] = 3'd7;
  28. else if(arb_rr_cur>i)
  29. req_rr_pri[i] = arb_rr_cur - i - 3'd1;
  30. else
  31. req_rr_pri[i] = 3'd7 - i - arb_rr_cur;
  32. end
  33. assign arb_pri[i] = {qos_arb[i],req_rr_pri[i]};
  34. if(i==7) begin
  35. assign grant[i] =
  36. for(j=0;j<6;j=j+1) begin
  37. ((arb_pri[i] > arb_pri[j]) || (~req[j])) &&
  38. end
  39. ((arb_pri[7] > arb_pri[6]) || (~req[6]));
  40. end
  41. else begin
  42. assign grant[i] =
  43. for(j=0;j<8;j=j+1) begin
  44. if(i!=j) begin
  45. ((arb_pri[i] > arb_pri[j]) || (~req[j])) &&
  46. end
  47. ((arb_pri[i] > arb_pri[7]) || (~req[7]));
  48. end
  49. end
  50. end
  51. endgenerate
  52. assign arb_rr_nxt[0] = grant[7] | grant[5] | grant[3] | grant[1];
  53. assign arb_rr_nxt[1] = grant[7] | grant[6] | grant[3] | grant[2];
  54. assign arb_rr_nxt[2] = grant[7] | grant[6] | grant[5] | grant[4];
  55. endmodule

其中,第38-55行是各个req与除自己外的值相比较的过程,由于arb_pri的存在,保证了只有一个req会胜出。

arb_rr_nxt表示当前胜出的req的二进制编码,第58-60行是独热码转二进制码,原理见:

独热码转二进制码(含代码)_独热码到二进制码的转化_weixin_42330305的博客-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/802639
推荐阅读
相关标签
  

闽ICP备14008679号