仲裁器电路

要求:

1) 最近处理过的信号源,优先级降为最低

2)优先级顺序:信号源0 > 信号源1 > 信号源2 > 信号源3

第一次实现:

 RTL代码:

module arbiter(
	input en,
	input [3:0] sig_now,
	output reg [3:0] sig_last,
	output reg [3:0] out
);

// sig_now为当前信号源,sig_last为上次处理的信号源情况
// 信号源0对应 sig_now[0]
// 高电平表示信号源被处理


always @(*) begin
	if (en)
		sig_last = 4'b0000;
	else begin
		casez(sig_last)
		4'b0001: begin
			casez (sig_now)
			4'b0001: begin
				out = 4'b0001;
				sig_last = out;   // 1
				end
			4'bzz1z: begin
				out = 4'b0010;
				sig_last = out;   // 8
				end
			4'bz10z: begin
				out = 4'b0100;
				sig_last = out;   // 4
				end
			4'b100z: begin
				out = 4'b1000;
				sig_last = out;   // 2
				end
			4'b0000: begin
				out = 4'b0000;
				sig_last = out;   // 1
				end 
			endcase
		end
		
		4'b0010: begin
			casez(sig_now)
			4'bzzz1: begin
				out = 4'b0001;
				sig_last = out;    // 8
				end
			4'b0010: begin
				out = 4'b0010;
				sig_last = out;    // 1
				end
			4'bz1z0: begin
				out = 4'b0100;
				sig_last = out;    // 4
				end
			4'b10z0: begin
				out = 4'b1000;
				sig_last = out;	   // 2
				end
			4'b0000: begin
				out = 4'b0000;
				sig_last = out;    // 1
				end
			endcase
		end
		
		4'b0100: begin
			casez(sig_now)
			4'bzzz1: begin
				out = 4'b0001;
				sig_last = out;
				end
			4'bzz10: begin
				out = 4'b0010;
				sig_last = out;
				end
			4'b0100: begin
				out = 4'b0100;
				sig_last = out;
				end
			4'b1z00: begin
				out = 4'b1000;
				sig_last = out;
				end
			4'b0000: begin
				out = 4'b0000;
				sig_last = out;
				end
			endcase
		end
			
		4'b1000: begin
			casez(sig_now)
			4'bzzz1: begin
				out = 4'b0001;
				sig_last = out;
				end
			4'bzz10: begin
				out = 4'b0010;
				sig_last = out;
				end
			4'bz100: begin
				out = 4'b0100;
				sig_last = out;
				end
			4'b1000: begin
				out = 4'b1000;
				sig_last = out;
				end
			4'b0000: begin
				out = 4'b0000;
				sig_last = out;
				end
			endcase
		end	
		
		default: begin
			casez(sig_now)
			4'bzzz1: begin
				out = 4'b0001;
				sig_last = out;
				end
			4'bzz10: begin
				out = 4'b0010;
				sig_last = out;
				end
			4'bz100: begin
				out = 4'b0100;
				sig_last = out;
				end
			4'b1000: begin
				out = 4'b1000;
				sig_last = out;
				end
			4'b0000: begin
				out = 4'b0000;
				sig_last = out;
				end
			endcase
		end
		endcase
	end
end


endmodule

TB:

`timescale 1ns/1ns

module arbiter_tb();

reg en;
reg [3:0] sig_now;
wire [3:0] sig_last;
wire [3:0] out;

initial begin
	en = 1'b1;
	# 20 en = 1'b0;
	# 20 sig_now = 4'b0001;
	# 20 sig_now = 4'b0011;
	# 20 sig_now = 4'b0111;
	# 20 sig_now = 4'b1111;
	# 40 $stop;
end

arbiter u1(
	en,
	sig_now,
	sig_last,
	out
);

endmodule

Modelsim仿真:

 图中当前sig_last为下一个sig_now的最近处理情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值