导言
这题是个实现仲裁电路的状态机。有了此题的状态转移图和文字描述,实现仲裁电路的难度下降了许多。
代码
module top_module (
input clk,
input resetn, // active-low synchronous reset
input [3:1] r, // request
output [3:1] g // grant
);
parameter A=2'b00,B=2'b01,C=2'b10,D=2'b11;
reg [1:0] state,next;
always@(posedge clk) begin
if(~resetn) begin
state <= A;
end
else begin
state <= next;
end
end
always@* begin
case(state)
A: next = r[1] ? B:(r[2] ? C:(r[3] ? D:A));
B: next = r[1] ? B:A;
C: next = r[2] ? C:A;
D: next = r[3] ? D:A;
endcase
end
always@(posedge clk) begin
if(~resetn) begin
g <= 3'b000;
end
else begin
case(next)
A: g <= 3'b000;
B: g <= 3'b001;
C: g <= 3'b010;
D: g <= 3'b100;
default: g <= 3'b000;
endcase
end
end
endmodule
小结
这应该是一个很基础的仲裁电路,其他仲裁结构可以根据自定义的优先级来重新定义状态转换。状态机实现仲裁的思想值得借鉴。