verilog实现RR循环调度模块

本文描述了一位开发者在实现模块功能时遇到的问题,通过参考一篇具有清晰逻辑但难以理解的文章,作者成功编写了一个可以直接使用的代码,涉及掩码、时钟周期请求调度和电路设计。
摘要由CSDN通过智能技术生成

        最近需要实现这个模块功能,但是博客上的没有一个代码是能直接拿过来用的,而且误导了我一两天(那代码里都组合逻辑坏了),挺难蚌的。

于是结合一个非常正确的文章(代码逻辑很清晰,但是思路逻辑太巧妙了,感觉很难正向想到):https://m.elecfans.com/article/2260239.html

不知道这两篇谁是原创:https://blog.csdn.net/icxiaoge/article/details/104522982

写了一个直接拿过来用的代码(注意,这里默认每个时钟周期发送一个请求req,testbench的时候要注意):

module scheduler_rr#(
	parameter NUM_REQ = 2
	)(
	  input  wire clk,
	  input  wire rst_n,
	  input  wire [NUM_REQ-1:0]req,
	  output wire [NUM_REQ-1:0]grant             //grant的值,grant_tm的最低有效位
	  
	);


reg  [NUM_REQ-1:0] mask;			//掩码
reg  [NUM_REQ-1:0] r_mask;			//掩码有效值,掩码的反转
reg  [NUM_REQ-1:0] pre_grant;		//锁存上一轮请求的grant
reg  [NUM_REQ-1:0] grant_tm;		//与掩码后,得到的请求,也是grant的前置值

always@(posedge clk or negedge rst_n) pre_grant <= grant;   //锁存上一轮请求的grant

always@(*)begin
	if(!rst_n)begin
		mask   <= {NUM_REQ{1'b1}};
		r_mask <= {NUM_REQ{1'b0}};
	end
	else if(|req)begin
		mask   <= {pre_grant[NUM_REQ-2:0],pre_grant[NUM_REQ-1]}-1'b1;
		r_mask <= ~({pre_grant[NUM_REQ-2:0],pre_grant[NUM_REQ-1]}-1'b1);
	end
	else begin
		mask   <= mask;
		r_mask <= r_mask;
	end
end

always@(*)begin
	if((req&r_mask)!= 0)
		grant_tm <= req & r_mask;
	else
		grant_tm <= req & mask;
end

assign grant = grant_tm&(~grant_tm+1'b1);


endmodule

自取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值