数字IC手撕代码(5)——固定优先级仲裁器

固定优先级,举个例子也就是说我主观的认为优先级A>B>C,所以每次这三个信号到来的时候,我都判断一下,如果有A我就输出A,没A看B来了没,再看C。

这种方式肯定是不公平的,因为每次信号来的时候A都是优先级最高的,最先让它通过,不过现在我们先不管。先看看这种仲裁器是怎么实现的。

例题:实现一个3个模块的固定优先级仲裁器,高位的优先级最低,低位的优先级最高。
体现成代码就是:

module fixed_pri_arb(
			input [2:0] req;
			output reg [2:0] grant
			);
always @(*) begin
    case (1'b1)
        req[0]: grant = 3'b001;
        req[1]: grant = 3'b010;
        req[2]: grant = 3'b100;
        default: grant = 3'b000;
    endcase
end

endmodule

case中只要前一个条件满足,就退出判断了,所以优先级req[0]>req[1]>req[2],满足题目的要求。

但是手撕代码往往叫你实现一个参数可配置的仲裁,那这种case列举的方法就不行了,下面介绍一种新的方法。

通过request与request-1求反的结果按位与,来得到独热码,独热码为1的一位是这个数最低的1,也就是仲裁的结果。

module fixed_pri_arb
        #(parameter REQ_WIDTH = 16)
        (
			input [REQ_WIDTH - 1:0] req;
			output [REQ_WIDTH - 1:0] grant
			);
assign grant = req & (~(req - 1));

endmodule

如果碰到高位优先级高的咋办?
很简单,只要把req重新排布一下

reg [REQ_WIDTH - 1:0]req_inverse;
for(i=0;i<REQ_WIDTH;i=i+1)
	begin
		req_inverse[i]=req[REQ_WIDTH -1-i ];
	end
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值