赞
踩
#每天进步一点#
仲裁器在FPGA中的应用非常广泛,其作用是对有限资源进行配置。当多个模块对同一资源发起需求时,此时就需要仲裁器进行抉择,决定资源的归属权 。
既然进行仲裁,则必须有一个规则,即仲裁的优先级,目前一般广泛使用的设计有两种:固定优先级和轮询调度(Round Robin)。
- module fix_pri_arb_n21#(
- parameter req_num = 8
- )(input [req_num-1:0] req,
- output [req_num-1:0] grant
- );
-
- assign grant = req&(~(req-1));
-
- endmodule
Round Robin就是考虑到公平性的一种仲裁算法,在固定优先级仲裁器的基础上进行设计。
思路一:优先级变化,而request不变。
- module round_robin_arb_fixed_pri#(
- parameter req_num = 8
- )(
- input clk,
- input rst,
- input [req_num-1:0] req,
- input [req_num-1:0] base,
- output [req_num-1:0] grant
- );
-
- wire [2*req_num-1:0] double_req = {req,req};
- wire [2*req_num-1:0] double_gnt = double_gnt & ~(double_req - base); //找出base以上第一个为1的位
-
- //req不变,优先级变化
- always@(posedge clk)begin
- if(rst)begin
- base <= {{req_num-1{1'b0}},1'b1}; //复位时,使最低位优先级最高
- end
- else
- base <= {grant[req_num-2:0],grant[req_num-1]}; //grant后,优先级往高位递增
- end
-
- assign grant = double_gnt[req_num-1:0] | double_gnt[2*req_num-1:req_num];
-
- endmodule
思路二:优先级不变,而request变化。
- module round_robin_arb_mask#(
- parameter req_num = 8
- )(
- input clk,
- input rst,
- input [req_num-1:0] req,
- output [req_num-1:0] grant
- );
-
- reg [req_num-1:0] mask; //设置的掩码
- reg [req_num-1:0] masked_req; //与掩码按位与后的req
- reg [req_num-1:0] req_fixed_prio;//最终进入fixed_prio_arbiter的req
- reg [req_num-1:0] grant_ff;
-
- assign masked_req = mask & req; //与掩码按位与后的req
-
- //优先级不变,req变化,得到许可后的位,掩码变为0,即退出优先级排序
- always@(posedge clk)begin
- if(rst)begin
- mask <= {req_num{1'b1}}; //复位时,掩码全部为1
- end
- else if(|grant == 1'b0)begin //即没有位得到许可
- mask <= {req_num{1'b1}}; //掩码则全部为1,即全部有效
- end
- else
- mask <= grant_ff ^ mask; //得到许可的位,掩码变为0,其余位掩码不变
- end
-
-
- always@(*)begin
- if(|masked_req == 1'b0);
- req_fixed_prio = req; //没有位得到许可时,此时发起请求的为初始的req
- else
- req_fixed_prio = masked_req; //去掉得到许可的req之后的req
- end
-
- assign grant = req_fixed_prio & (~(req_fixed_prio-1));
-
- endmodule
//(本文若有不当之处,感谢大家批评指正)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。