【Verilog合辑】

一. 仲裁器(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次。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值