使用verilog实现简单的总线仲裁算法;固定优先级和轮询调度
固定优先级仲裁
仲裁的优先级总是 1号 > 2号 > 3号 > 4号,代码如下
/*********************************************************************
* Author : liu
* Last modified : 2023-04-21 23:25
* Filename : arbitr.v
* Description : 1 > 2 > 3 > 4
* ******************************************************************/
module arbitr(
input clk,
input rstn,
input [3:0] requestx,
output reg [1:0] grantx
);
always @(posedge clk or negedge rstn) begin
if(!rstn) begin
grantx <= 2'b0;
end
else if(requestx[0])
grantx <= 2'b00;
else if(requestx[1])
grantx <= 2'b01;
else if(requestx[2])
grantx <= 2'b10;
else if(requestx[3])
grantx <= 2'b11;
end
endmodule
轮询调度仲裁
仲裁的优先级是轮询的,1被授权后,变为最低优先级,代码如下
/*********************************************************************
* Author : liu
* Last modified : 2023-04-21 23:33
* Filename : arbitr_RR.v
* Description : one by one, 1->2->3->4->1->2->3->4
* ******************************************************************/
module arbitr_rr(
input clk,
input rstn,
input [3:0] requestx,
output reg [1:0] grantx
);
reg [3:0] mask;
always @(posedge clk or negedge rstn) begin
if(!rstn) begin
grantx <= 2'h0;
mask <= 4'b1111;
end
else if(requestx[0] & mask[0]) begin
grantx <= 2'b00;
mask <= 4'b1110;
end
else if(requestx[1] & mask[1]) begin
grantx <= 2'b01;
mask <= 4'b1100;
end
else if(requestx[2] & mask[2]) begin
grantx <= 2'b10;
mask <= 4'b1000;
end
else if(requestx[3] & mask[3]) begin
grantx <= 2'b11;
mask <= 4'b1111;
end
else begin
mask <= 4'b1111;
end
end
endmodule