固定优先级,举个例子也就是说我主观的认为优先级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