一. 仲裁器(2022联发科数字IC)
题目:
请求方发送req(request)信号1表示有请求给仲裁器,仲裁器响应grant信号为1表示请求成功。
通过参数定义在冲突情形下,响应A/B的比例(举例,一段时间内,有若干次A请求和若干次B请求,其中A&B发生冲突的有N次,这N次中先响应A 3次,后响应B 1次,循环反复。举例中的3和1可配置。)
module ArbiterParam#(
parameter N // 请求冲突时,响应的比例
)(
input clk,
input rstn,
input req1,
input req2,
output reg[1:0]grant // 1:grant req1; 2:grant req2
);
reg [N-1:0]cnt; //统计冲突的次数
reg Flag; //0:channel1 N, channel2 1;
//1:channel1 1, channel2 N;
reg [1:0]state;
parameter IDLE=0,
S1=1,
S2=2;
//***因为是同一个时刻立即grant,
//***所以直接判断请求信号就能判断冲突。
//reg req1_r,req2_r; //req1和req2的上升沿出现在同一时刻,一次冲突
//wire pos_req1,pos_req2;
//assign pos_req1=req1 && (!req1_r);
//assign pos_req2=req2 && (!req2_r);
/*
always@(posedge clk or negedge rstn)begin
if(!rstn)begin
req1_r<=0;
req2_r<=0;
end else begin
req1_r<=req1;
req2_r<=req2;
end
end*/
// 统计冲突的次数 & Flag
always@(posedge clk or negedge rstn)begin
if(!rstn)begin
cnt<=0;
Flag<=0;
end else if(req1 && req2)begin
if(cnt<N+1) //cnt:1~N+1,其中N次响应1,1次响应2;
cnt<=cnt+1;
else begin
cnt<=0;
Flag<=!Flag;
end
end
end
always@(*)begin
if(req1 && req2)begin // 同时请求响应
if((cnt==N+1 && (!Flag)) || (cnt!=N+1 && Flag))
state=S2;
else
state=S1;
end
else if(req1) // channel1单独请求
state=S1;
else if(req2) // channel2单独请求
state=S2;
else // 木有请求
state=IDLE;
end
// 输出
always@(*)begin
case(state)
IDLE:grant=0;
S1:grant=1;
S2:grant=2;
default:grant=0;
endcase
end
endmodule
仿真结果:
N=5,grant1/grant2=5, 在累计同时请求5次时,req1响应了5次,req2响应了1次。