当前位置:   article > 正文

今天的学习目标之——Verilog实现仲裁器(固定优先级、RR轮询仲裁器)的设计_verilog 轮询仲裁模块

verilog 轮询仲裁模块

#每天进步一点#

一、何为仲裁器

仲裁器在FPGA中的应用非常广泛,其作用是对有限资源进行配置。当多个模块对同一资源发起需求时,此时就需要仲裁器进行抉择,决定资源的归属权 。

二、仲裁的优先级

既然进行仲裁,则必须有一个规则,即仲裁的优先级,目前一般广泛使用的设计有两种:固定优先级和轮询调度(Round Robin)。

三、Verilog代码实现

1. 固定优先级n选1仲裁器

  1. module fix_pri_arb_n21#(
  2. parameter req_num = 8
  3. )(input [req_num-1:0] req,
  4. output [req_num-1:0] grant
  5. );
  6. assign grant = req&(~(req-1));
  7. endmodule

2. RR轮询调度仲裁器

Round Robin就是考虑到公平性的一种仲裁算法,在固定优先级仲裁器的基础上进行设计。

思路一:优先级变化,而request不变。

  1. module round_robin_arb_fixed_pri#(
  2. parameter req_num = 8
  3. )(
  4. input clk,
  5. input rst,
  6. input [req_num-1:0] req,
  7. input [req_num-1:0] base,
  8. output [req_num-1:0] grant
  9. );
  10. wire [2*req_num-1:0] double_req = {req,req};
  11. wire [2*req_num-1:0] double_gnt = double_gnt & ~(double_req - base); //找出base以上第一个为1的位
  12. //req不变,优先级变化
  13. always@(posedge clk)begin
  14. if(rst)begin
  15. base <= {{req_num-1{1'b0}},1'b1}; //复位时,使最低位优先级最高
  16. end
  17. else
  18. base <= {grant[req_num-2:0],grant[req_num-1]}; //grant后,优先级往高位递增
  19. end
  20. assign grant = double_gnt[req_num-1:0] | double_gnt[2*req_num-1:req_num];
  21. endmodule

思路二:优先级不变,而request变化。

  1. module round_robin_arb_mask#(
  2. parameter req_num = 8
  3. )(
  4. input clk,
  5. input rst,
  6. input [req_num-1:0] req,
  7. output [req_num-1:0] grant
  8. );
  9. reg [req_num-1:0] mask; //设置的掩码
  10. reg [req_num-1:0] masked_req; //与掩码按位与后的req
  11. reg [req_num-1:0] req_fixed_prio;//最终进入fixed_prio_arbiter的req
  12. reg [req_num-1:0] grant_ff;
  13. assign masked_req = mask & req; //与掩码按位与后的req
  14. //优先级不变,req变化,得到许可后的位,掩码变为0,即退出优先级排序
  15. always@(posedge clk)begin
  16. if(rst)begin
  17. mask <= {req_num{1'b1}}; //复位时,掩码全部为1
  18. end
  19. else if(|grant == 1'b0)begin //即没有位得到许可
  20. mask <= {req_num{1'b1}}; //掩码则全部为1,即全部有效
  21. end
  22. else
  23. mask <= grant_ff ^ mask; //得到许可的位,掩码变为0,其余位掩码不变
  24. end
  25. always@(*)begin
  26. if(|masked_req == 1'b0);
  27. req_fixed_prio = req; //没有位得到许可时,此时发起请求的为初始的req
  28. else
  29. req_fixed_prio = masked_req; //去掉得到许可的req之后的req
  30. end
  31. assign grant = req_fixed_prio & (~(req_fixed_prio-1));
  32. endmodule

//(本文若有不当之处,感谢大家批评指正)。

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

闽ICP备14008679号